Поскольку вы уже знаете о сопоставлении магазинов, я полагаю, что вы пытаетесь использовать какую-то форму редактирования, в которой вам нужны фактические данные, взятые из базы данных, а также возможность изменить эти данные для последующей отправки их обратно в базу данных.
Вам не нужен получатель, чтобы иметь простую ссылку на элемент магазина. Вы будете в порядке с mapState
в вашем компоненте:
{
computed: {
...mapState({
user: state => state.user,
}),
}
}
Так что, как только user
изменится в магазине, ваш компонент узнает об этом. И здесь вы можете обновить объект, который вы редактируете. Давайте переименуем его в edit
, чтобы избежать столкновения:
{
data() {
return {
edit: {},
}
},
computed: {
...mapState({
user: state => state.user,
}),
},
watch: {
user: {
immediate: true,
handler(user) {
this.edit = { ...user }
},
},
},
}
Теперь edit
обновляется соответствующим образом, даже если компонент был смонтирован после обновления элемента хранилища (благодаря опции immediate
), и вы можете безопасно изменять его в своем компоненте без какого-либо влияния на ссылку на хранилище.
P.S. Следует отметить, что в этой реализации, если вы хотите иметь реактивность для полей в edit
объекте, то вам нужно обновлять весь объект edit
для каждого обновления его поля следующим образом: this.edit = {...this.edit, [prop]: value}
. Но если вы хотите, чтобы это был естественный способ Vue, то сначала вам нужно инициализировать edit
с фактической структурой объекта, а в наблюдателе для user
выполнить что-то вроде Object.assign(this.edit, user)
.