← 返回目录

状态管理

第 147 / 154 卷日期:

useMemo为了防止一种情况——父组件更新,无论是否最子组件操作,子组件都会更新

memo 结合了 PureComponent 纯组件和 componentShouldUpdate 功能,会对传入的props进行一次对比,根据第二个函数返回值判断哪些props需要更新

useMemo和memo类似,都是判断是否满足当前限定条件决定是否执行 callback,useMemo的第二个参数是一个数组,通过这个数组判断是否更新回调函数

好处

  1. 减少不必要循环和渲染
  2. 减少子组件渲染次数
  3. 避免不必要的开销

useCallback

和useMemo 可以说是一模一样,唯一不同的是useMemo返回函数运行结果,而useCallback返回函数

这个函数是父组件传递子组件的一个函数,防止无关刷新,这个组件必须配合 memo,否则可能还会降低性能

useRef

获取当前元素的所有属性,返回一个可变的ref对象,且这个对象只有 current 属性,可设置 initialValue

获取对应属性值

缓存数据

react-redux 源码中,hooks推出后,react-redux用大量的useMemo重做了 Provide 等核心模块,运用了useRef 缓存数据,所运用的useRef() 没有一个是绑定在dom元素上的,都是用于数据缓存

react-redux 利用重新赋值,改变了缓存的数据,减少不必要更新,如果使用userState势必会re-render

总结

  1. 一个优秀的hooks一定具备 useMemo useCallback 等api 优化
  2. 制作自定义hooks遇到传递过来的值,优先考虑使用useRef,再考虑使用useState
  3. 封装时,应该将存放的值放入useRef中

状态管理

Redux

Redux名字的含义是Reducer+Flux,——视图层框架

context“上下文环境”,让一个树状组件上所有的组件都能访问一个共同的对象,context 由其父节点链上所有组件通过 getChildContext() 返回context对象组合而成,因此,通过context 可以访问其父组件链上context

创建一个特殊的react组件,它将是通用的一个context提供者,可以应用在任何一个应用中——Provider!

Provider只是把渲染工作完全交给子组件,只是提供Context包住最顶层组件,context覆盖了整个应用

是context唯一需要,不算是滥用

工作原理

  1. 用户(View)发出 action,使用dispatch
  2. store 自动调用 reducer,传入参数:state 和收到的action,reducer返回新的state
  3. state变化,store调用监听函数,更新 View

异步请求处理

借助 redux 的中间件异步处理

主要有 redux-thunk,redux-saga(常用)

此处主要介绍 redux-saga

优点:

异步解耦,不会掺杂在 action 或 component 中,代码简洁度提高异常处理,可使用 try/catch 捕获异常

功能强大,无需封装或简单封装即可使用灵活,可将saga 串行起来,形成异步 flow

易测性

缺陷:

学习成本高体积略大

功能过剩 yield无法返回 TS 类型

@connect

连接React和Redux

  1. connect通过context获取Provider中的state,通过store.getState()获取store tree上所有state
  2. 将state和action通过 props 的方式传入组件内部,wrapWithConnect 返回一个Component对象connect,

connect重新render 外部传入的元组件 wrapWithConnect,将connect中传入的mapStateToProps, mapDispatchToProps 与组件上原有的props 合并,通过属性的方式传给 WrappedComponent

  1. 监听 state tree 变化。connect缓存了store tree中state的状态,根据state当前和变更前状态比较,确定是否

setState触发connect及re-render

connect的工作

  1. 把store上的状态转化为内层傻瓜组件的prop
  2. 把内层傻瓜组件的用户动作转化为派送给store的动作

@有时候使用Symbol代替字符串表示枚举值更合适,但是有的浏览器不支持

action构造函数返回一个action对象

Redux和Vuex

全站分卷索引 · 154 卷
  1. 1代码随想录知识星球精华(最强八股文)第五版(前端篇))
  2. 2html语义化
  3. 3src 和 href 的区别
  4. 4link 与 @import 的区别
  5. 5iframe
  6. 6CSS
  7. 7伪元素和伪类
  8. 8block,inline,inline-block
  9. 9重排、重绘和合成
  10. 10盒子模型
  11. 11margin 合并
  12. 12margin和padding 的值为百分比时
  13. 13浮动
  14. 14定位
  15. 15CSS选择器
  16. 16CSS选择器优先级
  17. 17选择器权重Specificity
  18. 18CSS属性继承
  19. 19不可/可继承属性
  20. 20display: none与 visibility: hidden的区别
  21. 21background-size
  22. 22client、offset&scroll
  23. 23CSS3新特性
  24. 24flex布局
  25. 25常见布局
  26. 26三栏布局
  27. 27垂直居中
  28. 28水平垂直居中
  29. 29CSS画三角形
  30. 30使chrome支持12px以下文字
  31. 31响应式布局
  32. 32媒体查询
  33. 33过渡与动画
  34. 34JavaScript 动画 和 CSS动画
  35. 35SCSS
  36. 36CSS性能优化
  37. 37有哪些数据类型
  38. 38判断数据类型
  39. 39类型转换
  40. 40parseInt&parseFloat
  41. 41浮点数求和步骤
  42. 42十进制小数转二进制
  43. 430.1+0.2 为什么不等于 0.3
  44. 44undefined 和 undeclared 的区别
  45. 45JavaScript NaN 属性
  46. 46isFinite()&isNaN()
  47. 47数组
  48. 48对原数组有影响
  49. 49对原数组无影响
  50. 50数组去重
  51. 51数组拍平
  52. 52ES6新增的数组方法
  53. 53判断是否存在某个值
  54. 54arguments为啥不是数组
  55. 55对象
  56. 56遍历对象的方法
  57. 57判断对象是否具有属性
  58. 58for in 和 for of 的区别
  59. 59继承方式
  60. 60instanceof
  61. 61深浅拷贝
  62. 62freeze属性
  63. 63函数
  64. 64函数柯里化
  65. 65函数的 length
  66. 66箭头函数和普通函数区别
  67. 67构造函数
  68. 68执行上下文
  69. 69作用域
  70. 70作用域和作用域链
  71. 71闭包和内存泄漏
  72. 72this
  73. 73关于 this 的指向问题
  74. 74改变this指向的方法(bind / call / apply)
  75. 75字符串
  76. 76DOM和事件
  77. 77哪些事件支持冒泡
  78. 78阻止冒泡
  79. 79HTMLCollection、NodeList
  80. 80dom.onclick 和 dom.addEventListener的区别
  81. 81e.target和e.currentTarget
  82. 82页面生命周期
  83. 83异步
  84. 84内存管理GC
  85. 85其它
  86. 86JavaScript 中日期时间格式转换
  87. 87input和object实现双向绑定
  88. 88JSON.stringify()
  89. 89escape、encodeURI&encodeURIComponent
  90. 90移动端滚动穿透和溢出
  91. 91ES6
  92. 92Map字典
  93. 93... 与rest
  94. 94proxy
  95. 95模块化
  96. 96Ajax、Fetch和Axios
  97. 97Webpack
  98. 98浏览器:事件循环
  99. 99浏览器内核
  100. 100浏览器同源策略
  101. 101输入URL回车后发生了什么
  102. 102HTTP
  103. 103HTTP 2.0
  104. 104浏览器存储
  105. 105鉴权
  106. 106Webstorage
  107. 107浏览器执行机制
  108. 108AST 抽象语法树
  109. 109性能优化
  110. 110CSS
  111. 111网络相关
  112. 112使用HTTP2.0
  113. 113图片
  114. 114CDN图片
  115. 115其他文件优化
  116. 116降低APP首页开屏渲染时间
  117. 117页面白屏
  118. 118HTTPS中间人攻击
  119. 119Web Worker
  120. 120Service Worker
  121. 121微前端
  122. 122Vue
  123. 123v-show 和 v-if 的区别
  124. 124双向数据绑定的原理
  125. 125Vue中的插槽使用
  126. 126Vue中的key
  127. 127Vue过滤器
  128. 128Vue中Scoped原理
  129. 129Vue中$nextTick的使用
  130. 130Vue中实现组件通信的方式
  131. 131Vue-router
  132. 132Vue路由传参
  133. 133前端路由
  134. 134Vuex
  135. 135虚拟DOM
  136. 136DIFF 算法
  137. 137Vue3和Vue2有哪些区别
  138. 138说一说你对React的理解
  139. 139React事件机制
  140. 140说一说你对react refs的理解
  141. 141react中key的作用
  142. 142组件开发
  143. 143有状态组件和无状态组件
  144. 144函数式组件和类组件的区别
  145. 145PureComponent&Component
  146. 146常见 Hooks
  147. 147状态管理
  148. 148redux toolkit
  149. 149React18新特性
  150. 150client中的createRoot取代以前的ReactDOM.render
  151. 151Suspense
  152. 152新的Hooks
  153. 153VDom一定更快吗
  154. 154Fiber