Size: a a a

React — русскоговорящее сообщество

2020 November 25

DS

Dmitriy Shuleshov in React — русскоговорящее сообщество
SkyWalker
Всем привет, расскажу свою ситуацию:

Шаг 1:https://prnt.sc/vq2g9e
Здесь я просто демонстрирую свое приложение (пилю на реакте, само собой). Здесь можно добавлять или удалять ряд или столбец. Для того, чтобы удалить нужно навести на таблицу и появятся кнопки удаления

Шаг 2: https://prnt.sc/vq2hau
Выбираем необходимый нам столбец и удаляем его.

Шаг 3: https://prnt.sc/vq2m0a
Вроде бы все хорошо и работает так как нужно, 4-ый столбец удален. Но все это только на уровне отображаемых данных, но не на уровне дом элементов, сейчас продемонстрирую.

Шаг 1:https://prnt.sc/vq2jjh
Запускаем приложение заново и помечаем через девтулзы 4 столбец, который мы удаляем и 6-ой. Для его 6-ой станет понятно позже.

Шаг 2:https://prnt.sc/vq2k1t
После нажатия кнопки удаления можно увидеть, что если взять в контексте отображаемых данных удалился 4-ый столбец. Но в контексте ДОМ-элементов удаляется последний столбец, а свойства удаленного по данным столбца перешли к следующему столбцу.

Я потратил очень много времени на выяснение ситуации, но не нашел в своем приложении видимых багов, все работает согласно стейту, если через девтулзы менять стейт, то все тоже работает прогнозируемо.

Но вот другие тесты, которые я провел, показали, что не все в порядке с ДОМ-элементами.

Это мой баг или фича виртуального дом-дерева?)
Не уникальные ключи в мапе
источник

S

SkyWalker in React — русскоговорящее сообщество
Andriy Dudariev
key={colKey}
Оно же индекс тянет
Ну я же написал выше, что я пробовал с другими уникальными комбинациями и результата это не дало. Сейчас там находятся ключи из индекса.
источник

DS

Dmitriy Shuleshov in React — русскоговорящее сообщество
SkyWalker
Ну я же написал выше, что я пробовал с другими уникальными комбинациями и результата это не дало. Сейчас там находятся ключи из индекса.
Неправильно пробовали.
источник

S

SkyWalker in React — русскоговорящее сообщество
Dmitriy Shuleshov
Неправильно пробовали.
Не исключено, поэтому написал сюда.

Подскажите, как бы вы сгенерировали в данной ситуации уникальные ключи.
Я обязательно протестирую предложенный вариант.
источник

DS

Dmitriy Shuleshov in React — русскоговорящее сообщество
SkyWalker
Не исключено, поэтому написал сюда.

Подскажите, как бы вы сгенерировали в данной ситуации уникальные ключи.
Я обязательно протестирую предложенный вариант.
uuid или другие мейнстрим варианты
источник

S

SkyWalker in React — русскоговорящее сообщество
Dmitriy Shuleshov
uuid или другие мейнстрим варианты
Если честно, я не знаком с данной аббревиатурой, можно, пожалуйста, уточнить куда копать?
источник

DS

Dmitriy Shuleshov in React — русскоговорящее сообщество
SkyWalker
Если честно, я не знаком с данной аббревиатурой, можно, пожалуйста, уточнить куда копать?
В npm
источник

DS

Dmitriy Shuleshov in React — русскоговорящее сообщество
SkyWalker
Если честно, я не знаком с данной аббревиатурой, можно, пожалуйста, уточнить куда копать?
Сча сделаю песочницу
источник

DS

Dmitriy Shuleshov in React — русскоговорящее сообщество
SkyWalker
Если честно, я не знаком с данной аббревиатурой, можно, пожалуйста, уточнить куда копать?
источник

D

Dezmunt in React — русскоговорящее сообщество
Александр Бакиматов
тут все таки не ванги, как мы без кода скажем где ты не прав?
key был не достаточно уникальный, всем спс)
источник

М

Максим in React — русскоговорящее сообщество
Всем привет, не получается разобраться с одной штукой. Собрал пример проблемы в песочнице:
https://codesandbox.io/s/hungry-yalow-zllmn

В чем проблема - в модалке, которая рендерится через портал, есть комментарии. Отвечая на комментарий рендерится форма, которая в зависимости от пропа имеет кнопку "Отмена". Вот по клику на отмену у меня закрывается модалка, а как мне кажется должна скрываться форма ответа
источник

S

SkyWalker in React — русскоговорящее сообщество
Спасибо, за дополнительные знания
источник

S

SkyWalker in React — русскоговорящее сообщество
SkyWalker
Всем привет, расскажу свою ситуацию:

Шаг 1:https://prnt.sc/vq2g9e
Здесь я просто демонстрирую свое приложение (пилю на реакте, само собой). Здесь можно добавлять или удалять ряд или столбец. Для того, чтобы удалить нужно навести на таблицу и появятся кнопки удаления

Шаг 2: https://prnt.sc/vq2hau
Выбираем необходимый нам столбец и удаляем его.

Шаг 3: https://prnt.sc/vq2m0a
Вроде бы все хорошо и работает так как нужно, 4-ый столбец удален. Но все это только на уровне отображаемых данных, но не на уровне дом элементов, сейчас продемонстрирую.

Шаг 1:https://prnt.sc/vq2jjh
Запускаем приложение заново и помечаем через девтулзы 4 столбец, который мы удаляем и 6-ой. Для его 6-ой станет понятно позже.

Шаг 2:https://prnt.sc/vq2k1t
После нажатия кнопки удаления можно увидеть, что если взять в контексте отображаемых данных удалился 4-ый столбец. Но в контексте ДОМ-элементов удаляется последний столбец, а свойства удаленного по данным столбца перешли к следующему столбцу.

Я потратил очень много времени на выяснение ситуации, но не нашел в своем приложении видимых багов, все работает согласно стейту, если через девтулзы менять стейт, то все тоже работает прогнозируемо.

Но вот другие тесты, которые я провел, показали, что не все в порядке с ДОМ-элементами.

Это мой баг или фича виртуального дом-дерева?)
key был действительно недостаточно уникальный, при другой генерации ключей, все работает адекватно
источник

NT

Nikolay Tolochnyy in React — русскоговорящее сообщество
да, там у вас частый ререндер и вы бы не смогли нормально покрасить даже если бы key был всегда уникальный
источник

DS

Dmitriy Shuleshov in React — русскоговорящее сообщество
SkyWalker
key был действительно недостаточно уникальный, при другой генерации ключей, все работает адекватно
Он не вам а про свою проблему и как вы успели заметить за последние две минуты, траблы с неуникальными ключами довольно частый источник багов😏
источник

S

SkyWalker in React — русскоговорящее сообщество
SkyWalker
key был действительно недостаточно уникальный, при другой генерации ключей, все работает адекватно
Проблема в том, что я не могу использовать сторонние библиотеки, но вроде бы у меня получилось сделать уникальный key. Я просто складываю значение с индексов, вроде все работает адекватно)
источник

NT

Nikolay Tolochnyy in React — русскоговорящее сообщество
если происходит вставка/удаление/перемещение)
источник

NT

Nikolay Tolochnyy in React — русскоговорящее сообщество
я взял первую статью на медиуме
`f${(~~(Math.random()*1e8)).toString(16)}`
источник

DS

Dmitriy Shuleshov in React — русскоговорящее сообщество
SkyWalker
Проблема в том, что я не могу использовать сторонние библиотеки, но вроде бы у меня получилось сделать уникальный key. Я просто складываю значение с индексов, вроде все работает адекватно)
export const nanoid = (t = 21) => {
 let e = ''
 const r = crypto.getRandomValues(new Uint8Array(t))
 for (; t--; ) {
   const n = 63 & r[t]

   if (n < 36) {
     e += n.toString(36)
   } else if (n < 62) {
     e += (n - 26).toString(36).toUpperCase()
   } else if (n < 63) {
     e += '_'
   } else {
     e += '-'
   }
 }
 return e
}
источник

NT

Nikolay Tolochnyy in React — русскоговорящее сообщество
Dmitriy Shuleshov
export const nanoid = (t = 21) => {
 let e = ''
 const r = crypto.getRandomValues(new Uint8Array(t))
 for (; t--; ) {
   const n = 63 & r[t]

   if (n < 36) {
     e += n.toString(36)
   } else if (n < 62) {
     e += (n - 26).toString(36).toUpperCase()
   } else if (n < 63) {
     e += '_'
   } else {
     e += '-'
   }
 }
 return e
}
crypto это же нодовская либа?
источник