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

А как изменять объект внутри компонента, если он приходит как

value, а это пропс и его нельзя вешать на v-model контролов?

38 ответов

26 просмотров

через computed с сеттером

https://ru.vuejs.org/v2/guide/computed.html#%D0%A1%D0%B5%D1%82%D1%82%D0%B5%D1%80%D1%8B-%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D1%8F%D0%B5%D0%BC%D1%8B%D1%85-%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2

Сергей-В. Автор вопроса
Anton Permyakov
через computed с сеттером

хм, интересный подход, спасиб. А это костыль или бестпрактис?

Имеется в виду мутировать объект или целиком менять? В v-model, наверное, идут поля объекта, а не объект?

Сергей-В. Автор вопроса
Grigorii K. Shartsev
Имеется в виду мутировать объект или целиком менят...

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

Сергей В.
ну у меня на странице приходит допустим большой об...

Тогда в чистом виде вариант Антона не подходит. Вычисляемое свойство с геттером и сеттером - вариант, когда нужно просто пропс проксировать в модель следующего компонента. В случае объекта требуется создавать локальную копию объекта, его уже поля привязывать к модели и синхронизировать. А тут уже варианты разные, смотря как обновляются в обе стороны данные

Сергей В.
ну у меня на странице приходит допустим большой об...

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

Artyom Tuchkov
я обычно в таких кейсах просто делаю провайд этого...

Если он напрямую мутируется, то это скорее аналог мутирования пропса. А в изначальном вопросе требовалось избежать мутации пропса. Мутация объекта, который провайдится - даже хуже мутации объекта. Ну и тут провайд связывает компоненты сильнее. Чуть менее универсально, надо уже на компоненты конкретные смотреть

Сергей-В. Автор вопроса
Artyom Tuchkov
я обычно в таких кейсах просто делаю провайд этого...

так нужна как раз, чтоб внутри вложенных менять объект "частями"

Сергей В.
так нужна как раз, чтоб внутри вложенных менять об...

Он, наверное, имел в виду, что не нужна реактивность самого провайда, потому что provide сам по себе не реактивен.

Grigorii K. Shartsev
Если он напрямую мутируется, то это скорее аналог ...

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

Artyom Tuchkov
отчасти да, но здесь есть много но если есть усло...

У вас провайд получается просто "потому что утомительно пропс передавать". При этом он не решил проблему мутации, вы предлагаете мутировать объект, который провайдится. Связаны ли они тесно у Сергея - мы не знаем)

Grigorii K. Shartsev
У вас провайд получается просто "потому что утомит...

Он пытается решить проблему бурения пропсов через провайд

Grigorii K. Shartsev
Но с мутацией объекта

Пусть функцию прокинет для изменения

Grigorii K. Shartsev
У вас провайд получается просто "потому что утомит...

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

Artyom Tuchkov
не совсем, я делаю провайд в том случае, если есть...

Но у вас идёт мутация входа компонента. Т.е. one way dataflow нарушается. При этом не между парой компонентов, а между глубокой группы. Это работает, и даже эффективно, но надо понимать, что это плохая практика, противоречащая основному интерфейсу взаимодействия компонентов во Vue

Grigorii K. Shartsev
Но у вас идёт мутация входа компонента. Т.е. one w...

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

Artyom Tuchkov
я это, конечно, понимаю, но я не вижу более красив...

Ну вот Артём выше предложил провайдить не только объект, но и сеттер для этого объекта. Это уже решает проблему мутации

Grigorii K. Shartsev
И все эти 7 уровней как-то меняют данные?

да, это подразделы профиля, при этом они могут содержать под собой ещё небольшие обертки, которые тоже могут что-то менять

Grigorii K. Shartsev
Ну вот Артём выше предложил провайдить не только о...

этот вариант, кстати, тоже не без недостатков - в каждом дочернем компоненте придется делать deep clone объекта, иначе v-model будет мутировать оригинальный объект либо можно заменить v-model на bind + event, но это вообще будет плохо

Artyom Tuchkov
этот вариант, кстати, тоже не без недостатков - в ...

сеттер может быть не целиком на весь объект

Grigorii K. Shartsev
сеттер может быть не целиком на весь объект

да, но без deep clone тут никак, либо нужно отказываться от v-model

Artyom Tuchkov
да, но без deep clone тут никак, либо нужно отказы...

Глубокое клонирование нужно только при сеттере глубокого объекта. Сеттер может не делать этого. Можно иметь много сеттеров, можно сеттеру передавать, что именно менять и тп

Grigorii K. Shartsev
Глубокое клонирование нужно только при сеттере глу...

не очень уловил мысль, если честно объект с глубокой вложенностью и любое изменение глубоко вложенного свойства повлияет на оригинальный объект, если не сделать deep clone во всех дочерних компонентах я юзаю v-model, т.е. как раз изменяются свойства объекта

Artyom Tuchkov
не очень уловил мысль, если честно объект с глубо...

Изменять можно не целиком объект, а конкретное его свойство, для этого не надо заменять весь целиком объект

Grigorii K. Shartsev
Изменять можно не целиком объект, а конкретное его...

obj = { a: { b: 1 } } без deep clone нельзя заменить obj.a.b так, чтобы это не повлияло на оригинальный объект

Artyom Tuchkov
obj = { a: { b: 1 } } без deep clone нельзя замен...

Вы можете мутировать там где передаёте

Artyom Tuchkov
obj = { a: { b: 1 } } без deep clone нельзя замен...

setObjB(value) { obj.a.b = value } setObjAField(value, key) { obj.a[key] = value } Ну и тд

Artyom Tuchkov
obj = { a: { b: 1 } } без deep clone нельзя замен...

Влиять на оригинальный объект его владельцу - можно

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта