Либо уникальный Id в объекте, либо либа например uuid
А в чем проблема?
В крайнем случае index из map например, но не рекомендуется
к index можно миксовать какой-то стринговый параметр объекта, будет уникально
Index тоже будет уникально)
Если я генерирую ключ через uid в двух разных компонентах, то ключи повторяются
да, потому что реакт и сам индексы проставляет (велком в исходники) Ну только если заткнуть его ор
Uuid никогда не повторяется
Не гуд)
поясни
При добавлении строки к индексу получается настолько же уникальное значение, насколько уникален индекс
сча попробую найти
Прикольно. Давно так?
Да, но при изменении коллеции если не миксовать что-то к индексу, то получаем неожидаемое поведение типа удаление из DOM совсем не того элемента который нужно было удалить
Если миксовать, поведение будет таким же
Есть у тебя список, в нем ключи item-0, item-1 и item-2. Ключи генерятся из строки item- и индекса. Если удалить элемент посередине, то ключи будут вычислены в item-0 и item-1. Добавление строки ни на что не влияет
С чего бы это? Допустим удалили второй элемент коллекции 0 1 2 -> 0 1 (пропал третий) /////// 0-привет 1-hi 2-bye -> 0-привет 1-bye (а тут второй)
Зачем тогда индекс, если у тебя есть УНИКАЛЬНОЕ значение?
иногда бывает так, что добавляемая к индексу строка не совсем уникальная (например, в чате может быть два и более сообщения "привет")
Приведёт к лишним ререндерам — компонент с -bye не изменился, а ключ у него изменился
ну вот уже должно же казаться костылем не очень правильным да? или нет?
тут согласен, это да
Ключи должны быть уникальными и ПОСТОЯННЫМИ для конкретного компонента
Так а в чем проблема?
да, но иногда можно ж закостылить чуть-чуть)
Если можно сделать нормально, то зачем?
нет если есть нормальные способы решения )
Так вот как они повторяются: у меня есть массивы типа [1, 2] и map((item) => (<element key={uid(item)}/>) Есть элементы 1 2 Когда элемент добавляется в масив пушится arr.length + 1 Соответственно элементы будут иметь ключ 'val-1' 'val-2' Если удалить элемент 1, и создать новый то у меня будет два элемента с ключом 'val-2'
Так стоп диза. https://github.com/facebook/react/blob/master/packages/react/src/ReactElement.js#L388 Или я упоролся или мне приснилось но чет я не нахожу
просто никогда не использовать индексы как ключи или составляющую индекса, НИКОГДА и все будет хорошо
еще раз - не генерируй ключи в рендере
https://t.me/react_js/1077335 Уникальные идентификаторы надо раздать ДО рендера. Там, где объявляются/запрашиваются/хранятся данные. При добавлении нового элемента, не надо завязываться на длину массива — создай УНИКАЛЬНОЕ значение. Math.random или nanoid. Не в рендере, не внутри map
о точно де нашел?
https://github.com/facebook/react/blob/master/packages/react/src/ReactChildren.js#L58-L71 тут
@gorbunov_i отбой нашлось)
А неее подождь это же мап для чилдренов, наврное я и в прошлый раз принял его за авто key из индекса
Обсуждают сегодня