07-React高阶组件

1. 什么是高阶组件?

高阶组件(HOC)是 React 中用于复用组件逻辑的一种高级技巧。HOC 自身不是 React API 的一部分,它是一种基于 React 的组合特性而形成的设计模式。

具体而言,高阶组件是参数为组件,返回值为新组件的函数。

2. React.memo

React.memo为高阶组件。

  • 不使用memo时
    当父组件更新的时候,子组件也会更新,即使这个子组件不需要更新。例如子组件不接受props时,或者接受的props相同渲染结果相同,这种情况下子组件就不需要重新渲染,但事实上子组件依然会渲染

  • 使用memo时

子组件不接受props时,或者接受的props相同渲染结果相同,这种情况下子组件就不会重新渲染

  • memo作用
    用React.memo包一下子组件。通过记忆组件渲染结果的方式提高性能。在这种情况下,React将跳过渲染组件的操作并直接复用最近一次渲染的结果
import {memo} from 'react'
const Child = ()=>{}
export default memo(Child)

3. React.useMemo

React.useMemo和React.memo不是一回事。React.memo是高阶组件,而React.useMemo是React中的Hook,返回一个记忆的缓存值。把创建函数和依赖项数组作为参数传入useMemo,他仅会在依赖项变化时才会重新计算缓存的值。通俗理解就是useMemo返回一个缓存的变量,只有当依赖项改变时,useMemo返回值才会变。

4. React.useCallback

useMemo缓存的是一个对象,而useCallback缓存的是一个函数。
使用memo后,当props没有改变时,子组件不会重新渲染,但如果子组件接受的有父组件传入的方法,因为父组件重新渲染时,会重新创建函数,所以传入子组件的也是不同的函数地址,同样也会触发子组件渲染,使用useCallback后,缓存函数。

5. 案例

export default function App() {
  const [list, setlist] = useState([23, 56, 78])

  
  // useMemo缓存对象
  const result = React.useMemo(() => {
    console.log('result一次');
    let arr = []
    arr =  list.filter(item => item > 60)
    return arr.map((item,index)=><li key={index}>{item}</li>)
  },[list])

  //useCallback缓存函数
  const changeCity = useCallback(()=>{
    setcity(Math.random())
  },[city])

  return (
    <div>
      <ul>
        {result}
      </ul>

      <hr />
      <button onClick={()=>setcolor(Math.random())}>改变color</button>
      <Child changeCity={changeCity}></Child>
    </div>
  )
}

6. 状态设置相同值,会重复渲染一次

比如 const [color,setColor] = useState(“red”), 第一次把color改为’black’,会触发组件渲染, 第二次把color重复修改为"black",组件会再次渲染,但第三次把color重复修改为"black",组件不再渲染

触发组件渲染, 第二次把color重复修改为"black",组件会再次渲染,但第三次把color重复修改为"black",组件不再渲染

原因: React的运行机制是,color从’red’改为’black’触发一次渲染, color从"black"改为"black", React需要再次渲染后和第一次结果比对,验证两次的相等性,确定"black"改为"black"组件渲染后结果相同。 之后再改为"black", 组件就不再渲染了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值