狐的傳說
2023-04-27 17:11:09
我在調(diào)試這種情況時遇到問題。我正在嘗試從 API 提供的數(shù)組中刪除索引。在檢查其父級的道具更改后,我將其存儲在父級狀態(tài)中。這里一切都很好。我可以將任何道具更改存儲在父表單狀態(tài)中。父表單映射templateData中的所有內(nèi)容,我確定它是什么類型,然后根據(jù)需要渲染一個組件。刪除按鈕將始終只在DynamicInputGroup中,因此我通過道具向下傳遞該功能。在DynamicInputGroup中,我需要映射從父級傳遞的數(shù)組,然后映射該數(shù)組中的對象以顯示每個單獨的輸入。再次使用傳遞下來的道具來確定要渲染的輸入,與父級相同。這是出了問題的地方。當(dāng)我單擊刪除時,假設(shè)索引 2(共 5 個),我看到該索引在狀態(tài)中被刪除,但呈現(xiàn)的是索引 5 被刪除。我不確定該怎么做。我已經(jīng)完成研究并閱讀了密鑰發(fā)揮作用?我試圖將渲染函數(shù)中的一個變量設(shè)置為狀態(tài),這樣它就會刷新,但什么也沒有。最后一個索引總是被刪除。哈!家長表格this.state = { templateData: []}removeGroupItem = (index, inputName ) => { let group = `${inputName}__group` const newState = this.state; if (index === -1) return; newState.templateData[group].splice(index, 1); console.log(newState) // THIS SHOWS CORRECT STATE this.setState(newState);}render() { return ( {Object.keys(this.state.templateData).map((name, key) => { let data = { // SETTING inputType TO DISPLAY CORRECT COMPONENT } return ( <Fragment key={key}> {data.inputType == 'input' && <DynamicTextInput {...data} />} {data.inputType == 'rtf' && <DynamicRTF {...data} />} {data.inputType == 'img' && <DynamicImageUpload {...data} />} {data.inputType == 'group' && <DynamicInputGroup {...data} removeGroupItem={this.removeGroupItem} />} // COMPONENT THAT HOLDS REMOVE BUTTON </Fragment> ) })} )}動態(tài)輸入組組件this.state = { value: []}componentDidMount() { this.setState({ value: this.props.value })}componentDidUpdate(prevProps) { if (this.props.value !== prevProps.value) { this.setState({ value: this.props.value }) }}
2 回答

慕的地8271018
TA貢獻(xiàn)1796條經(jīng)驗 獲得超4個贊
使用索引作為組件的鍵是一種不好的做法,尤其是當(dāng)它是一個不斷變化的列表時。鍵應(yīng)該是組件的唯一標(biāo)識符。
如果您的控件沒有唯一標(biāo)識符,您可以基于時間戳創(chuàng)建一個標(biāo)識符,某種 uuid,您將存儲在您的狀態(tài)中,并且始終只引用一個控件元素。
想象一下,您有 1 個輸入元素的值為 的情況TextInput 1
。然后你從它添加另一個輸入,它繼承它的密鑰?,F(xiàn)在您已經(jīng)破壞了影子 DOM,因為您引用的是新輸入而不是舊輸入,因為帶有 key={0} 的輸入的值為TextInput 1
,但這不是您所期望的,因為您想要引用另一個輸入。

慕慕森
TA貢獻(xiàn)1856條經(jīng)驗 獲得超17個贊
這一行有問題:
<Fragment?key={key}>
由于您使用數(shù)組的索引來呈現(xiàn)那些Fragments
,協(xié)調(diào)失敗length
次數(shù)和“最后一個元素”被刪除。
添加回答
舉報
0/150
提交
取消