【面试题】redux及中间件相关面试题&解析

1、什么是Redux?

Redux就是一个js容器,用于全局的状态管理

2、为什么在React项目中要使用Redux?

因为React本质上就是一个UI库,它是单向数据流的,就是说数据只能从父组件通过props流向子组件,但如果子组件要想修改父组件的值,就只能通过给绑定函数传递参数的形式来修改,一旦项目中数据比较复杂时,这种形式会搞得一团糟,所以需要Redux的协助,帮助其更好的管理项目中复杂的数据问题

3、Redux的三大核心原则?

  • 单一数据源:整个应用的state被存储在reducer中,并且这个reducer只存在于唯一一个store
  • state是只读的:唯一能改变state的就是action,action是一个用于描述已发生事件的对象,通过store中的dispatch方法来发送action,store.dispatch(action)
  • 使用纯函数(reducer)来执行修改:reducer是一个纯函数,它接受先前的state,action,并且返回一个新的state

4、redux核心组成?

  • store:它就是一个将派发的action和reducer函数联系在一起的对象,它有以下常用的API

    const store = createStore(reducer)  // createStore方法是redux提供的
    
     store.getState():获取reducer中返回的state数据;
     store.subscribe():用来注册监听state是否改变;
     store.dispatch():用于发送action,来修改reducer中的state数据;
    
  • reducer:它本身就是一个函数,它接收两个参数,一个是老的state,还有一个是action,它主要就是用于响应发送过来的action,处理完数据后,把最新的state数据返回

    const initState={...}
    export default (state=initState,action)=>{
    	const newState = JSON.parse(JSON.stringfy(state)) ; // 由于reducer不能直接修改state,所以做下深拷贝
    	if(action.type === XXX){
    		.....    // 这块就是针对不同的action type,对数据进行不同的处理,处理完后,将最新处理完后的nesState返回给store
    	}
    	return newState;
    }
    
  • action: 它本质上就是一个简单的js对象,它内部必须要有一个type的属性,用来表示将要执行的动作

5、什么是react-redux?

react-redux是redux官方出的,用于配合react的绑定库,它有两个很重要的成员:Provider、connect;

6、为什么需要redux中间件?

默认情况下,redux只能处理同步数据流。但是实际项目开发中,状态的更新、获取、通常是使用异步操作来实现的。

7、常用的redux中间件有哪些?

  • redux-thunk:主要作用就是可以使action可以变成函数形式,接收两个参数dispatch、getState
  • redux-sage: 主要作用
  • redux-logger:主要作用在控制台打印输出新老state等信息

8、详细说说redux-thunk这个中间件(有什么作用?源码是怎么实现的)?

redux-thunk的作用
就是可以让action变成函数形式,在没用中间件时,dispatch发送的action就是一个普通的包含有type的js对象,如果有了redux-thunk中间件,此时action就可以是函数形式存在,在这个函数中就可以做一些异步请求操作,然后等接口拿到数据后再发送dispatch,去更新最新的数据,函数形式的action接收两个参数dispatch、getState,具体写法如下:

// 中间件函数形式的action
  add = () => {
    store.dispatch((dispatch, getState) => {
      setTimeout(() => {
        dispatch({ type: "add" });
      }, 1000);
    });
  };

thunk中间件具体使用如下:

  1. 下载redux-thunk

    npm i redux-thunk -S
    
  2. 在store中导入redux-thunk

    import thunk from "redux-thunk";
    
  3. 将thunk添加到applyMiddleware函数的参数中

    const store = createStore(reducer, applyMiddleware(thunk));
    
  4. 创建函数形式的action,在函数中执行异步操作

    	add = () => {
    	store.dispatch((dispatch, state) => {
      	console.log(state);
      	setTimeout(() => {
        	dispatch({ type: "add" });
     	 }, 1000);
      });
     };
    

如果不引入thunk中间件,直接使用函数式action时会报错,报错界面如下:
在这里插入图片描述
redux-thunk源码分析:

import type { Action, AnyAction } from 'redux'

import type { ThunkMiddleware } from './types'

export type {
  ThunkAction,
  ThunkDispatch,
  ThunkActionDispatch,
  ThunkMiddleware
} from './types'

function createThunkMiddleware<
  State = any,
  BasicAction extends Action = AnyAction,
  ExtraThunkArg = undefined
>(extraArgument?: ExtraThunkArg) {
  const middleware: ThunkMiddleware<State, BasicAction, ExtraThunkArg> =
    ({ dispatch, getState }) =>
    next =>
    action => {
      if (typeof action === 'function') {
        return action(dispatch, getState, extraArgument)
      }
      return next(action)
    }
  return middleware
}

const thunk = createThunkMiddleware() as ThunkMiddleware & {
  withExtraArgument<
    ExtraThunkArg,
    State = any,
    BasicAction extends Action = AnyAction
  >(
    extraArgument: ExtraThunkArg
  ): ThunkMiddleware<State, BasicAction, ExtraThunkArg>
}

thunk.withExtraArgument = createThunkMiddleware

export default thunk

9、redux中的combineReducers是什么?有什么作用?

他其实就是redux给我们提供的一个函数,可以方便的让我们对多个reducer进行合并,
combineReducers() 接收一个对象,它的值对应不同的 reducer 函数,这些reducer 函数会被合并为一个。然后被引入到 store 中,放到 createStore() 中;

取值时,注意此时总的state是一个多层对象,如果需要器中某个页面(单元)的某个state值,则需要通过state.reducer名.字段名才行;

  • 8
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Redux中,常用的中间件redux-thunk、redux-saga和redux-logger。redux-thunk的主要作用是可以使action可以变成函数形式,接收两个参数dispatch和getState,可以进行异步操作。redux-saga是一个强大的异步处理库,它使用了ES6的Generator函数来处理异步流程,可以更加清晰和可控地管理副作用。redux-logger的主要作用是在控制台打印输出新老state等信息,方便开发调试。这些中间件在开发过程中可以提高代码的可读性和可维护性,使开发者更方便地处理异步操作和调试程序。此外,react-reduxRedux官方提供的用于配合React的绑定库,它提供了Provider和connect这两个重要的成员,可以更方便地在React组件中使用Redux的状态和操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【面试题redux中间件相关面试题&解析](https://blog.csdn.net/Ronychen/article/details/125679270)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [React,Redix面试题](https://blog.csdn.net/qq_48962360/article/details/127098928)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ronychen’s blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值