【问题标题】:re render a react component only when the state change仅在状态更改时重新渲染反应组件
【发布时间】:2020-05-01 20:36:45
【问题描述】:

你好,我是 react 和 Firebase 的新手,我想了解为什么这个组件会不断重新渲染。 基本上我想要做的是获取数据并显示它并继续监听更改并更新数据而不重新加载页面

import React, { useState, useEffect } from 'react';
import firebase from '../util/firebase';

export default function Items() {
  const [items, setItems] = useState();
  useEffect(() => {
    let data = [];
    firebase
      .firestore()
      .collection('items')
      .onSnapshot((snapshot) => {
        let changes = snapshot.docChanges();
        console.log(changes);
        changes.forEach((change) => {
          data.push(change.doc.data());
        });
        console.log(data);
      });
    setItems(data);
  }, [items]);
  return <div>{items && items.map((item) => <h1>{item.text}</h1>)}</div>;
}

【问题讨论】:

  • 从效果依赖中移除项目,并在控制台记录数据后直接执行 setItems。
  • 我这样做了,但是当我添加新项目时,组件会再次渲染以显示它

标签: reactjs


【解决方案1】:

useEffect 在其中一个依赖项发生更改时重新运行传递给它的函数。

如果我们分析当前的useEffect 函数,您可以看到它使用setItemsitems 设置了一个状态,这将导致重新渲染。但依赖也包含items

组件安装 -> useEffect -> 设置项目 -> useEffect 检测项目更改,重新运行 -> 再次设置项目,继续。

由于您实际上并未在useEffect 中使用items,因此您可以安全地将其从依赖数组中删除。

这里的另一个危险是useSnapshot 函数是异步的,所以当编译器到达setItems 时,它还没有运行useSnapshot,因此数据将为空。为了解决这个问题,您可以将 setItems 函数移到里面:

const [items, setItems] = useState();
useEffect(() => {
  let data = [];
  firebase
    .firestore()
    .collection("items")
    .onSnapshot((snapshot) => {
      let changes = snapshot.docChanges();
      console.log(changes);
      changes.forEach((change) => {
        data.push(change.doc.data());
      });
// spreading the data here did solve my problem
      setItems([...data]);
    });
}, []);

【讨论】:

  • 这样,当我添加一个项目时,组件不会重新渲染以显示新数据我该如何解决这个问题?
  • @SalahEddinBeriani 您可以将useEffect 的内容提取到它的一个函数中,并在添加项目后调用相同的函数
  • @Agney 您正在改变数据,因此当您设置状态时,您会一直将其设置为相同的引用,请尝试以下操作:setItems([...data]);
  • @Agney @HMR 传播这样的数据 setItems([...data]) 确实使它工作,感谢双方的帮助:)
猜你喜欢
  • 2021-10-15
  • 2019-04-03
  • 2022-11-12
  • 2017-03-24
  • 2021-11-07
  • 1970-01-01
  • 2023-03-22
  • 2022-07-08
  • 2016-02-23
相关资源
最近更新 更多