【问题标题】:How to prevent reloading the entire component on updating some firestore documents?如何防止在更新某些 Firestore 文档时重新加载整个组件?
【发布时间】:2021-01-23 11:35:43
【问题描述】:

我正在尝试构建一个拖放待办事项列表...在每个元素的每个拖放位置在 firebase 中更新后...这就是这样做的功能

unfinishedTodos.forEach((each, index) => {
 firebaseApp.firestore().collection("todos").doc(each.id).update({
   index: index})
});

但是在运行更新功能后,整个组件正在重新加载。问题是,由于列表中有很多项目,我必须再次滚动才能找到我正在使用的项目...我想做确保firestore文档得到更新,但页面不应该重新加载......我怎样才能防止重新加载? 更新: 我发现出了什么问题...实际上我正在使用 firebase 的 onSnapshot 功能...所以每次更改都会触发并重新加载数据...

【问题讨论】:

  • 你能把整个组件展示出来吗?这应该很容易,但了解它的上下文会很有帮助。

标签: reactjs firebase google-cloud-firestore drag-and-drop


【解决方案1】:

每当stateprops 变量发生变化时,React 都会更新组件。

所以,为了防止有条件地重新渲染,您可以使用这个生命周期函数(返回false 意味着避免重新渲染):

类组件

shouldComponentUpdate(prevState, prevProps) {
    if (this.state.someVariable !== prevState.someVariable || 
        this.props.someVariable !== prevProps.someVariable) {
        return false;
    }

    return true;
}

功能组件

React.memo(MyComponent, (props, nextProps)=> {
    if(this.state.someVariable !== prevState.someVariable) {
        // if don't re-render/update
        return true
    }

    //...
})

【讨论】:

  • 但是我使用的是功能组件而不是类组件。如果是这种情况,我应该如何修改您的代码
  • 将其添加到我的答案中
  • 嘿,但我不明白更新 firebase firestore 数据库我没有改变当前组件的任何状态或道具...那么重新渲染整个组件的原因是什么?
  • 很明显,如果您更改应用程序“订阅”的数据,组件会重新呈现。显然,这种“订阅”必须意味着通过 props 传递数据,在底层(React 中的所有东西都是通过这种方式传递的)。抱歉,我不能更具体,因为我不知道firebase...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-20
  • 2017-06-05
相关资源
最近更新 更多