通過上節課的學習,用useContext
實現了Redux狀態共享的能力,這節課看一下如何使用useReducer
來實現業務邏輯的控制。需要注意的是這節課的內容是接着上節課的,需要你把上節課的代碼部分完成,才可以繼續學習。如果不學習我相信有可能你會聽不懂。
在color.js中添加Reducer
顏色(state)管理的代碼我們都放在了color.js
中,所以在文件里添加一個reducer,用於處理顏色更新的邏輯。先聲明一個reducer的函數,它就是JavaScript中的普通函數,在講useReducer
的時候已經詳細講過了。有了reducer后,在Color組件里使用useReducer
,這樣Color組件就有了那個共享狀態和處理業務邏輯的能力,跟以前使用的Redux
幾乎一樣了。之后修改一下共享狀態。我們來看代碼:
import React, { createContext,useReducer } from 'react'; export const ColorContext = createContext({}) export const UPDATE_COLOR = "UPDATE_COLOR" const reducer= (state,action)=>{ switch(action.type){ case UPDATE_COLOR: return action.color default: return state } } export const Color = props=>{ const [color,dispatch]=useReducer(reducer,'blue') return ( <ColorContext.Provider value={{color,dispatch}}> {props.children} </ColorContext.Provider> ) }
注意,這時候我們共享出去的狀態變成了color和dispatch,如果不共享出去dispatch,你是沒辦法完成按鈕的相應事件的。
通過dispatch修改狀態
目前程序已經有了處理共享狀態的業務邏輯能力,接下來就可以在buttons.js
使用dispatch
來完成按鈕的相應操作了。先引入useContext
、ColorContext
和UPDATE_COLOR
,然后寫onClick
事件就可以了。代碼如下:
import React ,{useContext} from 'react'; import {ColorContext,UPDATE_COLOR} from './color' function Buttons(){ const { dispatch } = useContext(ColorContext) return ( <div> <button onClick={()=>{dispatch({type:UPDATE_COLOR,color:"red"})}}>紅色</button> <button onClick={()=>{dispatch({type:UPDATE_COLOR,color:"yellow"})}}>黃色</button> </div> ) } export default Buttons
這樣代碼就編寫完成了,用useContext
和useReducer
實現了Redux的效果,這個代碼編寫過程比Redux要簡單,但是也是有一定難度的。希望第一次接觸的小伙伴能自己動手寫5遍以上,把這種模式掌握好。
轉自:https://jspang.com/posts/2019/08/12/react-hooks.html