美文网首页
Hooks进阶

Hooks进阶

作者: hellomyshadow | 来源:发表于2021-11-30 20:25 被阅读0次

    React.memo、useMemo、useCallback 的区别

    • React.memo 是对传入的 props 进行前比较,只有 props 中的值变化了,才会更新被包裹的子组件,当然,它还可以接收第二个参数,用于自定义比较的过程。
      // 自定义比较过程:prevProps上一次的props,nextProps本次的props
      const isEqual = (prevProps, nextProps) => {
          if (prevProps.number !== nextProps.number) {
              return false;
          }
          return true;
      }
      export default React.memo((props = {}) => {
          return (<p>number is : {props.number}</p>);
      }, isEqual)
      
    • 从细粒度上来说,React.memo 是组件级别的;而 useMemo 的细粒度更小,它缓存的是值,只有当第二个参数数组的元素发生变化时,才会重新计算函数,返回一个新的值,当然,这个值也可能是一个新的组件;
      export default (props = {}) => {
          return useMemo(() => {
              return (<p>number is : {props.number}</p>)
          // 监听 props 中的某个属性,只有这个属性发生变化时,才重新执行函数,缓存一个新的值
          }, [props.number])
      }
      
    • useMemo 缓存的是一个函数,它常常与 React.memo 配合使用。这是因为,当父组件重新渲染时,绑定在子组件上的函数会重新创建,这就意味着子组件的 props 发生了变化,React.memo 也跟着渲染包裹的子组件。
      // App.jsx
      export default function App() {
          const [count, setCount] = useState(0);
      
          const handleClickButton = useCallback(() => {
              setCount(count + 1);
          }, [count]);
      
          return (<Button onClickButton={handleClickButton}>Button</Button>);
      }
      
      // Button.jsx
      const Button = ({ onClickButton, children }) => {
          return (
              <>
                  <button onClick={onClickButton}>{children}</button>
              </>
          );
      };
      export default React.memo(Button)
      

    相关文章

      网友评论

          本文标题:Hooks进阶

          本文链接:https://www.haomeiwen.com/subject/nftjxrtx.html