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

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

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

38 ответов

13 просмотров

через 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 нельзя замен...

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

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

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

А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
Где в Астане можно купить мясо для шашлыков?
Dancing Іңұқәһүғө
21
Добрый день подскажите пожалуйста может кто то сталкивался с ошибками Sentry 22.10.0 развернутым из helm чарт в Kubernetes? Изначально 3 дня назад очень стало много событий ух...
Tire4 Finist Devops
1
;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, стандартный ;вызов процедуры ;option casemap:no...
Егор Анелькин
1
почому оно не работает?
Vi Chapmann ٩( 💢•̀ з•́)و Chapmann
19
всем привет почти закончил курс После него можно писать свою операционку? Какие библиотеки надо использовать и куда дальше копать для изучения
Linus
22
Так а кто может спарсить всех участников чата? Идишники
Magic
18
Карта сайта