React函数式组件值之useContext()和useReducer()

一、useContext

   useContext()的出现,方便了我们在组件之间的状态共享。

 1 import React, { useContext } from "react";
 2 import ReactDOM from "react-dom";
 3 const TestContext= React.createContext({});
 4 const Navbar = () => {
 5   const { username } = useContext(TestContext)
 6   return (
 7     <div className="navbar">
 8       <p>{username}</p>
 9     </div>
10   )
11 }
12 const Messages = () => {
13   const { username } = useContext(TestContext)
14   return (
15     <div className="messages">
16       <p>1 message for {username}</p>
17     </div>
18   )
19 }
20 function App() {
21   return (
22   <TestContext.Provider 
23     value={{
24       username: 'superawesome',
25     }}
26   >
27     <div className="test">
28       <Navbar />
29       <Messages />
30     </div>
31   <TestContext.Provider/>
32   );
33 }
34 const rootElement = document.getElementById("root");
35 ReactDOM.render(<App />, rootElement);

二、useReducer

  useReducer 类似 redux 中的功能,相较于 useState,它更适合一些逻辑较复杂且包含多个子值,或者下一个 state 依赖于之前的 state 等等的特定场景, useReducer 总共有三个参数

  • 第一个参数是 一个 reducer,就是一个函数类似 (state, action) => newState 的函数,传入 上一个 state 和本次的 action
  • 第二个参数是初始 state,也就是默认值,是比较简单的方法
  • 第三个参数是惰性初始化,这么做可以将用于计算 state 的逻辑提取到 reducer 外部,这也为将来对重置 state 的 action 做处理提供了便利
 1 function reducer(state, action) {
 2   switch (action.type) {
 3     case 'increment':
 4       return {count: state.count + 1};
 5     case 'decrement':
 6       return {count: state.count - 1};
 7     default:
 8       throw new Error();
 9   }
10 }
11 function App() {
12   const [state, dispatch] = useReducer(reducer, {count: 0});
13   return (
14     <>
15       点击次数: {state.count}
16       <button onClick={() => dispatch({type: 'increment'})}>+</button>
17       <button onClick={() => dispatch({type: 'decrement'})}>-</button>
18     </>
19   );
20 }

 

原文地址:https://www.cnblogs.com/guanghe/p/14179059.html