169 похожих чатов

Всем привет! Вопрос такой, имеется структура: state: { obj:

{
key1: value1,
}
}

Этот объект полностью реактивен. Я хочу добавить реактивное свойство в объект obj, чтобы получилось вот так:

state: {
obj: {
key1: value1,
key2: value2
}
}

Правильно я понял, что для этого мне надо сделать следующее:

state.obj = Object.assign({}, state.obj, {key2: value2})

?

Полученный результат будет полностью реактивным, правильно?

29 ответов

17 просмотров

Какая версия Vue ?

Alexey-Topunov Автор вопроса
Grigorii K. Shartsev
Какая версия Vue ?

2.5.17, vuex третий, точную версию не помню

Alexey-Topunov Автор вопроса
¿Сергей?
Можно использовать $set

Можно, можно так же и через spread-оператор, написал просто более общий пример через assign

¿Сергей?
Можно использовать $set

лучше обойтись спредом или ассайном, $set выпилен во вью 3

Alexey Topunov
2.5.17, vuex третий, точную версию не помню

Можно через state.obj = Object.assign({}, state.obj, {key2: value2}) Тоже самое state.obj = { ...state.obj, key2: value2 } Но эффективнее, если объект не маленький - Vue.set(state.obj, 'key2', value2)

¿Сергей?
Поэтому сет не нужно использовать?

да, потому что при миграции его нужно будет выпиливать тем более, что 99.9% кейсов решаются без проблем через спред

Artyom Tuchkov
лучше обойтись спредом или ассайном, $set выпилен ...

Он выпилен, потому что нет проблемы, которую он решает, но это не значит, что он не нужен в двойке. С клонированием, если объект не маленький (например, используется для хранения данных по ключу), будут лишние тормоза

Grigorii K. Shartsev
Он выпилен, потому что нет проблемы, которую он ре...

>но это не значит, что он не нужен в двойке. а еще это значит, что с каждым использованием $set добавляется больше легаси, которое нужно будет 100% переписываать при миграции $set нужен только в очень узких кейсах, когда действительно большой объект и копировать каждый уровень вложенности - больно и долго, в остальных случаях его польза околонулевая

Artyom Tuchkov
>но это не значит, что он не нужен в двойке. а ещ...

А сделать в тройке при миграции $set свой, с такой же логикой?)

¿Сергей?
А сделать в тройке при миграции $set свой, с такой...

зачем это надо, если можно просто не использовать его в двойке, если в этом нет прям явной необходимости?

Artyom Tuchkov
>но это не значит, что он не нужен в двойке. а ещ...

Это оправданное легаси, требуется добавить поле объекта - используется функция добавления поля объекта. Рефакторится такое место очень просто. Зачем ради избегания этого места делать лишние клонирования там, где они не нужны

Artyom Tuchkov
зачем это надо, если можно просто не использовать ...

Во вью это рекомендуют, вот почему И все уже знают зачем его использовать

Artyom Tuchkov
зачем это надо, если можно просто не использовать ...

Зачем клонировать объекты, если в этом нет явной необходимости?)

Alexey-Topunov Автор вопроса
Grigorii K. Shartsev
Можно через state.obj = Object.assign({}, state.o...

Спасибо, кажется, я понял суть. Уже этот вопрос задавал, но сейчас доходит потихоньку до меня, что конкретно значит реактивность.

¿Сергей?
Во вью это рекомендуют, вот почему И все уже знаю...

вью это не рекомендует, а описывает, как один из способов работы с объектами, который сохраняет реактивность помимо этого, вью описывает и обычный Object.assign, так что аргумент едва ли весомый

Grigorii K. Shartsev
Зачем клонировать объекты, если в этом нет явной н...

в этом есть необходимость, потому что так работает реактивность и это, естественно, нужно учитывать благодаря клонированию ты избавляешь себя от необходимости в будущем возвращаться к этому куску кода и переписывать его мне кажется, это вполне того стоит

Artyom Tuchkov
в этом есть необходимость, потому что так работает...

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

Grigorii K. Shartsev
Если исходить из цели перехода на Vue 3, то как ра...

смысла в этом действительно не будет, но и вреда особого тоже, зато конкретно этот кусок кода не будет требовать рефакторинга достаточно представить, что в проекте таких сетов натыкано штук 100 в самых разных местах, где в 99% можно обойтись без них в общем, я лично не вижу здесь преимуществ у set, если вложенность небольшая, это просто лишний костыль для обхода проблем реактивности, который в будущем не будет нужен и его придется убирать

Artyom Tuchkov
смысла в этом действительно не будет, но и вреда о...

а v-for и v-if отдельно делать это тоже костыль?)

Artyom Tuchkov
смысла в этом действительно не будет, но и вреда о...

set не про вложенность ведь, а про изменение объекта без клонирования. Хоть плоский будет объект, если это хранилище ключ-значение, то клонировать хранилище странно. Даже если таких строк будет 100, они меняются легко. Я даже готов рискнуть регулярку написать :D

¿Сергей?
а v-for и v-if отдельно делать это тоже костыль?)

мы где-то здесь про v-for и v-if говорили или к чему этот вопрос?

Artyom Tuchkov
мы где-то здесь про v-for и v-if говорили или к че...

Аналогию провожу с вашим описанием "костыля"

Grigorii K. Shartsev
set не про вложенность ведь, а про изменение объек...

конечно, есть ситуации, где set может быть удобнее, но лично я при работе с Vue 2 не встречал таких проблем уже прям очень давно >Я даже готов рискнуть регулярку написать *шутка про регулярку и количество проблем*

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
Карта сайта