Usememo简介
React.memo()是一个高阶函数,它与 React.PureComponent类似,是一个函数组件而非一个类。 React.memo()可接受2个参数,第一个参数为纯函数的组件,第二个参数用于对比props控制是否刷新,与shouldComponentUpdate()功能类似
//parent.jsximport React, { useState} from "react";import Child from "../Child"const Index = () => {const [count,setCount] = useState(0);return (<div><div>数量为{count}</div><button onClick={()=>{setCount(count+1)}}>点我加1</button><Child count={count}></Child></div>)}export default Index
没有useMemo的问题
//案例存在的问题:每点击一次按钮,会重新渲染一次时间,但是每一次点击按钮的时候,父组件给子组件传递的都是相同的obj对象,为什么子组件还是会刷新呢?//原因是每一次点击按钮的时候,会重新刷新父组件,父组件中的obj会重新被实例化,所以新实例化的obj和上一次实例化的obj不是同一个对象
import React,{useState} from 'react'import Child from "./Childs"const Parent=()=>{const [count,setCount]=useState(0);const obj={name:'zhangsan'}return (<div><div>数量为:{count}</div><button onClick={()=>{setCount(count+1)}}>点我加一</button>{/* 点击按钮改变的是count,向子组件传递的是obj,此时的obj没有发生变化,但是子组件也发生了页面渲染 */}<Child obj={obj}> </Child></div>)}export default Parent
//修改前的child.jsx,这里修改count,这个子组件会发生渲染const Child=(props)=>{const date=new Date()return <div>{date.toLocaleString()}</div>}export default Child//修改后的jsx,这里修改count,这个子组件不会发生渲染import React,{memo} from "react"const Child=memo((props)=>{const date=new Date()return <div>{date.toLocaleString()}</div>},(prev,next)=>{return prev.obj!==next.obj})export default Child
useMemo的作用
useMemo可以用来缓存一些变量,并指定哪些条件变化后重新计算缓存的变量。
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
useMemo第一个参数是一个 factory 函数,该函数的返回结果会通过useMemo缓存下来第二个参数是factory函数的依赖(deps),当依赖(deps)改变时才重新执行 factory 函数,memoizedValue 才会被重新计算
