2016-03-13 35 views
1

我有一個嵌套列表:鍵控反應列表帶有動態屬性

    • 酒吧
      • 項目
      • ...
    • 巴茲
      • ...
  • qux
    • ...

正在從像數據生成的:

data = { 
    foo: [{ bar: [{id:12345}, ...], baz: [{id: 23456}, ...}]}, {...}] 
    qux: [...], 
    ... 
} 

其中用作鍵(foobarbaz,和上述qux)可以被編輯的部分中的值。

我拍發方法:

<ul> 
    {Object.keys(data).sort().map(function(k1) { 
    return [ 
     <li key={'k1-' + k1}><h3>{k1}</h3></li>, 
     <ul> 
     {Object.keys(data[k1]).sort().map(function(k2) { 
      return [ 
      <li key={'k1-' + k1 + '-k2-' + k2}> 
       <h4>{k2}</h4> 
      </li>, 
      <ul> 
       data[k1][k2].map(function(item) { 
       return (<li key={'k3-' + item.id}>blah blah blah</li>); 
       })} 
      </ul> 
      ]; 
     })} 
     </ul> 
    ]; 
    })} 
</ul> 

不辦案現有值中,其中K1和K2的變化。

我已經嘗試在映射函數中使用列表索引作爲鍵的一部分,但是當列表長度/順序在更新上發生更改時,出現了類似的問題。我也嘗試致電this.forceUpdate()瞭解相關的狀態變化,但這似乎沒有幫助。

有沒有一種鍵控方法可以在鍵編輯時正確地重新顯示列表?

回答

0

由於您只需要在一個列表中擁有唯一的鍵,您可以使用索引。

<ul> 
    {Object.keys(data).sort().map(function(k1, i) { 
    return [ 
     <li key={i}><h3>{k1}</h3></li>, 
     <ul> 
     {Object.keys(data[k1]).sort().map(function(k2, j) { 
      return [ 
      <li key={[i,j].join('')}> 
       <h4>{k2}</h4> 
      </li>, 
      <ul> 
       data[k1][k2].map(function(item, k) { 
       return (<li key={[i,j,k].join('')}>blah blah blah</li>); 
       })} 
      </ul> 
      ]; 
     })} 
     </ul> 
    ]; 
    })} 
</ul> 
+0

謝謝德米特里。當我嘗試這樣做時,當項目在列表內或列表之間移動時,我遇到同樣的問題,因爲當列表重新排序時,項目的索引可能會更改,但這不會在呈現的列表中準確反映。我不認爲這些指標可以作爲這些物品可以如此移動的關鍵點。 –

+0

您可以使用下劃線'_.uniqueId([前綴])'來生成密鑰。 http://underscorejs.org/#identity或者只是刪除這個函數,如果你不想添加整個庫。 –