簡體   English   中英

反應本機listView項目刪除未正確刪除項目

[英]React Native listView item delete not properly removing item

運行一些示例代碼,我遇到了一個問題,即listView無法正確地重新呈現已修改的列表。 例如,我有一個對象的硬編碼數組,例如:

datasetsItems = [
    {firstObjectWithMultipleParams},
    {secondObjectWithMultipleParams},
    ...
]

然后,我創建了一個執行以下操作的按鈕:

datasetsItems.splice(1,1) // To delete the object at index 1
this.setState({dataSource: this.state.dataSource.cloneWithRows(
    datasetsItems
)});

但是,這將呈現它,並刪除數組中的最后一個對象,而不是索引中指定的對象。 我在調試器中簽入,並且拼接功能正常運行,並且刪除了所請求的對象,因此拼接功能不是問題。

然后,我嘗試了以下操作:

datasetsItems = [...datasetsItems.slice(0,1),...datasetsItems.slice(2,datasetsItems.length)];
this.setState({dataSource: this.state.dataSource.cloneWithRows(
    datasetsItems
)});

這樣就可以正常工作並呈現列表,而沒有對象位於索引1。因此,我做了以下操作,只是為了進行測試:

datasetsItems.splice(1,1);
let newDs = datasetsItems.slice();
this.setState({dataSource: this.state.dataSource.cloneWithRows(
    newDs
)});

但這是行不通的,並且失敗的方式與第一個示例相同。

有這種行為的原因嗎? 我也想知道我用切片的方式是否擺脫了React修改修改后的行從而完全重新渲染所有內容的能力?

您應該使用原始數據集的副本來更新狀態。 我遇到了同樣的問題,並通過在執行此操作之前深度復制數組來設法解決此問題:

this.setState({
   dataSource: this.state.dataSource.cloneWithRows(newDs)
});

這是我的一段代碼:

//delete some items from old_array

var new_array = JSON.parse(JSON.stringify(old_array));

this.setState({
   dataSource: this.state.dataSource.cloneWithRows(new_array)
});

它可能不是最佳解決方案。

當涉及到空數據(例如,fetch找不到數據結果)時,我像這樣用來刷新ListView:

 this.setState({ dataSource: this.state.dataSource.cloneWithRows({}), loaded: true, }); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM