【问题标题】:Using redux with react hooks使用带有反应钩子的 redux
【发布时间】:2019-03-27 22:40:41
【问题描述】:

我正在尝试找出将 redux 与 react hooks 结合使用的最佳方法。我看到了以下内容

How to use React hooks + Redux

但是我不相信这是最好的方法。有没有人有其他的想法?

我还看到了以下内容,看起来还不错。 https://www.npmjs.com/package/redux-react-hook

谢谢

【问题讨论】:

标签: javascript redux react-redux react-hooks


【解决方案1】:

官方的react-redux 包从 v7.1 开始提供钩子。可以使用 Redux 钩子代替 connect(mapStateToProps, mapDispatchToProps) 函数。

useSelector()

使用选择器函数从 Redux 存储状态中提取数据。

useDispatch()

返回对可用于调度操作的调度的引用。

这是一个实现计数器的示例,其中计数器值由 Redux 管理。

import React from 'react'
import { useDispatch, useSelector } from 'react-redux'

export const CounterComponent = () => {
  const dispatch = useDispatch();
  const counter = useSelector(state => state.counter);

  return (
    <div>
      <span>{counter}</span>
      <button onClick={() => dispatch({ type: 'INCREMENT_COUNTER' })}>
        Increment counter
      </button>
    </div>
  );
}

来源:https://react-redux.js.org/api/hooks

【讨论】:

    【解决方案2】:

    作为 redux 的替代方案,您可以使用 hooks 来管理状态,您可以使用 context api 和自定义 hooks 的组合来创建类似

    const initialState = {
        stateSet: false,
        plan: {
        }
    }
    const AppReducer = (state = initialState, action) => {
        return {
            plan: planReducer(state.plan, action)
        }
    }
    
    
    
    const AppProvider = (props) => {
    
        const [state, dispatch] = useReducer(AppReducer, initialState);
        return (
            <AppStateContext.Provider value={state}>
                <AppDispatchContext.Provider value={dispatch}>
                    {props.children}
    
                </AppDispatchContext.Provider>
            </AppStateContext.Provider>
        )
    
    
    }
    
    const useAppState = () => {
        const context = React.useContext(AppStateContext);
        return context;
    }
    
    
    const useAppDispatch = () => {
        const context = React.useContext(AppDispatchContext);
        return context;
    }

    然后在你的组件中,你可以使用任何组件

    const { plan } = useAppState();
     dispatch({ type: 'updateBusinessInfo', payload: { businessInfo: businessInfo, addOnsInfo: addOnsInfo } });
    

    详情请参阅https://kentcdodds.com/blog/how-to-use-react-context-effectivelykencdoods 的精彩帖子

    【讨论】:

      【解决方案3】:

      在撰写本文时,它仍处于 alpha 阶段,如果您想尝试它,请将您的 react-redux 更新到 v7.1.0-alpha.4。

      https://react-redux.js.org/next/api/hooks#hooks

      【讨论】:

        【解决方案4】:

        以下是如何通过 3 个简单的步骤将 Redux 与 Hooks 一起使用:反例。

        源代码:https://github.com/trackmystories/Redux-hooks-counter-app-with-axios.

        注意:https://react-redux.js.org/introduction/getting-started

        第 1 步:

        创建一个 reducer.js 文件,定义和组合你的 reducer:

        reducer.js

            import { combineReducers } from "redux";
        
         
            const counter = (state = 0, action) => {
              switch (action.type) {
                case "ADD":
                  return state + 1;
                case "SUBTRACT":
                  return state - 1;
                default:
                  return state;
              }
            };
            
          const rootReducer = combineReducers({
            counter
            // additional reducers ...
        });
        
        export default rootReducer;

        第 2 步

        创建一个计数器组件,它将访问状态并将其呈现给视图:

        注意:请参阅“Redux 术语和概念”以更好地了解操作、状态和视图。 https://redux.js.org/tutorials/essentials/part-1-overview-concepts

        您不需要使用带有 redux 钩子的 connect mapStateToProps 和 dispatchStateToProps 而是使用 { useDispatch, useSelector }。

        我们可以直接在按钮内部传递“ADD”和“SUBTRACT”操作,无需定义action.js文件。

        CounterComponent.js

        import React from "react";
        import { useDispatch, useSelector } from "react-redux";
        
        export default function CounterComponent() {
          const dispatch = useDispatch(); // dispatct action "ADD","SUBTRACT".
          const counter = useSelector((state) => state.counter); // your apps state.
          
            return (
            <div>
             // dispatch "SUBTRACT"
             <button onClick={() => dispatch({ type: "SUBTRACT",})}>
                 SUBTRACT
              <button>
        
                // pass the current state 
                <text> display count : {counter}</text> 
        
        
               // dispatch "ADD"
               <button onClick={() => dispatch({ type: "ADD",})}>
                  ADD
               <button>
        
              </div>
             )
             
            } 

        第 3 步:

        最后将您的 RootReducer 链接到 createStore 并将其传递给 Provider。

        App.js

        import React from 'react';
        import { Provider } from "react-redux";
        import { createStore } from "redux";
        
        import CounterComponent from './CounterComponent.jsx';
        
        
         
        // import your reducers
        import rootReducer from "./reducers"; 
        
        
        // link your reducers to the store 
        const store = createStore(rootReducer); 
        
        
        
        // Pass your store to the Provider wrapping your Component. 
        
        export default function App() {
          return (
             <>
              <Provider store={store}> 
                <CounterComponent/>
              </Provider>
            </>
          );
        };

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-30
          • 2021-05-07
          • 1970-01-01
          • 2019-04-19
          • 2021-10-04
          相关资源
          最近更新 更多