React でのコンポーネント通信 (react18) 06 - redux-toolkit + accept-redux

1 はじめに

1.1 reduxとreact-redux

1.2 redux-toolkitについて

1.2.1 公式ウェブサイト

1.2.2 Redux ツールキットを使用する理由

  • まず、公式サイトには何と書いてあるでしょうか?
    ここに画像の説明を挿入します
  • 次に、次のように、コード内で createStore が非推奨になっていることがわかります。
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します

1.3 Redux ツールキットのインストール

  • インストールコマンドは以下の通り
    npm install @reduxjs/toolkit
    
    yarn add @reduxjs/toolkit
    
  • プロジェクトにreact-reduxがインストールされていない場合は、両方を一緒にインストールできますが、reduxを個別にインストールする必要はありませんreact-redux + redux-toolkitreact-redux + redux
    npm install @reduxjs/toolkit react-redux
    
    yarn add @reduxjs/toolkit react-redux
    

1.4 Redux Toolkit 関連の API

  • いくつか簡単に紹介しましょう

  • 公式サイトが充実しているので公式サイトへ
    ここに画像の説明を挿入します

2. 起動例 - 公式サイトの例

2.1 Reduxストアの作成

  • Redux Toolkit から configureStore API をインポートします。まず空の Redux ストアを作成し、次のようにエクスポートします。
    import {
          
           configureStore } from '@reduxjs/toolkit';
    
    export default configureStore({
          
          
      reducer: {
          
          
         
      },
    });
    
  • これにより Redux ストアが作成され、Redux DevTools 拡張機能を自動的に構成する, 開発中にストアを確認できるようにします。

2.2 React 用の Redux ストアの提供

  • 次のように、これを以前と同じように変更しないでください。
    ここに画像の説明を挿入します

2.3 Redux ステート スライスの作成

2.3.1 counterSlice.js ファイル

  • スライスを作成するには、スライスを識別する文字列名、初期状態値、および状態の更新方法を定義する 1 つ以上のリデューサー関数が必要です。スライスを作成した後、次のことができます。生成された Redux アクション クリエーターとスライス リデューサー関数全体をエクスポートします。
  • 次のように:
    ここに画像の説明を挿入します

2.3.2 以前のアクションとリデューサーを比較する

  • 前回のアクションの記述方法は次のとおりです。
    function incrementOne(){
          
          
        type:'INCREMENT_ONE'
    }
    function incrementNumber(number){
          
          
        type:'INCREMENT_NUMBER',
        number:number
    }
    export default{
          
          incrementOne,incrementNumber}
    
  • 前回のreducerの書き方は以下の通りです
     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 スライス レデューサーをストアに追加する

  • 次に、reducer 関数をカウンタースライスからインポートし、ストアに追加する必要があります。Reducers パラメーターのフィールドを定義することで、このスライス リデューサー関数を使用してこの状態へのすべての更新を処理するようにストアに指示します。
  • したがってstore.js、最終的には次のようになります。
    ここに画像の説明を挿入します

2.5 React コンポーネントでの Redux ステートとアクションの使用

  • これで、React Redux フックを使用して、React コンポーネントが Redux ストアと対話できるようになります。我々はできるuseSelector を使用してストアからデータを読み取ります (props 経由ではありません)。useDispatchディスパッチアクションを使用します。
  • コンポーネント内の設計は次のとおりです。
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します

2.6 レンダリング

  • 同じコード
    ここに画像の説明を挿入します

2.7 効果

2.7.1 エフェクト表示

  • 次のように:
    ここに画像の説明を挿入します

2.7.2 説明

  • [Click me +1]、[Click me -1]、および [Add] ボタンをクリックすると、
    対応する Redux アクションがストアにディスパッチされ、
    カウンティング スライス リデューサーがアクションを確認してその状態を更新し、
    <Counter>コンポーネントがそれを確認します。ストアの新しい状態値から取得し、新しいデータを使用して自身を再レンダリングします。

2.8 注:

  • 次のように:
    ここに画像の説明を挿入します

2.9 付属コード

  • counterSlice.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;
    
  • ストア.js

    import {
          
           configureStore } from '@reduxjs/toolkit';
    import countReducer from './reducerAndAction/counterSlice';
    
    export default configureStore({
          
          
      reducer: {
          
          
         counterState: countReducer,
      },
    });
    
  • Counter.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. 例 2 - 小さな実践例

3.1 別の Dog コンポーネントを追加する

3.1.1 DogSlice の記述

  • 次のように:
    ここに画像の説明を挿入します

3.1.2 store.jsを変更する

  • 次のように:
    ここに画像の説明を挿入します

3.1.3 ドッグコンポーネントの記述

  • 便宜上、単純に足し算を書いていますが、必要に応じて、次のように自分で最適化することができます。
    ここに画像の説明を挿入します

3.1.4 効果

  • 次のように:
    ここに画像の説明を挿入します

3.2 このデータ共有は単純すぎますね?

3.2.1 データ共有を試す

  • 直接アクセスしてみてください。コードは次のとおりです。
    ここに画像の説明を挿入します
  • これは実際に機能します。これは Redux + React-redux よりもはるかに簡単です。効果は次のとおりです。
    ここに画像の説明を挿入します

3.2.2 React-redux + redux データ共有

4. ペイロードについて - ペイロード

  • についてstate.value += action.payload; //payloadは、例を示しますが、元の Redux をまだ使用している場合は、アクションを次のように記述することもできます。
    ここに画像の説明を挿入します
  • 別の例として、「To-Do アイテムを追加する」というアクション作成関数を次のように記述できます。
    var id = 1
    function addTodo(content) {
          
          
      return {
          
          
        type: 'ADD_TODO',
        payload: {
          
          
          id: id++,
          content: content, // 待办事项内容
          completed: false  // 是否完成的标识
        }
      }
    }
    
  • このように使用される理由は理解できますaction.payload。標準化のため、数値やオブジェクトなど、どのパラメータを渡しても同じです。次のような上記の例を見ると、よりよく理解できるでしょうaction.payload
    ここに画像の説明を挿入します

5. プロジェクトコード

5.1 コードディレクトリ

  • 次のように:
    ここに画像の説明を挿入します

5.2 プロジェクトのダウンロード

おすすめ

転載: blog.csdn.net/suixinfeixiangfei/article/details/133149967