老师

来源:3-12 自定义 hook 第三部分 - 正确的方式完成 URLLoader

慕侠4287760

2020-10-27

老师我发现,如果使用hook,怎么去避免其他组件的渲染呢,类似 SCU 这样的

比如这里

图片描述
这里其实更新了state的 loading, 和data

然后我在hello组件里面发现 theme 被打印了两次,应该就是因为其他组件修改,然后这个组件也被渲染了,有什么方法可以避免呢?

图片描述

谢谢老师,我是ract 初学者,在vue里面只会更新对应的组件,而react似乎更新整个组件树,这个底层原因又是什么呢,为什么要这么做再次感谢

写回答

1回答

张轩

2020-10-28

同学你好 react 更新组件默认有三种情况 第一属性改变 第二内部状态state改变 第三父组件更新(这里属于第三种情况,虽然Hello 都props 和 state 都没有更新),在 class 类型的 React 组件中,我们有 shouldComponentUpdate 和 PureComponent 帮我们完成 props 的对比和判断,在 hooks 中,我们可以使用 React.memo 来完成这个任务。https://zh-hans.reactjs.org/docs/hooks-faq.html#how-do-i-implement-shouldcomponentupdate

你可以这样修改一下你的代码 

import React, { useContext, memo } from 'react'

const Hello: React.FC<IHelloProps> = memo((props) => {
 ...
})

再试一下 会发现这个打印就消失了

结论就是 React.memo 等效于 PureComponent,它会帮你多做一件事情,比较新的props和旧的props,假如没有变化,就不更新这个组件

0
2
ywang04
老师 memo本身也要消耗性能 我们在什么情况下才会考虑到使用它并且忽略它自身的性能损耗?谢谢
2021-01-07
共2条回复

React18+TS高仿AntD从零到一打造组件库

设计,开发,测试,发布再到 CI/CD,从0到1造轮子

2136 学习 · 959 问题

查看课程