React bir dizi oluşturduğunda, bu dizideki her öğe için bir anahtar sağlanmalıdır. Aksi takdirde, bir uyarı verilecektir: detaylı açıklaması varReact, diğerinde iç içe geçmiş bir dizi ile karşılaşıldığında ne olur?
Warning: Each child in an array or iterator should have a unique "key" prop
Doc yaklaşık how to identify keys ve why we do this yanıt verin.
Ancak, this case numaralı belgede, başka bir öğede yuvalanmış bir dizi oluştururken uyarı verilmediğini fark ettim. Tepki içinde
const numbers = [1, 2, 3, 4, 5];
const listItems = numbers.map((numbers) =>
<li>{numbers}</li>
);
// 'listItems' is wrapped in an array
ReactDOM.render(
<ul>{[listItems]}</ul>,
document.getElementById('container')
);
ayıklama sonra ise, çocuk anahtarlarını doğrulamak için kullanılan, function validateChildKeys
bulmak:
/**
* file path: react/lib/ReactElementValidator.js
* Ensure that every element either is passed in a static location, in an
* array with an explicit keys property defined, or in an object literal
* with valid key property.
*
* @internal
* @param {ReactNode} node Statically passed child of any type.
* @param {*} parentType node's parent's type.
*/
function validateChildKeys(node, parentType) {
if (typeof node !== 'object') {
return;
}
if (Array.isArray(node)) {
for (var i = 0; i < node.length; i++) {
var child = node[i];
if (ReactElement.isValidElement(child)) {
validateExplicitKey(child, parentType);
}
}
} else {
// do some other validation
// ..................
}
}
fonksiyon ReactElement.isValidElement(child)
bir alt düğüm kontrol edilmelidir olmadığını kontrol etmek için kullanılır. Yuvalama dizisini denetlerken, örn. array = [array0,array1,array2]
, dizi0, dizi1, dizi2, $$typeof
adlı bir özelliğe sahip olmayan Array
nesnesidir, bu nedenle validateExplicitKey
işlevi hiçbir zaman çağrılmaz, çocuk düğümü asla denetlenmez, elbette, uyarı iletisi hiçbir zaman atılmaz.
acaba:
- bu kabullenecek Tepki mu?
- Yeniden oluşturma işlemi ne zaman gerçekleşir?
Performans üzerinde etkisi var mı? Ne kadar getiriyoruz dava aslında
validateChildKeys
Yukarıdaki yorum açıklanan düşünüyorumconst Page = (tables) => ( tables.map((table, idx) => ( [<Title/>, ...(table.get('forms').map((form, aidx) => (<Form/>))) ] )) );