有了useState
和useEffect
已經可以實現大部分的業務邏輯了,但是React Hooks
中還是有很多好用的Hooks
函數的,比如useContext
和useReducer
。
在用類聲明組件時,父子組件的傳值是通過組件屬性和props
進行的,那現在使用方法(Function)來聲明組件,已經沒有了constructor
構造函數也就沒有了props的接收,那父子組件的傳值就成了一個問題。React Hooks
為我們准備了useContext
。這節課就學習一下useContext
,它可以幫助我們跨越組件層級直接傳遞變量,實現共享。需要注意的是useContext
和redux
的作用是不同的,一個解決的是組件之間值傳遞的問題,一個是應用中統一管理狀態的問題,但通過和useReducer
的配合使用,可以實現類似Redux
的作用。
這就好比玩游戲時有很多英雄,英雄的最總目的都是贏得比賽,但是作用不同,有負責輸出的,有負責抗傷害的,有負責治療的。
Context
的作用就是對它所包含的組件樹提供全局共享數據的一種技術。
createContext 函數創建context
直接在src
目錄下新建一個文件Example4.js
,然后拷貝Example.js
里的代碼,並進行修改,刪除路由部分和副作用的代碼,只留計數器的核心代碼就可以了。
import React, { useState , useEffect } from 'react'; function Example4(){ const [ count , setCount ] = useState(0); return ( <div> <p>You clicked {count} times</p> <button onClick={()=>{setCount(count+1)}}>click me</button> </div> ) } export default Example4;
然后修改一下index.js
讓它渲染這個Example4.js
組件,修改的代碼如下。
import React from 'react'; import ReactDOM from 'react-dom'; import Example from './Example4' ReactDOM.render(<Example />, document.getElementById('root'));
之后在Example4.js
中引入createContext
函數,並使用得到一個組件,然后在return
方法中進行使用。先看代碼,然后我再解釋。
import React, { useState , createContext } from 'react'; //===關鍵代碼 const CountContext = createContext() function Example4(){ const [ count , setCount ] = useState(0); return ( <div> <p>You clicked {count} times</p> <button onClick={()=>{setCount(count+1)}}>click me</button> {/*======關鍵代碼 */} <CountContext.Provider value={count}> </CountContext.Provider> </div> ) } export default Example4;
這段代碼就相當於把count
變量允許跨層級實現傳遞和使用了(也就是實現了上下文),當父組件的count
變量發生變化時,子組件也會發生變化。接下來我們就看看一個React Hooks
的組件如何接收到這個變量。
useContext 接收上下文變量
已經有了上下文變量,剩下的就時如何接收了,接收這個直接使用useContext就可以,但是在使用前需要新進行引入useContext
(不引入是沒辦法使用的)。
import React, { useState , createContext , useContext } from 'react';
引入后寫一個Counter
組件,只是顯示上下文中的count
變量代碼如下:
function Counter(){ const count = useContext(CountContext) //一句話就可以得到count return (<h2>{count}</h2>) }
得到后就可以顯示出來了,但是要記得在<CountContext.Provider>
的閉合標簽中,代碼如下。
<CountContext.Provider value={count}> <Counter /> </CountContext.Provider>
其實useContext
的用法比以前時簡單很多,既然簡單,就沒必要講解的那么難,希望小伙伴這節課都能get到知識點,完善自己的知識體系。
轉自:https://jspang.com/posts/2019/08/12/react-hooks.html