zoukankan      html  css  js  c++  java
  • React Hooks的memo和useCallback

    import React, { useState } from 'react';
    
    const Child = (props) => {
      console.log(props, 'child-props');
      return <input type="number" />;
    };
    
    const Parent = () => {
      const [count, setCount] = useState(0);
    
      return (
        <div>
          <div>count: {count}</div>
          <button onClick={() => setCount(count + 1)}>+1</button>
          <Child />
        </div>
      );
    };
    
    export default Parent;

    每次父组件中点+1按钮都会触发子组件log(即子组件渲染),因为按钮触发了父组件重新渲染

    import React, { useState, memo } from 'react';
    
    const Child = memo((props) => {
      console.log(props, 'child-props');
      return <input type="number" />;
    });
    
    const Parent = () => {
      const [count, setCount] = useState(0);
    
      return (
        <div>
          <div>count: {count}</div>
          <button onClick={() => setCount(count + 1)}>+1</button>
          <Child />
        </div>
      );
    };
    
    export default Parent;

    使用memo包装子组件,父组件的重新渲染不会带着子组件一起渲染,因为子组件不依赖父组件任何props,所以此处点击+1按钮不会触发子组件log

    import React, { useState, memo } from 'react';
    
    const Child = memo((props) => {
      console.log(props, 'child-props');
      return <input type="number" />;
    });
    
    const Parent = () => {
      const [count, setCount] = useState(0);
    
      const onchange = (e) => {
        setCount(e.target.value);
      };
    
      return (
        <div>
          <div>count: {count}</div>
          <button onClick={() => setCount(count + 1)}>+1</button>
          <Child change={onchange} />
        </div>
      );
    };
    
    export default Parent;

    此处父组件重新渲染,onchange函数会重新生成,新生成的函数会导致子组件重新渲染,所以此处点击+1按钮会触发子组件log。

    import React, { useState, memo, useCallback } from 'react';
    
    const Child = memo((props) => {
      console.log(props, 'child-props');
      return <input type="number" onChange={props.change} />;
    });
    
    const Parent = () => {
      const [count, setCount] = useState(0);
    
      const onchange = useCallback((e) => {
        setCount(e.target.value);
      }, []);
    
      return (
        <div>
          <div>count: {count}</div>
          <button onClick={() => setCount(count + 1)}>+1</button>
          <Child change={onchange} />
        </div>
      );
    };
    
    export default Parent;

    使用useCallback包装函数,会缓存了每次渲染时 inline callback 的实例,不会每次都重新生成进而造成依赖组件重新渲染。所以此处点击+1按钮不会触发子组件log

  • 相关阅读:
    删除代码中的空行
    Amazon Payment Amazon Flexible Payments Service (Amazon FPS) 示例代码的一个bug提醒
    一个关于SqlServer 中根据概率获取数据的sql 写法
    linq 排序 List<T>类型数据
    OpenSmtp附件中文名显示问题
    体积网格生成浏览器
    有关Lemek's algo中,除了Initial Ray外Second Ray是不可能出现(W0,W1,W2,。。。Z0均严格>0)的证明
    Shape Match 的方法效果极差 气死我了
    所谓“中国学生数学NB”的神话
    基于tetrahedron的柔体
  • 原文地址:https://www.cnblogs.com/shi2310/p/15475795.html
Copyright © 2011-2022 走看看