React 状态管理

状态管理是 React 应用开发中的一个重要话题,尤其是在构建较复杂的应用时。以下是关于状态管理的一些关键点,包括 Redux 和 React Query 的介绍。

4. 状态管理

4.1 Redux(可选)

Redux 是一个流行的状态管理库,用于管理 JavaScript 应用中的状态。Redux 的核心思想是将应用的所有状态存储在一个单一的、不可变的“store”中,并通过“actions”和“reducers”来更新状态。

  1. Redux 基础

    • Store:存储应用的状态。可以使用 createStore 函数创建一个 store。

      import { createStore } from 'redux';
      
      const store = createStore(reducer);
      
    • Action:描述发生的事件。通常是一个普通的 JavaScript 对象。

      const increment = () => ({
        type: 'INCREMENT'
      });
      
    • Reducer:处理 actions 并返回新的状态。Reducer 是一个纯函数,它接受当前的状态和 action,然后返回新的状态。

      const counter = (state = 0, action) => {
        switch (action.type) {
          case 'INCREMENT':
            return state + 1;
          default:
            return state;
        }
      };
      
    • Dispatch:用于发送 actions 来更新状态。

      store.dispatch(increment());
      
    • 连接 React 和 Redux

      使用 react-redux 库将 Redux store 与 React 组件连接起来:

      npm install react-redux
      
      import React from 'react';
      import { Provider, connect } from 'react-redux';
      import { createStore } from 'redux';
      
      const store = createStore(counter);
      
      function Counter({ count, increment }) {
        return (
          <div>
            <p>Count: {count}</p>
            <button onClick={increment}>Increment</button>
          </div>
        );
      }
      
      const mapStateToProps = (state) => ({
        count: state
      });
      
      const mapDispatchToProps = (dispatch) => ({
        increment: () => dispatch(increment())
      });
      
      const ConnectedCounter = connect(mapStateToProps, mapDispatchToProps)(Counter);
      
      function App() {
        return (
          <Provider store={store}>
            <ConnectedCounter />
          </Provider>
        );
      }
      
      export default App;
      
  2. Redux Toolkit

    Redux Toolkit 是官方推荐的工具集,简化了 Redux 的使用,提供了更好的开发体验。

    • 创建 Slice

      import { createSlice, configureStore } from '@reduxjs/toolkit';
      
      const counterSlice = createSlice({
        name: 'counter',
        initialState: 0,
        reducers: {
          increment: (state) => state + 1
        }
      });
      
      const store = configureStore({
        reducer: counterSlice.reducer
      });
      
      export const { increment } = counterSlice.actions;
      export default store;
      
    • 连接 React 和 Redux Toolkit

      import React from 'react';
      import { Provider, useDispatch, useSelector } from 'react-redux';
      import store, { increment } from './store';
      
      function Counter() {
        const count = useSelector((state) => state);
        const dispatch = useDispatch();
      
        return (
          <div>
            <p>Count: {count}</p>
            <button onClick={() => dispatch(increment())}>Increment</button>
          </div>
        );
      }
      
      function App() {
        return (
          <Provider store={store}>
            <Counter />
          </Provider>
        );
      }
      
      export default App;
      
4.2 React Query(可选)

React Query 是一个用于数据获取、缓存和同步的库,它使得与服务器交互变得更加简单和高效。

  1. 安装 React Query

    npm install react-query
    
  2. 基本用法

    • 创建 Query Client

      import { QueryClient, QueryClientProvider } from 'react-query';
      
      const queryClient = new QueryClient();
      
    • 使用 useQuery

      import React from 'react';
      import { useQuery } from 'react-query';
      
      function fetchTodos() {
        return fetch('https://jsonplaceholder.typicode.com/todos')
          .then((res) => res.json());
      }
      
      function Todos() {
        const { data, error, isLoading } = useQuery('todos', fetchTodos);
      
        if (isLoading) return <div>Loading...</div>;
        if (error) return <div>An error occurred: {error.message}</div>;
      
        return (
          <ul>
            {data.map(todo => (
              <li key={todo.id}>{todo.title}</li>
            ))}
          </ul>
        );
      }
      
      function App() {
        return (
          <QueryClientProvider client={queryClient}>
            <Todos />
          </QueryClientProvider>
        );
      }
      
      export default App;
      
    • 使用 useMutation

      useMutation 用于处理创建、更新和删除数据的操作。

      import React from 'react';
      import { useMutation } from 'react-query';
      
      function createTodo(newTodo) {
        return fetch('https://jsonplaceholder.typicode.com/todos', {
          method: 'POST',
          body: JSON.stringify(newTodo),
          headers: {
            'Content-Type': 'application/json'
          }
        }).then((res) => res.json());
      }
      
      function AddTodo() {
        const mutation = useMutation(createTodo);
      
        const handleSubmit = (event) => {
          event.preventDefault();
          const newTodo = { title: event.target.elements.title.value };
          mutation.mutate(newTodo);
        };
      
        return (
          <form onSubmit={handleSubmit}>
            <input name="title" placeholder="Todo title" />
            <button type="submit">Add Todo</button>
            {mutation.isLoading ? (
              'Adding...'
            ) : (
              mutation.isError ? (
                `Error: ${mutation.error.message}`
              ) : (
                mutation.isSuccess ? 'Todo added!' : null
              )
            )}
          </form>
        );
      }
      
      function App() {
        return (
          <QueryClientProvider client={queryClient}>
            <AddTodo />
          </QueryClientProvider>
        );
      }
      
      export default App;
      

这些状态管理技术将帮助你有效地管理 React 应用中的状态。Redux 和 React Query 各有其适用场景,Redux 适用于复杂的应用状态管理,而 React Query 主要用于数据获取和缓存。根据你的应用需求选择适合的工具。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

跳房子的前端

你的打赏能让我更有力地创造

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

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

打赏作者

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

抵扣说明:

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

余额充值