学习React (4) 状态管理

148 阅读3分钟

状态管理是 React 应用开发中的一个重要部分,尤其是在涉及到多个组件间共享状态时。以下是三种常见的状态管理方式及其基本概念和用法:

1. Context API

Context API 是 React 内置的一种在组件树中传递数据的方法,避免了通过每个层级手动传递 props 的问题。它适用于需要跨越多层组件共享的全局数据,如当前认证用户、主题或首选语言。

使用步骤:

  1. 创建 Context

    import React from 'react';
    
    const MyContext = React.createContext(defaultValue);
    
  2. 提供 Context: 使用 Context.Provider 提供上下文值。

    import React, { useState } from 'react';
    import MyContext from './MyContext';
    
    function App() {
      const [value, setValue] = useState('some value');
    
      return (
        <MyContext.Provider value={value}>
          <ChildComponent />
        </MyContext.Provider>
      );
    }
    
  3. 消费 Context: 使用 useContext Hook 或 Context.Consumer 组件消费上下文值。

    import React, { useContext } from 'react';
    import MyContext from './MyContext';
    
    function ChildComponent() {
      const value = useContext(MyContext);
      return <div>{value}</div>;
    }
    

2. Redux

Redux 是一个流行的状态管理库,主要用于大型应用。它将应用状态存储在一个全局对象中,并通过定义明确的规则(actions 和 reducers)来管理状态变化。

基本概念:

  • Store:保存应用的状态树。
  • Action:一个描述状态变化的普通对象。
  • Reducer:一个函数,接收当前状态和 action,返回新的状态。
  • Dispatch:触发 action 改变状态。

使用步骤:

  1. 安装 Redux 和 React-Redux

    npm install redux react-redux
    
  2. 创建 Action

    // actions.js
    export const increment = () => ({
      type: 'INCREMENT'
    });
    
    export const decrement = () => ({
      type: 'DECREMENT'
    });
    
  3. 创建 Reducer

    // reducers.js
    const initialState = { count: 0 };
    
    function counter(state = initialState, action) {
      switch (action.type) {
        case 'INCREMENT':
          return { count: state.count + 1 };
        case 'DECREMENT':
          return { count: state.count - 1 };
        default:
          return state;
      }
    }
    
    export default counter;
    
  4. 创建 Store

    // store.js
    import { createStore } from 'redux';
    import counter from './reducers';
    
    const store = createStore(counter);
    
    export default store;
    
  5. 提供 Store

    // App.js
    import React from 'react';
    import { Provider } from 'react-redux';
    import store from './store';
    import Counter from './Counter';
    
    function App() {
      return (
        <Provider store={store}>
          <Counter />
        </Provider>
      );
    }
    
    export default App;
    
  6. 连接组件: 使用 useSelectoruseDispatch 与 Redux store 交互。

    // Counter.js
    import React from 'react';
    import { useSelector, useDispatch } from 'react-redux';
    import { increment, decrement } from './actions';
    
    function Counter() {
      const count = useSelector(state => state.count);
      const dispatch = useDispatch();
    
      return (
        <div>
          <p>{count}</p>
          <button onClick={() => dispatch(increment())}>+</button>
          <button onClick={() => dispatch(decrement())}>-</button>
        </div>
      );
    }
    
    export default Counter;
    

3. MobX

MobX 是另一种状态管理工具,强调透明的响应式编程。它使用可观察状态和自动追踪的反应来简化状态管理。

基本概念:

  • Observable State:被监控的状态。
  • Actions:修改状态的方法。
  • Computed Values:基于状态计算出来的值。
  • Reactions:根据状态变化自动执行的副作用。

使用步骤:

  1. 安装 MobX 和 MobX React

    npm install mobx mobx-react-lite
    
  2. 创建 Observable State

    // store.js
    import { makeAutoObservable } from 'mobx';
    
    class CounterStore {
      count = 0;
    
      constructor() {
        makeAutoObservable(this);
      }
    
      increment() {
        this.count++;
      }
    
      decrement() {
        this.count--;
      }
    }
    
    const store = new CounterStore();
    export default store;
    
  3. 提供 Store: 使用 React Context 提供 MobX store。

    // App.js
    import React from 'react';
    import { observer } from 'mobx-react-lite';
    import store from './store';
    import Counter from './Counter';
    
    const StoreContext = React.createContext(store);
    
    function App() {
      return (
        <StoreContext.Provider value={store}>
          <Counter />
        </StoreContext.Provider>
      );
    }
    
    export default App;
    
  4. 连接组件: 使用 observer 将组件变成响应式。

    // Counter.js
    import React, { useContext } from 'react';
    import { observer } from 'mobx-react-lite';
    import store from './store';
    
    const Counter = observer(() => {
      const store = useContext(StoreContext);
    
      return (
        <div>
          <p>{store.count}</p>
          <button onClick={() => store.increment()}>+</button>
          <button onClick={() => store.decrement()}>-</button>
        </div>
      );
    });
    
    export default Counter;
    

通过这三种状态管理工具,你可以根据应用的需求和复杂度选择合适的解决方案。Context API 适用于简单的全局状态共享,Redux 用于复杂的状态逻辑和大型应用,而 MobX 提供了一种响应式的状态管理方式。