面试 React 框架八股文十问十答第九期

面试 React 框架八股文十问十答第九期

作者:程序员小白条,个人博客

相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!

⭐点赞⭐收藏⭐不迷路!⭐

1)Redux 中异步的请求怎么处理

在Redux中,处理异步请求通常使用中间件来实现。常见的中间件有redux-thunkredux-saga等。以下是使用redux-thunk的简单示例:

// 安装redux-thunk: npm install redux-thunk

// 创建异步action
const fetchData = () => {
  return (dispatch) => {
    dispatch(requestData()); // 发起请求前的action

    // 异步请求
    api.fetchData()
      .then(data => dispatch(receiveData(data))) // 请求成功后的action
      .catch(error => dispatch(requestError(error))); // 请求失败后的action
  };
};

// 创建reducer处理对应的action
const dataReducer = (state = initialState, action) => {
  switch (action.type) {
    case REQUEST_DATA:
      return { ...state, loading: true };
    case RECEIVE_DATA:
      return { ...state, loading: false, data: action.payload };
    case REQUEST_ERROR:
      return { ...state, loading: false, error: action.payload };
    default:
      return state;
  }
};

2)Redux 怎么实现属性传递,介绍下原理

在React中,通过connect函数将组件连接到Redux store,实现属性传递。connect接受两个参数:mapStateToPropsmapDispatchToProps,分别用于将Redux store的状态映射到组件的属性和将dispatch方法映射到组件的属性。

import { connect } from 'react-redux';

const MyComponent = ({ data, fetchData }) => {
  // 使用从Redux传递的属性
  // 调用fetchData将触发相应的Redux action
};

const mapStateToProps = state => ({
  data: state.data,
});

const mapDispatchToProps = dispatch => ({
  fetchData: () => dispatch(fetchData()),
});

export default connect(mapStateToProps, mapDispatchToProps)(MyComponent);

3)Redux 中间件是什么?接受几个参数?柯里化函数两端的参数具体是什么?

Redux中间件是Redux action被发起到达reducer之间的扩展点,可以用于处理异步操作、日志记录等。中间件是一个函数,接受一个参数 store,返回一个函数,该函数接受 nextaction 两个参数。

const middleware = store => next => action => {
  // 中间件逻辑
  next(action); // 调用下一个中间件或者reducer
};

4)Redux 请求中间件如何处理并发

Redux中间件如redux-thunk通常通过闭包来处理异步操作。对于并发请求,可以使用async/awaitPromise.all来管理多个请求的执行。

const fetchData = () => {
  return async (dispatch) => {
    dispatch(requestData());

    try {
      const data1 = await api.fetchData1();
      dispatch(receiveData1(data1));

      const data2 = await api.fetchData2();
      dispatch(receiveData2(data2));
    } catch (error) {
      dispatch(requestError(error));
    }
  };
};

5)Redux 状态管理器和变量挂载到 window 中有什么区别

  • Redux状态管理器:
    • Redux提供了一个单一的全局状态管理器,用于存储整个应用的状态。
    • 状态是通过reducer函数来管理的,通过dispatch触发action来更新状态。
    • 订阅机制允许组件监听状态的变化,并在状态更新时得到通知。
  • 变量挂载到window:
    • 直接将变量挂载到window对象上是一种全局变量的简单方式。
    • 变量在整个应用中都是可访问的,但缺乏状态管理机制。
    • 不同部分的代码可能直接修改这些变量,导致潜在的命名冲突和不可预测的状态变化。

区别:

  • Redux提供了一种更有组织和可控的方式来管理应用状态,而不是简单地将变量挂载到全局对象上。
  • Redux提供了一种清晰的数据流,可预测性强,适用于大型应用,而直接挂载变量到window对象可能导致难以维护的全局状态。
  • 使用Redux可以更好地组织代码,通过规定的方式处理状态更新,而不是依赖于全局变量。

6)mobox 和 redux 有什么区别?

  • MobX:
    • MobX是一个状态管理库,它通过观察和反应的机制实现了响应式数据。
    • 使用简单,语法较为自然,不需要特定的actions或reducers。
    • 可以更灵活地组织和管理状态。
  • Redux:
    • Redux是一个状态容器,它强调单一不可变状态,通过纯函数的方式管理状态的变化。
    • 有明确的action、reducer和store概念,提供了严格的状态管理规范。
    • 更适用于大型应用,通过中间件可以处理异步逻辑。

区别:

  • MobX更灵活,语法较为简单,适合中小型应用。
  • Redux提供了明确的规范,适合大型应用,但相对而言语法相对复杂。

7)Redux 和 Vuex 有什么区别,它们的共同思想

  • Redux:
    • Redux是为React设计的状态管理库,但可以用于任何JavaScript应用。
    • 强调单一不可变状态,通过action、reducer和store的概念来管理状态。
    • 使用中间件来处理异步逻辑。
  • Vuex:
    • Vuex是为Vue.js设计的状态管理库。
    • 与Redux类似,有state、mutations、actions和getters的概念。
    • 提供了对Vue组件的深度集成。

共同思想:

  • 单一不可变状态:Redux和Vuex都强调应用状态的单一来源和不可变性,通过触发action来改变状态。
  • Action和Reducer:两者都使用action来描述状态的改变,并通过纯函数的reducer来处理这些改变。
  • 组件和状态分离:共同倡导将组件与状态逻辑分离,使应用更容易测试和维护。

8)Redux 中间件是怎么拿到store 和 action? 然后怎么处理?

Redux中间件是一个函数,它接受store的getState方法和dispatch方法,然后返回一个函数,该函数接受nextaction,并进行处理。在处理中间件的过程中,可以访问当前的store状态和action对象。

const middleware = store => next => action => {
  // 访问store状态
  const currentState = store.getState();

  // 访问action对象
  console.log('Action:', action);

  // 处理逻辑
  // ...

  // 调用下一个中间件或reducer
  next(action);
};

9)Redux中的connect有什么作用

connectreact-redux库提供的一个函数,用于连接React组件与Redux store,将state和action传递给组件。其主要作用有:

  • 将组件连接到Redux store: 通过connect,可以将React组件连接到Redux store,使组件能够访问Redux中的状态。
  • 映射state到组件属性: 使用mapStateToProps参数,可以将Redux store中的状态映射到组件的属性,使组件能够读取状态。
  • 映射dispatch到组件属性: 使用mapDispatchToProps参数,可以将Redux store中的dispatch方法映射到组件的属性,使组件能够触发Redux action。
import { connect } from 'react-redux';

const MyComponent = ({ data, fetchData }) => {
  // 使用从Redux传递的属性
};

const mapStateToProps = state => ({
  data: state.data,
});

const mapDispatchToProps = dispatch => ({
  fetchData: () => dispatch(fetchData()),
});

export default connect(mapStateToProps, mapDispatchToProps)(MyComponent);

10)对 React Hook 的理解,它的实现原理是什么

React Hooks是React 16.8版本引入的一项特性,它允许在函数组件中使用状态(state)和生命周期等特性,而无需编写类组件。

核心Hooks:

  1. useState: 用于在函数组件中添加状态。
  2. useEffect: 用于处理副作用,替代类组件中的componentDidMountcomponentDidUpdatecomponentWillUnmount生命周期。
  3. useContext: 用于访问React上下文。
  4. useReducer: 用于管理复杂的状态逻辑。
  5. useCallbackuseMemo: 用于性能优化,避免不必要的渲染。

实现原理:

  • React Hooks利用Fiber架构的特性,通过调度器实现了状态的保存和更新。
  • 在函数组件中,每次渲染时都会重新执行函数体,Hooks通过调度器将每个Hook的状态和对应的更新函数保存在Fiber节点中。
  • 调度器负责在组件更新时,找到对应的Fiber节点,并将保存的状态值取出来,实现状态的保持和更新。

React Hooks的实现原理涉及Fiber架构的复杂性,但它为函数组件提供了类似类组件的状态管理和生命周期特性,使得函数组件的编写更加灵活和清晰。

开源项目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system

已 300 + Star!

⭐点赞⭐收藏⭐不迷路!⭐

你可能感兴趣的:(React,八股文学习,面试,react.js,职场和发展,javascript,八股文,前端,前端框架)