私は、(作成されたフックで)1回ロードされるカテゴリ配列を持ち、それは常に静的です。この配列値をコンポーネントテンプレートでレンダリングします。
<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 throwエラー-myArrayをテンプレートで使用できません。DOMの作成時にこの変数が作成されないためです-マウントされています。
それでこれをどうやってやるの?または、コンポーネント定数をどこに保存できますか?
Vueは、data
オプションのすべてのプロパティをセッター/ゲッターに設定して、それらをリアクティブにします。 反応性の深さ を参照してください
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 です
実際、created()
のthis
にプロパティを設定することは、すぐに使えるはずです:
<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>
レンダリングします
<div id="app">
<ul>
<li>
item 1
</li>
<li>
item 2
</li>
</ul>
</div>
ここのデモ: https://codesandbox.io/s/r0yqj2orpn .
私はこのような静的データ(非リアクティブ)を使用することを好みます:
注:このコードの優れた点は、コメントのsamuelantonioli here です。
data
に保存する場合、適切な方法は Object.freeze() を使用することです。これは documentation で説明されています。
これの唯一の例外はObject.freeze()の使用です。これは、既存のプロパティが変更されるのを防ぎます。これは、反応性システムが変更を追跡できないことも意味します。