将UI组件抽象为状态处理机。分为普通状态和副作用状态。

一、综述

useState:处理函数只改变引用的状态本身;
副作用状态:会对引用状态以外的状态和变量进行修改;
useReducer:用解藕化的机制进行计算状态维护;

二、useState

useState:flux化管理的模块状态(本模块持有)
const [user, setUser] = React.useState({});
const [loading, setLoading] = React.useState(false);
const { user, loading } = useFetchUser(props.visible);

三、useEffect

useEffect:会对引用状态以外的状态和变量进行修改

提示: 使用多个 Effect 实现关注点分离

使用 Hook 其中一个目的就是要解决 class 中生命周期函数经常包含不相关的逻辑,但又把相关逻辑分离到了几个不同方法中的问题。

function useFetchUser(visible) {
React.useEffect(() => {}, [visible]);
}

function RandomUserModal(props) {
React.useEffect(() => {setLoading(true);}, [props.visible]);
}

在函数组件主体内(这里指在 React 渲染阶段)改变 DOM、添加订阅、设置定时器、记录日志以及执行其他包含副作用的操作都是不被允许的,因为这可能会产生莫名其妙的 bug 并破坏 UI 的一致性。
使用 useEffect 完成副作用操作。赋值给 useEffect 的函数会在组件渲染到屏幕之后执行。你可以把 effect 看作从 React 的纯函数式世界通往命令式世界的逃生通道。
默认情况下,effect 将在每轮渲染结束后执行,但你可以选择让它 在只有某些值改变的时候 才执行。

讲一个处理函数和一个观察状态绑定,状态发生变化时,执行处理函数;
虽然 useEffect 会在浏览器绘制后延迟执行,但会保证在任何新的渲染前执行。React 将在组件更新前刷新上一轮渲染的 effect。

四、useContext:

全局引用的用户状态;

sharedConfigs;

四、useLayoutEffect

dom渲染前调整布局的回掉;

layoutsubviews;

五、状态盒子

讲组件看成是一个状态盒子:
1、对自身的状态进行管理;
2、对外部输入的副作用状态进行响应;

https://segmentfault.com/a/1190000017182184

六、useReducer

useState 的替代方案。它接收一个形如 (state, action) => newState 的 reducer,并返回当前的 state 以及与其配套的 dispatch 方法。(如果你熟悉 Redux 的话,就已经知道它如何工作了。)
在某些场景下,useReducer 会比 useState 更适用,例如 state 逻辑较复杂且包含多个子值,或者下一个 state 依赖于之前的 state 等。并且,使用 useReducer 还能给那些会触发深更新的组件做性能优化,因为你可以向子组件传递 dispatch 而不是回调函数 。

const initialState = {count: 0};

function reducer(state, action) {
switch (action.type) {
case 'increment':
return {count: state.count + 1};
case 'decrement':
return {count: state.count - 1};
default:
throw new Error();
}
}

function Counter() {
const [state, dispatch] = useReducer(reducer, initialState);
return (
<>
Count: {state.count}
<button onClick={() => dispatch({type: 'increment'})}>+</button>
<button onClick={() => dispatch({type: 'decrement'})}>-</button>
</>
);
}

最新文章

  1. [转]vim编辑器---批量注释与反注释
  2. MUI - Dialog 提示窗
  3. eclipse 打开是报错&quot;reload maven project has encountered a problem&quot;
  4. 《.NET简单企业应用》技术路线
  5. Java并发编程专题
  6. 转换字符串格式,可用于sql in
  7. C++从多n个数中选取m个数的组合
  8. 单页web应用开发流程
  9. Jquery CSS 与 Attr
  10. App.config自定义节点读取
  11. 使用MaxCompute Java SDK 执行任务卡住了,怎么办?
  12. asp.net mvc Html.BeginForm()及Html.Action用法
  13. Win10安装和配置JDK
  14. 003-RFC关于媒体类型说明
  15. html网页什么样的字体最好看,css设置各种中文字体样式代码
  16. Codeforces 235C Cyclical Quest - 后缀自动机
  17. shell学习(一)
  18. Docker图形界面管理之Shipyard
  19. C++ Primer 5th 第14章 重载运算与类型转换
  20. 新浪的wap网站,发现原来我们的head存在着这样的差异

热门文章

  1. TP5配置隐藏入口index.php文件
  2. 『树上匹配 树形dp』
  3. Java 8——Lambda表达式
  4. Elasticsearch常见用法-入门
  5. 小结 python 实战中遇到的几种需要化名的情境
  6. Windows 查看端口占用进程并关闭
  7. C语言----流程图(基础篇四)
  8. Google Chrome 浏览器JS无法更新解决办法
  9. Python语言控制运算的优先级
  10. 深圳宝安图书馆官网错误 HTTP Status 500 - Servlet.init() for servlet spring threw exception