Skip to content

Redux

1. 什么是 Redux?它的核心概念是什么?

答案:Redux 是一个用于 JavaScript 应用的可预测状态容器。它通常与 React 一起使用,但也可以与任何其他视图库一起使用。

Redux 的核心概念包括:

  1. Store:保存整个应用状态的对象。
  2. Action:描述发生了什么的普通 JavaScript 对象。
  3. Reducer:指定应用状态如何变化的函数。
  4. Dispatch:将 action 发送到 store 的方法。

2. Redux 的三大原则是什么?

答案:Redux 的三大原则是:

  1. 单一数据源:整个应用的状态存储在单个 store 中的对象树里。
  2. 状态是只读的:改变状态的唯一方法是触发一个 action。
  3. 使用纯函数来执行修改:为了描述 action 如何改变状态树,你需要编写 reducers。

3. 什么是 Redux 中的 Action?如何创建一个 Action?

答案:Action 是一个普通的 JavaScript 对象,用来描述发生了什么。它必须有一个 type 属性来指示正在执行的 action 的类型。

创建 Action 的示例:

javascript
const ADD_TODO = 'ADD_TODO';

function addTodo(text) {
  return {
    type: ADD_TODO,
    payload: text
  }
}

// 使用
dispatch(addTodo('Build my first Redux app'));

4. 什么是 Redux 中的 Reducer?如何编写一个 Reducer?

答案:Reducer 是一个纯函数,它接收先前的状态和一个 action,然后返回新的状态。

编写 Reducer 的示例:

javascript
const initialState = {
  todos: []
};

function todoReducer(state = initialState, action) {
  switch (action.type) {
    case 'ADD_TODO':
      return {
        ...state,
        todos: [...state.todos, action.payload]
      };
    default:
      return state;
  }
}

5. 什么是 Redux 中的 Store?如何创建一个 Store?

答案:Store 是把 action 和 reducer 联系到一起的对象。Store 有以下职责:

  • 保存应用的状态
  • 允许通过 getState() 访问状态
  • 允许通过 dispatch(action) 更新状态
  • 通过 subscribe(listener) 注册监听器

创建 Store 的示例:

javascript
import { createStore } from 'redux';
import rootReducer from './reducers';

const store = createStore(rootReducer);

6. 什么是 Redux 中间件?它有什么用途?

答案:Redux 中间件提供的是位于 action 被发起之后,到达 reducer 之前的扩展点。你可以利用 Redux 中间件来进行日志记录、创建崩溃报告、调用异步接口或者路由等等。

常见的 Redux 中间件包括:

  • redux-thunk:用于处理异步 action
  • redux-saga:用于更复杂的异步操作
  • redux-logger:用于日志记录

使用中间件的示例:

javascript
import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import rootReducer from './reducers';

const store = createStore(
  rootReducer,
  applyMiddleware(thunk)
);

7. 什么是 Redux Thunk?它如何处理异步操作?

答案:Redux Thunk 是一个允许你编写返回函数而不是 action 的 action 创建函数的中间件。thunk 可以用来延迟 action 的分发,或者在满足某些条件时才分发。

使用 Redux Thunk 处理异步操作的示例:

javascript
function fetchData() {
  return function(dispatch) {
    dispatch({ type: 'FETCH_DATA_REQUEST' });
    return fetch('https://api.example.com/data')
      .then(response => response.json())
      .then(data => dispatch({ type: 'FETCH_DATA_SUCCESS', payload: data }))
      .catch(error => dispatch({ type: 'FETCH_DATA_FAILURE', error }));
  }
}

// 使用
dispatch(fetchData());

8. 如何在 React 组件中使用 Redux?

答案:在 React 组件中使用 Redux 通常需要以下步骤:

  1. 使用 react-redux 库的 Provider 组件包裹根组件。
  2. 使用 connect 函数或 hooks(如 useSelectoruseDispatch)连接组件和 Redux store。

示例:

jsx
import { Provider } from 'react-redux';
import { useSelector, useDispatch } from 'react-redux';
import store from './store';

function App() {
  return (
    <Provider store={store}>
      <MyComponent />
    </Provider>
  );
}

function MyComponent() {
  const count = useSelector(state => state.count);
  const dispatch = useDispatch();

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => dispatch({ type: 'INCREMENT' })}>Increment</button>
    </div>
  );
}

9. 什么是 Redux 的 combineReducers 函数?它有什么用途?

答案combineReducers 是 Redux 提供的一个工具函数,用于将多个 reducer 函数合并成一个 reducer。这在管理大型应用的复杂状态时特别有用。

使用 combineReducers 的示例:

javascript
import { combineReducers } from 'redux';

function todosReducer(state = [], action) {
  // ...
}

function visibilityFilterReducer(state = 'SHOW_ALL', action) {
  // ...
}

const rootReducer = combineReducers({
  todos: todosReducer,
  visibilityFilter: visibilityFilterReducer
});

export default rootReducer;

10. 什么是 Redux Toolkit?它如何简化 Redux 的使用?

答案:Redux Toolkit 是官方推荐的编写 Redux 逻辑的方法。它旨在成为编写 Redux 逻辑的标准方式,简化了大多数 Redux 任务,防止了常见错误,并使编写 Redux 应用程序更加容易。

Redux Toolkit 简化 Redux 使用的方式:

  1. 配置 store 变得更简单(通过 configureStore
  2. 减少样板代码(通过 createSlice
  3. 内置了 immer 库,可以直接修改状态
  4. 默认包含了有用的中间件
  5. 内置了 Redux Thunk 用于异步操作

使用 Redux Toolkit 的示例:

javascript
import { createSlice, configureStore } from '@reduxjs/toolkit';

const counterSlice = createSlice({
  name: 'counter',
  initialState: { value: 0 },
  reducers: {
    increment: state => {
      state.value += 1;
    },
    decrement: state => {
      state.value -= 1;
    }
  }
});

export const { increment, decrement } = counterSlice.actions;

const store = configureStore({
  reducer: counterSlice.reducer
});

export default store;

这种方法大大简化了 Redux 的使用,减少了需要编写的代码量,并提供了更好的开发体验。