亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

React:從狀態中刪除動態輸入,重新渲染

React:從狀態中刪除動態輸入,重新渲染

狐的傳說 2023-04-27 17:11:09
我在調試這種情況時遇到問題。我正在嘗試從 API 提供的數組中刪除索引。在檢查其父級的道具更改后,我將其存儲在父級狀態中。這里一切都很好。我可以將任何道具更改存儲在父表單狀態中。父表單映射templateData中的所有內容,我確定它是什么類型,然后根據需要渲染一個組件。刪除按鈕將始終只在DynamicInputGroup中,因此我通過道具向下傳遞該功能。在DynamicInputGroup中,我需要映射從父級傳遞的數組,然后映射該數組中的對象以顯示每個單獨的輸入。再次使用傳遞下來的道具來確定要渲染的輸入,與父級相同。這是出了問題的地方。當我單擊刪除時,假設索引 2(共 5 個),我看到該索引在狀態中被刪除,但呈現的是索引 5 被刪除。我不確定該怎么做。我已經完成研究并閱讀了密鑰發揮作用?我試圖將渲染函數中的一個變量設置為狀態,這樣它就會刷新,但什么也沒有。最后一個索引總是被刪除。哈!家長表格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>          )      })}    )}動態輸入組組件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貢獻1796條經驗 獲得超4個贊

使用索引作為組件的鍵是一種不好的做法,尤其是當它是一個不斷變化的列表時。鍵應該是組件的唯一標識符。

如果您的控件沒有唯一標識符,您可以基于時間戳創建一個標識符,某種 uuid,您將存儲在您的狀態中,并且始終只引用一個控件元素。

想象一下,您有 1 個輸入元素的值為 的情況TextInput 1。然后你從它添加另一個輸入,它繼承它的密鑰?,F在您已經破壞了影子 DOM,因為您引用的是新輸入而不是舊輸入,因為帶有 key={0} 的輸入的值為TextInput 1,但這不是您所期望的,因為您想要引用另一個輸入。


查看完整回答
反對 回復 2023-04-27
?
慕慕森

TA貢獻1856條經驗 獲得超17個贊

這一行有問題:

<Fragment?key={key}>

由于您使用數組的索引來呈現那些Fragments,協調失敗length次數和“最后一個元素”被刪除。

查看完整回答
反對 回復 2023-04-27
  • 2 回答
  • 0 關注
  • 161 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號