React setState未在firestore中执行添加文档承诺解析

问题描述 投票:0回答:1

我将一个项目列表存储为firestore集合中的文档。当新项目添加到列表中时,它们将存储在组件状态中的单独变量中,但与已保存到firestore的项目数组合并。

只有在调用保存它们的手动调用时,才会将文档添加到firestore集合中。调用save调用时调用的逻辑如下:

if (this.state.unsavedNoteItems.length){
    let items = this.state.unsavedNoteItems.map(item => item) //make a local copy of unsaved items
    this.setState({unsavedNoteItems:[]}) //clear unsaved items array in component state
    items.map(item => {
        docRef.collection('items').add(item)
        .then(doc => {
            console.log("item saved: ", doc.id)
            //if item was added successfully, merge it into note Items
            this.setState((pState) => {noteItems: [...pState.noteItems,item]})
            console.log('state was set', item)
        })
        .catch(error => {
            console.log("Error: ", error)
            //if item add failed, put is back in unsavedNoteItems list
            this.setState((pState) => {unsavedNoteItems: [...pState.unsavedNoteItems,item]})
        })
    })
}

在添加项目后的解析器中,this.setState不会更新UI,即使更改已持续存在。

我通过创建查询快照解决了这个问题,但想要了解为什么setState调用不更新UI。有任何想法吗?

javascript reactjs firebase google-cloud-firestore
1个回答
1
投票

(pState) => {noteItems: [...pState.noteItems,item]}这里{ }不是一个对象字面值,而是一个块语句。

const iReturnUndefined = value => {a: value}
const iReturnObject = value => ({a: value})

console.log(iReturnUndefined('a'))
console.log(iReturnObject('a'))

您需要使用()将其包装起来,使其成为对象初始化表达式

if (this.state.unsavedNoteItems.length){
    let items = this.state.unsavedNoteItems.map(item => item) //make a local copy of unsaved items
    this.setState({unsavedNoteItems:[]}) //clear unsaved items array in component state
    items.map(item => {
        docRef.collection('items').add(item)
        .then(doc => {
            console.log("item saved: ", doc.id)
            // NB! 1
            this.setState(pState => ({noteItems: [...pState.noteItems,item]}))
            console.log('state was set', item)
        })
        .catch(error => {
            console.log("Error: ", error)
            // NB! 2
            this.setState(pState => ({unsavedNoteItems: [...pState.unsavedNoteItems,item]}))
        })
    })
}
© www.soinside.com 2019 - 2024. All rights reserved.