一、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 }