#javascript #vue.js #vuejs3 #multiple-instances
Вопрос:
Мне не нужно передавать данные между родительским компонентом дочернему или наоборот, мне нужно что-то вроде статических переменных php/c.
Я хочу, чтобы мой sfc (компонент с одним файлом) содержал некоторые данные, которые являются общими для всех экземпляров на странице.
Насколько я понимаю, именно поэтому в sfc мы определяем data
как функцию
export default {
data(){
return {
// props here
};
}
}
в то время как в скриптах страниц мы можем определить его как объект
const app = new Vue({
data: {
// props here
},
}
Это связано с тем , что, поскольку у нас может быть несколько экземпляров sfc на странице, определяющих его данные как функцию, каждый экземпляр должен выполняться и получать свой собственный data
, в то время как со сценарием страницы у нас может быть экземпляр singe.
Мне нужно определить некоторые из моих данных sfc, которые будут использоваться совместно экземплярами компонентов, в то время как другие данные должны быть для каждого экземпляра.
Есть ли способ сделать это?
Ответ №1:
Это зависит от определяемых данных, их сложности и назначения.
Если это 2 или 3 переменные только для чтения, их можно задать в качестве глобальных свойств с помощью Vue.prototype
(Vue 2) или app.config.globalProperties
(Vue 3). Я не уверен, потому что в вашем примере вы используете синтаксис Vue 2.
Если данные должны быть реактивными, вы можете настроить простое управление состоянием, как описано в документации Vue: Простое управление состоянием.
Если данные более сложны, чем это, следующим шагом будет Vuex.
Комментарии:
1. Простое управление состоянием кажется лучшим вариантом, но я не могу понять, как реализовать его в одном компоненте файла, каждый пример, который я нашел, использует обычный js, а не sfc; вы можете указать мне правильное направление?
Ответ №2:
Следуя ответу @Igor, я изучил простое управление состоянием и нашел метод ref (), который создает реактивные примитивные значения.
В моем конкретном случае использования мне нужно было разделить между всеми экземплярами sfc только массив, поэтому в моем sfc у меня был:
const reactive_array = ref([]);
export default {
data() {
return {
shared_array: reactive_array,
};
},
};