J'ai besoin d'obtenir des données de stockage (données propres) et des données modifiées. J'essaye de faire ceci comme ceci:
mounted() {
this.newdata = this.storedata;
}
Mais lorsque je change this.newdata, les données stockées deviendront automatiquement. Comment puis-je éviter cela? J'ai besoin de données stockées ne peuvent pas être modifiées. Dans storedata a des rappels, pas seulement des accessoires.
3 Réponses :
si les données storedata sont un tableau
this.newdata = this.storedata.slice();
si storedata est json
this.newdata = { ...this.storedata };
si les données storedata sont des chaînes
this.newdata = [ ...this.storedata ];
je ne comprends pas comment cela m'aide?
semble que vos données stockées soient le tableau, alors reportez-vous à this.newdata = [... this.storedata];
Les primitives ( string incluse) ne sont pas transmises par référence. Ils sont passés par valeur. Ce qui signifie qu'une copie d'une chaîne ne référencera jamais la chaîne d'origine et en créera toujours une nouvelle avec la même valeur. La tranche n'est donc pas nécessaire pour les chaînes. Notez également que la diffusion ne clone que le niveau supérieur, mais toute propriété imbriquée plus profonde contenant une référence (un tableau ou un objet) pointera vers la même référence à la fois dans l'original et dans le clone.
Si storedata est un tableau ou un objet ou un tableau d'objets, vous pouvez utiliser une bibliothèque de Lodash . Il storedata intégralité de vos données storedata vers une nouvelle varibale et toute modification de newData n'affectera pas les données storedata .
<script>
import _ from 'lodash'
export default {
mounted() {
this.newdata = _.cloneDeep(this.storedata)
}
}
</script>
Pour une copie superficielle [1-level deep], vous pouvez utiliser l'opérateur de diffusion comme ceci: this.newdata = [ ...this.storedata ];
Si vous souhaitez cloner un tableau imbriqué profond, vous pouvez utiliser cloneDeep de lodash
<script>
import cloneDeep from 'lodash.cloneDeep'
export default {
mounted() {
this.newdata = cloneDeep(this.storedata)
}
}
</script>
et voici comment vous l'utilisez
yarn add lodash.cloneDeep
Les deux méthodes ci-dessus vous aideront à créer un tableau propre en utilisant une nouvelle référence
Objet avec de nombreux accessoires et callbacks (comme list: [{callback: this.itemChanger, id: 45}])
Votre titre implique que vous ne voulez pas cloner l'original, mais votre question implique que vous ne voulez pas changer l'original. Ça ne peut pas être les deux