我有一个类别数组,它被加载一次(在创建的钩子中),然后它一直是静态的。我在组件模板中渲染此数组值。
<template>
<ul>
<li v-for="item in myArray">{{ item }}</li>
</ul>
</template>
我的数据属性看起来(它不包括myArray - 我不想要反应性绑定):
data() {
return {
someReactiveData: [1, 2, 3]
};
}
我的创建钩子:
created() {
// ...
this.myArray = ["value 1", "value 2"];
// ...
}
问题是,Vue抛出错误 - 我无法在模板中使用myArray,因为在创建DOM时不会创建此变量 - 已挂载。
那怎么办呢?或者在哪里可以存储组件常量?
答案 0 :(得分:17)
Vue将data
选项中的所有属性设置为setter / getters以使它们具有反应性。见Reactivity in depth
由于您希望myArray
是静态的,您可以将其创建为自定义选项,可以使用vm.$options
export default{
data() {
return{
someReactiveData: [1, 2, 3]
}
},
//custom option name myArray
myArray: null,
created() {
//access the custom option using $options
this.$options.myArray = ["value 1", "value 2"];
}
}
您可以按如下方式迭代模板中的自定义选项:
<template>
<ul>
<li v-for="item in $options.myArray">{{ item }}</li>
</ul>
</template>
以下是fiddle
答案 1 :(得分:5)
实际上,在this
的{{1}}上设置属性应该可以直接使用:
created()
将呈现
<template>
<div id="app">
<ul>
<li v-for="item in myArray" :key="item">
{{ item }}
</li>
</ul>
</div>
</template>
<script>
export default {
name: "app",
created() {
this.myArray = [
'item 1',
'item 2'
];
}
};
</script>
答案 2 :(得分:2)
我喜欢这样使用静态数据(非反应性):
注意:这段代码的巧妙之处在于注释here中的samuelantonioli。
答案 3 :(得分:0)
如果要将其保留在data
中,则正确的方法是使用Object.freeze(),如documentation中所述:
唯一的例外是使用Object.freeze(), 防止更改现有属性,这也意味着 反应系统无法跟踪更改。
答案 4 :(得分:0)
您可以尝试以下代码行。您可以复制对象并删除反应性。
var newObj = JSON.parse(JSON.stringify(obj));