Я реализую компонент, который упрощает пользователям добавление нескольких элементов на страницу. Поскольку у меня есть несколько типов элементов, которые могут быть добавлены пользователем, я подумал, что было бы наиболее полезно иметь один компонент с параметром «children».
Однако у реализации проблемы с «ключом» параметр при сопоставлении дочерних элементов.
function ExpandableSet({
startingSet,
itemTitle,
children
})
{
const largestId = useMemo(() => {
return startingSet.reduce((largestId, item) =>
if (item.id > largestId){
return item.id
}
return largestId
}, 0)
}, [])
const [itemCount, setItemCount] = useState(largestId + 1);
const [items, setItems] = useState(startingSet);
return(
<div className="expandable-set">
{ items.map( item =>
<div className="expanded-item" id={item['key']} key={item['key']}> { children } </div>
)}
</div>
<button onClick={() =>
{
items.push({"key" : itemCount});
setItemCount(itemCount + 1);
}
}>
Add {itemTitle}
</button>
)
}
Когда используется ExpandableSet
, он используется следующим образом:
...
<div className="container-for-expandable-set">
<ExpandableSet
startingSet={[]}
itemTitle="Some item I want a lot of" />
<SomeItem opts=opts />
</ExpandableSet>
</div>
...
Поскольку я не знаю, сколько SomeItem
элементов там будет, невозможно передать ключи на родительском уровне без управления состоянием и там. Это нарушит назначение компонента ExpandableSet
(может быть, это правильный ответ?)
Когда это выводится, я вижу стандартную ошибку each child in a list should have a unique 'key' prop
.
HTML Вывод
...
<div class="expandable-set">
<div class="expanded-item" id="0">
<div class="child-template-passed">
...
</div>
</div>
<div class="expanded-item" id="1">
<div class="child-template-passed">
...
</div>
</div>
</div>
...
Почему я все еще вижу ошибку key
?