【问题标题】:Problem with rendering object prop sent to child component渲染对象道具发送到子组件的问题
【发布时间】:2021-12-27 09:55:19
【问题描述】:

问题是:每次单击按钮时,我都会在控制台中看到“按钮渲染”。但我只想看一次这个帖子 问题是:每次单击按钮时,我都会在控制台中看到“按钮渲染”。但我只想看一次这篇文章

import React, { useState, useCallback } from "react";
    import Button from "./Button";
    
    const UseCallback = () => {
      const [count, setCount] = useState(0);
    
      const handleClick = useCallback(() => {
        setCount((prevState) => prevState + 1);
      }, []);
    
      return (
        <div>
          <p>{count}</p>
          <Button
            deneme={{ aaa: "aaa", bbb: "bbb" }}
            handleClick={handleClick}
          ></Button>
        </div>
      );
    };
    
 export default UseCallback;


   
    import React from "react";
    
    const Button = ({ handleClick }) => {
      console.log("Button - rerender");
      return (
        <div>
          <button onClick={handleClick}>Sayacı artır</button>
        </div>
      );
    };
    
    export default React.memo(Button);

【问题讨论】:

    标签: javascript reactjs react-hooks react-props usecallback


    【解决方案1】:

    因此,您唯一缺少的就是传递一个 compareFunction,它将告诉React.Memo 何时重新渲染组件的确切条件。您可以在此处查看您的代码。 https://codesandbox.io/s/romantic-cherry-bv5y0?file=/src/App.js

    import "./styles.css";
    
    import React, { useState, useCallback } from "react";
    
    const Button1 = ({ handleClick }) => {
      console.log("Button - rerender");
      return (
        <div>
          <button onClick={handleClick}>Sayacı artır</button>
        </div>
      );
    };
    
    const compareFunction = (prevProps, nextProps) => {
      return true; //As props only have a function which we are sure doesn't change.
    };
    
    const Button = React.memo(Button1, compareFunction);
    
    const UseCallback = () => {
      const [count, setCount] = useState(0);
    
      const handleClick = useCallback(() => {
        setCount((prevState) => prevState + 1);
      }, []);
    
      return (
        <div>
          <p>{count}</p>
          <Button
            deneme={{ aaa: "aaa", bbb: "bbb" }}
            handleClick={handleClick}
          ></Button>
        </div>
      );
    };
    
    export default UseCallback;
    

    【讨论】:

      【解决方案2】:

      假设重新渲染,因为回调在渲染时发生变化,并且您在每次渲染时将新的对象引用传递给按钮。您已经拥有React.memo,但由于每次重新渲染按钮时都有一个新的对象引用。

      尝试在useMemo 中包装对象以保持相同的引用或在顶部创建一个变量并将其传递给deneme prop

      const UseCallback = () => {
        const [count, setCount] = useState(0);
      
        const handleClick = useCallback(() => {
          setCount((prevState) => prevState + 1);
        }, []);
        const deneme = useMemo(() => {
          return { aaa: "aaa", bbb: "bbb" };
        }, []);
        return (
          <div>
            <p>{count}</p>
            <Button deneme={deneme} handleClick={handleClick}></Button>
          </div>
        );
      };
      

      const deneme = {
        aaa: "aaa",
        bbb: "bbb"
      };
      const UseCallback = () => {
        const [count, setCount] = useState(0);
      
        const handleClick = useCallback(() => {
          setCount((prevState) => prevState + 1);
        }, []);
        return (
          <div>
            <p>{count}</p>
            <Button handleClick={handleClick}></Button>
          </div>
        );
      };
      
      

      【讨论】:

      • 感谢您的回复。这个答案解决了我的问题。
      猜你喜欢
      • 2020-07-27
      • 2020-01-21
      • 2021-02-03
      • 2021-07-22
      • 2020-07-29
      • 1970-01-01
      • 2021-04-23
      • 2021-07-06
      • 2018-04-21
      相关资源
      最近更新 更多