在不改变状态、道具或父级的情况下反应子级渲染

Posted

技术标签:

【中文标题】在不改变状态、道具或父级的情况下反应子级渲染【英文标题】:React Child Rerenders without change in State, Props, or Parent 【发布时间】:2021-04-21 10:26:57 【问题描述】:

我正在尝试跟踪子组件中的过度重新渲染。我正在使用 useEffect 挂钩来跟踪道具的变化和状态的变化。像这样:

export default function Child(props) 
  const [user] = useAuthState(firebase.auth());
  const [error, setError] = useState(false);

  useEffect(() => console.log(user, error, props), [user, error, props]);
  console.log('render');

  return (<p>Test</p>);
;

这个日志是什么:

render
userObject: value, false, prop1: value1
render

如果我的状态和道具只改变一次,我无法弄清楚为什么render 被记录了两次。 在this 答案中,它说父组件的重新渲染会触发子组件的重新渲染组件,以及 props 的变化和子状态的变化。我检查了父组件是否呈现了两次(它为子组件获取数据)。 但我只在父组件的第二次渲染时渲染子组件(当数据准备好时)。

export default function Parent 
   const [data, setData] = useState(null);
   useEffect(() => getData(callback: setData), []); //Get data on first render. 

   console.log(data); //Output is null, then prop1: value1

   let returnItem;
   if (data) 
     returnItem = <Child data=data />
    else returnItem = null;

   return (returnItem);

我检查了第一次渲染时返回的项目是null。而且我还检查了父组件只渲染了两次。所以我很确定 Child 应该只在第二次渲染。 有谁知道还有什么可能导致孩子登录render 两次?

【问题讨论】:

你在使用 StrictMode 吗? 是的,我是@RapSherlock 【参考方案1】:

useEffect 中的控制台日志只会在组件挂载后运行。 useEffect 之外的控制台日志也将在安装组件时运行。这就是为什么您在“渲染”控制台日志上得到 2 次打印,而在 useEffect 控制台日志上只有一个。

【讨论】:

以上是关于在不改变状态、道具或父级的情况下反应子级渲染的主要内容,如果未能解决你的问题,请参考以下文章

即使道具没有改变,为啥还要对重新渲染组件做出反应?

反应孩子正在通过道具改变父母状态......我不清楚原因

Firebase:在不知道父级的情况下查询内部子级

在 React 中通过更改父级的道具来更新子组件

在 React-Router 中将状态作为道具从父级传递给子级?

React 父/子状态更改设计问题