J'ai un tableau de catégories, qui est chargé une fois (dans le crochet créé), puis il est statique tout le temps. Je rend les valeurs de ce tableau dans un modèle de composant.
<template>
<ul>
<li v-for="item in myArray">{{ item }}</li>
</ul>
</template>
Ma propriété de données ressemble (elle n'inclut pas myArray - je ne veux pas de liaison réactive):
data() {
return {
someReactiveData: [1, 2, 3]
};
}
Mon crochet de création:
created() {
// ...
this.myArray = ["value 1", "value 2"];
// ...
}
Le problème est que Vue erreur de projection - je ne peux pas utiliser myArray dans un modèle, car cette variable n'est pas créée lorsque le DOM est créé - monté.
Alors comment le faites vous? Ou où peuvent être stockées les constantes des composants?
Vue définit toutes les propriétés de l'option data
sur les setters/getters pour les rendre réactifs. Voir Réactivité en profondeur
Comme vous voulez que myArray
soit statique, vous pouvez le créer comme une option personnalisée accessible à l'aide de 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"];
}
}
vous pouvez parcourir ces options personnalisées dans votre modèle comme suit:
<template>
<ul>
<li v-for="item in $options.myArray">{{ item }}</li>
</ul>
</template>
Voici le violon
En fait, la définition des propriétés sur this
dans created()
devrait fonctionner hors de la boîte:
<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>
rendra
<div id="app">
<ul>
<li>
item 1
</li>
<li>
item 2
</li>
</ul>
</div>
Démonstration ici: https://codesandbox.io/s/r0yqj2orpn .
Je préfère utiliser des données statiques (non réactives) comme ceci:
Créez un mixin (je le nomme static_data.js
) avec le contenu suivant
Dans vos composants où vous souhaitez utiliser des données statiques, vous pouvez:
Remarque: Le génie de ce code est samuelantonioli dans les commentaires ici .
Si vous voulez le garder dans data
, la bonne façon utilise Object.freeze () , comme décrit dans la documentation :
La seule exception à cela est l'utilisation de Object.freeze (), qui empêche les propriétés existantes d'être modifiées, ce qui signifie également que le système de réactivité ne peut pas suivre les modifications.