{
key1: value1,
}
}
Этот объект полностью реактивен. Я хочу добавить реактивное свойство в объект obj, чтобы получилось вот так:
state: {
obj: {
key1: value1,
key2: value2
}
}
Правильно я понял, что для этого мне надо сделать следующее:
state.obj = Object.assign({}, state.obj, {key2: value2})
?
Полученный результат будет полностью реактивным, правильно?
Какая версия Vue ?
2.5.17, vuex третий, точную версию не помню
Можно использовать $set
Можно, можно так же и через spread-оператор, написал просто более общий пример через assign
лучше обойтись спредом или ассайном, $set выпилен во вью 3
Можно через state.obj = Object.assign({}, state.obj, {key2: value2}) Тоже самое state.obj = { ...state.obj, key2: value2 } Но эффективнее, если объект не маленький - Vue.set(state.obj, 'key2', value2)
Поэтому сет не нужно использовать?
да, потому что при миграции его нужно будет выпиливать тем более, что 99.9% кейсов решаются без проблем через спред
Он выпилен, потому что нет проблемы, которую он решает, но это не значит, что он не нужен в двойке. С клонированием, если объект не маленький (например, используется для хранения данных по ключу), будут лишние тормоза
Не согласен с вами абсолютно
>но это не значит, что он не нужен в двойке. а еще это значит, что с каждым использованием $set добавляется больше легаси, которое нужно будет 100% переписываать при миграции $set нужен только в очень узких кейсах, когда действительно большой объект и копировать каждый уровень вложенности - больно и долго, в остальных случаях его польза околонулевая
А сделать в тройке при миграции $set свой, с такой же логикой?)
зачем это надо, если можно просто не использовать его в двойке, если в этом нет прям явной необходимости?
Это оправданное легаси, требуется добавить поле объекта - используется функция добавления поля объекта. Рефакторится такое место очень просто. Зачем ради избегания этого места делать лишние клонирования там, где они не нужны
Во вью это рекомендуют, вот почему И все уже знают зачем его использовать
Зачем клонировать объекты, если в этом нет явной необходимости?)
Спасибо, кажется, я понял суть. Уже этот вопрос задавал, но сейчас доходит потихоньку до меня, что конкретно значит реактивность.
вью это не рекомендует, а описывает, как один из способов работы с объектами, который сохраняет реактивность помимо этого, вью описывает и обычный Object.assign, так что аргумент едва ли весомый
в этом есть необходимость, потому что так работает реактивность и это, естественно, нужно учитывать благодаря клонированию ты избавляешь себя от необходимости в будущем возвращаться к этому куску кода и переписывать его мне кажется, это вполне того стоит
Если исходить из цели перехода на Vue 3, то как раз в таком случае будет совершенно ненужное место, где в тройке нет никакого смысла в клонировании в виду отсутствия проблемы с реактивностью.
смысла в этом действительно не будет, но и вреда особого тоже, зато конкретно этот кусок кода не будет требовать рефакторинга достаточно представить, что в проекте таких сетов натыкано штук 100 в самых разных местах, где в 99% можно обойтись без них в общем, я лично не вижу здесь преимуществ у set, если вложенность небольшая, это просто лишний костыль для обхода проблем реактивности, который в будущем не будет нужен и его придется убирать
а v-for и v-if отдельно делать это тоже костыль?)
set не про вложенность ведь, а про изменение объекта без клонирования. Хоть плоский будет объект, если это хранилище ключ-значение, то клонировать хранилище странно. Даже если таких строк будет 100, они меняются легко. Я даже готов рискнуть регулярку написать :D
мы где-то здесь про v-for и v-if говорили или к чему этот вопрос?
Аналогию провожу с вашим описанием "костыля"
имутабельность класс, я в ютубе слышал
конечно, есть ситуации, где set может быть удобнее, но лично я при работе с Vue 2 не встречал таких проблем уже прям очень давно >Я даже готов рискнуть регулярку написать *шутка про регулярку и количество проблем*
так себе аналогия, если честно
Обсуждают сегодня