Comunicação de componentes no React (react18) 06 - redux-toolkit + react-redux

1. Introdução

1.1 redux e react-redux

1.2 Sobre o kit de ferramentas redux

1.2.1 Site oficial

1.2.2 Por que usar o Redux Toolkit?

  • Em primeiro lugar, o que diz o site oficial?
    Insira a descrição da imagem aqui
  • Veja então que createStore foi descontinuado em nosso código, conforme segue:
    Insira a descrição da imagem aqui
    Insira a descrição da imagem aqui

1.3 Instalar o kit de ferramentas Redux

  • O comando de instalação é o seguinte
    npm install @reduxjs/toolkit
    
    yarn add @reduxjs/toolkit
    
  • Se o projeto não tiver instalado o react-redux, você poderá instalar os dois juntos, mas não há necessidade de instalar o redux separadamente react-redux + redux-toolkit.react-redux + redux
    npm install @reduxjs/toolkit react-redux
    
    yarn add @reduxjs/toolkit react-redux
    

1.4 APIs relacionadas ao Redux Toolkit

  • Vamos apresentar brevemente alguns

  • O site oficial está cheio, então acesse o site oficial
    Insira a descrição da imagem aqui

2. Exemplo inicial - exemplo de site oficial

2.1 Criar Loja Redux

  • Importe a API configureStore do Redux Toolkit. Começaremos criando uma loja Redux vazia e exportando-a da seguinte forma:
    import {
          
           configureStore } from '@reduxjs/toolkit';
    
    export default configureStore({
          
          
      reducer: {
          
          
         
      },
    });
    
  • Isso criará uma loja Redux eConfigurar automaticamente extensões Redux DevTools, para que você possa verificar a loja durante o desenvolvimento.

2.2 Fornecer Redux Store para React

  • Apenas mantenha isso inalterado como antes, da seguinte maneira:
    Insira a descrição da imagem aqui

2.3 Criar Fatia de Estado Redux

2.3.1 arquivo counterSlice.js

  • A criação de uma fatia requer um nome de string para identificar a fatia, um valor de estado inicial e uma ou mais funções redutoras que definem como atualizar o estado. Depois de criar a fatia, podemosExporte os criadores de ação Redux gerados e toda a função de redução de fatia
  • do seguinte modo:
    Insira a descrição da imagem aqui

2.3.2 Compare ações e redutores anteriores

  • O método de escrita de ação anterior é o seguinte:
    function incrementOne(){
          
          
        type:'INCREMENT_ONE'
    }
    function incrementNumber(number){
          
          
        type:'INCREMENT_NUMBER',
        number:number
    }
    export default{
          
          incrementOne,incrementNumber}
    
  • A maneira anterior de escrever o redutor é a seguinte
     function countReducer(state = 0,action){
          
          
         switch (action.type) {
          
          
             case 'INCREMENT_ONE':
                 return state + 1;
             case 'INCREMENT_NUMBER':
                 return state + action.number;
             default:
                 return state;
         }
     }
     export default{
          
          countReducer}
    

2.4 Adicionar Redutores de Fatia à Loja

  • Em seguida, precisamos importar a função redutora da fatia do contador e adicioná-la à nossa loja. Ao definir um campo no parâmetro redutores, dizemos ao armazenamento para usar esta função redutora de fatia para lidar com todas as atualizações para este estado.
  • Então, finalmente store.js, da seguinte forma:
    Insira a descrição da imagem aqui

2.5 Usando Redux State e Actions em componentes React

  • Agora podemos usar ganchos React Redux para permitir que os componentes do React interajam com o armazenamento Redux. pudermosUse useSelector para ler dados da loja (não por meio de adereços)e use useDispatchações de expedição.
  • O design dentro do componente é o seguinte:
    Insira a descrição da imagem aqui
    Insira a descrição da imagem aqui

2.6 Renderização

  • mesmo código
    Insira a descrição da imagem aqui

2.7 Efeito

2.7.1 Exibição de efeitos

  • do seguinte modo:
    Insira a descrição da imagem aqui

2.7.2 Descrição

  • Clique nos botões [Click me +1], [Click me -1] e [Add]: a
    ação Redux correspondente será despachada para a loja;
    o redutor de fatia de contagem verá as ações e atualizará seu estado;
    <Counter>o componente irá vê-lo do novo valor de estado armazenado e se renderiza novamente com os novos dados.

2.8 Nota:

  • do seguinte modo:
    Insira a descrição da imagem aqui

2.9 Código anexado

  • contadorSlice.js

    
    import {
          
          createSlice} from '@reduxjs/toolkit'
    
    export const counterSlice = createSlice({
          
          
        name: 'myFirstCounterSlice',  //这个名字随便取  标识
        initialState: {
          
          
            value: 0,  //初始值
        },
        reducers: {
          
            // 对比之前的reducer是一个函数,里面是根据不同的action的type判断的switch语句
            incrementOne: (state) =>{
          
            //下面生成 加 1 的action,等价于原先只有type的action
                state.value += 1;
            },
            decrementOne: (state) =>{
          
            //下面生成 减 1 的action,等价于原先只有type的action
                state.value -= 1;
            },incrementNumber: (state,action) =>{
          
            //等价于不只有type一个参数的action
                state.value += action.payload;  //payload
            }
        }
    });
    
    // 为每个 case reducer 函数生成 Action creators
    export const {
          
          incrementOne,decrementOne,incrementNumber} = counterSlice.actions;
    
    const countReducer = counterSlice.reducer;
    export default countReducer;
    
  • loja.js

    import {
          
           configureStore } from '@reduxjs/toolkit';
    import countReducer from './reducerAndAction/counterSlice';
    
    export default configureStore({
          
          
      reducer: {
          
          
         counterState: countReducer,
      },
    });
    
  • Contador.jsx

    import {
          
          useRef} from "react";
    import {
          
           useDispatch, useSelector } from 'react-redux'
    import {
          
          incrementOne,decrementOne,incrementNumber} from '../redux/reducerAndAction/counterSlice'
    
    
    function Couter(){
          
          
        // console.log(props);
        const numberRef = useRef();
    
        const count = useSelector((state)=>state.counterState.value);
        const dispatch = useDispatch();
    
        //加 1 的
        function addOne(){
          
          
            dispatch(incrementOne());
        }
    
        //动态增加
        function addNumber(){
          
          
            const stringNumber = numberRef.current.value; //直接取取的是字符串
            const number = parseInt(stringNumber);
            const addNumberAction = incrementNumber(number);   //有参数的action
            dispatch(addNumberAction);
        }
    
        return(
            <div>
                当前数值是:{
          
          count}  <br />
                <button onClick={
          
          addOne}>点我+1</button>  &nbsp;&nbsp;
    
                <button onClick={
          
          ()=>dispatch(decrementOne())}>点我-1</button>
    
                <br /><br />
                <input type="number" ref={
          
          numberRef} placeholder="请输入要加的数"/>  &nbsp;&nbsp;
                <button onClick={
          
          addNumber}>加数</button>
            </div>
        )
    }
    
    export default Couter;
    

3. Exemplo 2 – Pequeno exemplo prático

3.1 Adicione outro componente Dog

3.1.1 Escrevendo dogSlice

  • do seguinte modo:
    Insira a descrição da imagem aqui

3.1.2 Modificar store.js

  • do seguinte modo:
    Insira a descrição da imagem aqui

3.1.3 Escrevendo componente de cachorro

  • Por uma questão de conveniência, a adição é escrita de forma simples. Se necessário, você mesmo pode otimizá-la, da seguinte forma:
    Insira a descrição da imagem aqui

3.1.4 Efeito

  • do seguinte modo:
    Insira a descrição da imagem aqui

3.2 Esse compartilhamento de dados é muito simples, certo?

3.2.1 Experimente o compartilhamento de dados

  • Tente acessá-lo diretamente, o código é o seguinte:
    Insira a descrição da imagem aqui
  • Realmente funciona. Isso é muito mais simples que redux + react-redux. O efeito é o seguinte
    Insira a descrição da imagem aqui

3.2.2 compartilhamento de dados react-redux + redux

4. Sobre carga útil - carga útil

  • Em relação a state.value += action.payload; //payload, aqui está um exemplo: se você ainda usa o redux original, a ação também pode ser escrita da seguinte forma:
    Insira a descrição da imagem aqui
  • Para outro exemplo, você pode escrever a função de criação de ação de "Adicionar um item de tarefa" assim:
    var id = 1
    function addTodo(content) {
          
          
      return {
          
          
        type: 'ADD_TODO',
        payload: {
          
          
          id: id++,
          content: content, // 待办事项内容
          completed: false  // 是否完成的标识
        }
      }
    }
    
  • Pode-se entender action.payloadpor que é usado desta forma. Por uma questão de padronização, não importa quais parâmetros você passe, números ou objetos, é a mesma coisa. Será melhor action.payloadentendido se você observar nosso exemplo acima, como segue:
    Insira a descrição da imagem aqui

5. Código do projeto

5.1 Diretório de códigos

  • do seguinte modo:
    Insira a descrição da imagem aqui

5.2 Baixar projeto

Acho que você gosta

Origin blog.csdn.net/suixinfeixiangfei/article/details/133149967
Recomendado
Clasificación