#vue.js #vuejs3 #vue-composition-api
#vue.js #vuejs3 #vue-composition-api
Вопрос:
Мне нужно обновить реактивный объект некоторыми данными после выборки:
setup(){
const formData = reactive({})
onMounted(() => {
fetchData().then((data) => {
if (data) {
formData = data //how can i replace the whole reactive object?
}
})
})
}
formData = data
не будет работать, а также formData = { ...formdata, data }
Есть ли лучший способ сделать это?
Ответ №1:
Хотя решение Буссаджры Брахима работает, это не точный ответ на вопрос.
В том смысле, что реактивные данные не могут быть переназначены с =
помощью, но это способ переназначения реактивных данных. Это так Object.assign
.
Поэтому это должно сработать
setup(){
const formData = reactive({})
onMounted(() => {
fetchData().then((data) => {
if (data) {
Object.assign(formData, data) // equivalent to reassign
}
})
})
}
Примечание: Решение — лучший способ, когда ваш реактивный объект пустой или всегда содержит одни и те же ключи; но если, например formData
, имеет key x
и data
не имеет key x
, то после Object.assign
formData
этого все равно будет иметь key x
, так что строго не переназначать.
Ответ №2:
Согласно официальным документам :
Поскольку отслеживание реактивности Vue работает через доступ к свойствам, мы всегда должны сохранять одну и ту же ссылку на реактивный объект. Это означает, что мы не можем легко «заменить» реактивный объект, потому что связь реактивности с первой ссылкой потеряна
reactive
следует определить состояние с вложенными полями, которые могут быть изменены следующим образом :
setup(){
const data= reactive({formData :null })
onMounted(() => {
fetchData().then((data) => {
if (data) {
data.formData = data
}
})
})
}
или используйте ref
, если у вас есть только одно вложенное поле:
setup(){
const formData = ref({})
onMounted(() => {
fetchData().then((data) => {
if (data) {
formData.value = data
}
})
})
}
Комментарии:
1. БУДЬТЕ ОСТОРОЖНЫ, это заменит , а не обновит объект. Ответ с большим количеством голосов следует использовать для большего количества вариантов использования.
2. пожалуйста, прочтите это Это означает, что мы не можем легко «заменить» реактивный объект, потому что соединение реактивности с первой ссылкой теряется из vuejs.org/guide/essentials /…
Ответ №3:
Я думаю , что:
formData = reactive(newObject)
Комментарии:
1. Как это отвечает на вопрос, где OP спрашивает, как обновить объект? Как этот ответ улучшает существующие?
2. Это не сработает. Смотрите документацию здесь: vuejs.org/guide/essentials /…