#javascript #vue.js
#javascript #vue.js
Вопрос:
Представьте, что у меня есть объект с несколькими реквизитами, который я хочу перевести в состояние «данных» различных компонентов vue в качестве отправной точки или состояния по умолчанию. Я хочу, чтобы каждый компонент мог управлять своим собственным состоянием с момента его инициализации.
Что-то вроде:
import { initialData } from '../../some-data.js'
Vue.component('my-component', {
data: function () {
return {
...initialData,
somethingElse: 'hello there",
}
},
template: 'Hi'
})
Будет ли Vue создавать глубокую копию этого объекта, чтобы при его изменении в результате взаимодействия с пользователем исходный объект (находящийся в some-data.js ) не будет мутировано или мне нужно будет сделать это самому, используя что-то вроде:
import { initialData } from '../../some-data.js'
Vue.component('my-component', {
data: function () {
return {
...JSON.parse(JSON.stringify(initialData)),
somethingElse: 'hello there'
}
},
template: 'Hi'
})
Спасибо.
Ответ №1:
Будет ли Vue создавать глубокую копию этого объекта
Глубокое копирование? Нет, но вы получите мелкую копию для этого компонента, потому что вы создаете новый объект (с расширенным синтаксисом).
Как и при любом мелком копировании, если initialData
содержит объекты, то эти объекты не будут скопированы глубоко, но будут скопированы строки и числа верхнего уровня (и т.д.).
Использование JSON.parse
для выполнения глубокого копирования — это своего рода взлом. Лучше использовать специальный метод глубокого копирования, такой как Lodash _.cloneDeep
. Или вы можете просто написать initialData
как заводскую функцию:
const createInitialData = () => ({
foo: 'bar',
nestedObject: {
blah: 12345
}
})
data() {
return {
...createInitialData(),
somethingElse: 'hello there'
}
}
Комментарии:
1. Вы также можете использовать mixin для установки данных, глубокое копирование или фабрики не нужны, они развязаны, а также объединены с дополнительными данными playcode.io/694463 до тех пор, пока у вас нет одного и того же ключа в данных, этот ключ имеет приоритет
2. @LawrenceCherone Миксин все равно содержит заводскую функцию (
data
это функция). Подход mixin менее гибкий, чем просто использование простой функции, не зависящей от vue. В зависимости от варианта использования это может быть лучшим подходом.
Ответ №2:
Почему бы не попробовать и не посмотреть, что произойдет?
В some-data.js
конце файла добавьте что-то вроде:
setInterval(function() { console.log(initialData) }, 1000);
Затем, когда вы импортируете его, измените что-нибудь и посмотрите, что происходит с журналами.
В любом случае вам, вероятно, следует использовать Vuex.