美文网首页
Hooks - useReducer 代替 redux

Hooks - useReducer 代替 redux

作者: bestCindy | 来源:发表于2021-01-23 14:32 被阅读0次

    我们用 useReducer 来模拟 redux

    首先我们要实现一个组件,这个组件可以通过点击 button 来控制文字的颜色

    ShowArea.js

    import React from 'react';
    
    function ShowArea() {
        return (
            <div style={{color: green}}>This is a paragraph of green text</div>
        )
    }
    
    export default ShowArea;
    

    Buttons.js

    import React from 'react';
    
    function Buttons() {
        return (
            <div>
                <button>Blue</button>
                <button>Green</button>
            </div>
        )
    }
    
    export default Buttons;
    

    现在页面上是这样的:

    现在文字颜色是不变的,在 ShowArea 中需要拿到 color 值

    组件中传值,需要用到 useContext

    我门给 ButtonsShowArea 创建一个 parent 组件 Color

    在 parent 组件 Color 中需要 create 一个 context

    Color.js

    export const ColorContext = createContext({});
    
    function Color(props) {
        return (
            <ColorContext.Provider value={{color: "green"}}>
                 {props.children}
            </ColorContext.Provider>
        )
    }
    

    在子组件 ShowArea 中需要 use context

    ShowArea.js

    function ShowArea() {
        const { color } = useContext(ColorContext);
    
        return (
            <p style={{ color: color }}>This is a paragraph of green text</p>
        )
    }
    
    

    在点击 button 的时候需要设置 color,也就是需要 state 的一个转换

    这时候需要用到 useReducer,然后将 action 传递给子组件 Buttons

    export const ColorContext = createContext({});
    
    export const UPDATE_STATE = "UPDATE_STATE";
    
    const reducer = (state, action) => {
        if (action.type === UPDATE_STATE) {
            return action.color;
        }
        return state;
    }
    
    function Color(props) {
        const [color, dispatch] = useReducer(reducer, "yellow");
        return (
            <ColorContext.Provider value={{color, dispatch}}>
                 {props.children}
            </ColorContext.Provider>
        )
    }
    

    子组件 Buttons 里面拿到 dispatch,也就是 dispatch

    然后通过 dispatch 做一个状态的转换

    function Buttons() {
        const { dispatch } = useContext(ColorContext)
        return (
            <div>
                <p><button onClick={() => { dispatch({ type: UPDATE_STATE, color: "blue" }) }}>Blue</button></p>
                <p><button onClick={() => { dispatch({ type: UPDATE_STATE, color: "green" })}}>Green</button></p>
            </div>
        )
    }
    

    Reducer 的功能是做状态转换,然后返回一个更新的状态,和一个状态转换的函数

    做状态转换的逻辑是在 Buttons 里面,所以 Buttons 需要状态转换函数 dispatch

    状态显示的部分在 ShowAreas 里面,所以 ShowAreas 需要每次更新的 state 也就是 color

    我们需要一个 parent component 将 colordispatch 传递给子组件 ButtonsShowAreas,这个 parent component 就是 Color

    所以,在 Color 里面通过 useReducer 拿到所需要的变量,然后通过 useContext 传递变量值,这个功能就实现了

    相关文章

      网友评论

          本文标题:Hooks - useReducer 代替 redux

          本文链接:https://www.haomeiwen.com/subject/btbyzktx.html