Maison interface Web Questions et réponses frontales Quelles sont les méthodes d'initialisation des données dans Vue ?

Quelles sont les méthodes d'initialisation des données dans Vue ?

Dec 26, 2022 pm 06:09 PM
vue vue3

Vue propose deux manières d'initialiser les données : 1. Mode objet, syntaxe "var data = {paire clé-valeur }" ; 2. Mode fonction, syntaxe "data : function () {return {paire clé-valeur }}" . Il est à noter que l'initialisation des données dans les composants et l'extension ne peut pas être un objet, sinon une erreur sera signalée. L'objectif de l'utilisation du mode fonction pour les données dans les composants est d'empêcher plusieurs objets d'instance de composant de partager les mêmes données et de provoquer une pollution des données.

Quelles sont les méthodes d'initialisation des données dans Vue ?

L'environnement d'exploitation de ce tutoriel : système windows7, version vue3, ordinateur DELL G3.

Les données Vue ont deux manières de les initialiser, fonction et objet, mais quels sont les scénarios applicables pour ces deux situations ? Est-ce que cela peut être universel ? Avec ces deux questions, analysons-les ensemble

initialisation des données

// 代码来源于官网示例

// 第一种定义方式
var data = { a: 1 }

// 直接创建一个实例
var vm = new Vue({
  data: data
})

// Vue.extend() 中 data 必须是函数
var Component = Vue.extend({
// 第二种定义方式
  data: function () {
    return { a: 1 }
  }
})
Copier après la connexion

Le code ci-dessus décrit simplement les deux manières de définir les données

  • fonction

  • objet

Il est également dans le démo du site officiel Il est souligné que l'objet ne peut pas être utilisé pour l'initialisation des données dans une certaine mesure. Alors pourquoi ?

Analyse du code source

Selon la démo du site officiel, l'initialisation des données dans Vue.extend ne peut pas être un objet. Que se passera-t-il si nous forçons à l'écrire en tant qu'objet ?

var Component = Vue.extend({
  data: { a: 1 }
})
Copier après la connexion

Après l'exécution, la console de Chrome signale directement une erreur, les informations sont les suivantes

vue.esm.js?efeb:591 [Vue warn]: The "data" option should be a function that returns a per-instance value in component definitions.
Copier après la connexion

En analysant le code source et le message d'erreur, lorsque Vue.extend est déclenché, il effectuera une opération de fusion et combinera un composant de base (à l'intérieur vmode, traduction, etc.) avec Les informations que vous définissez dans extend sont fusionnées en options via mergeField. Une fois fusionnées avec les données, elles déclencheront strats.data, qui vérifiera si les données sont une fonction à laquelle il faut prêter attention. voici les filtres, les composants, etc. Les données suivent deux ensembles de processus de fusion. Veuillez consulter les commentaires du code pour plus de détails, comme suit

// vue.extend 源码地址https://github.com/vuejs/vue/blob/dev/src/core/global-api/extend.js

  Vue.extend = function (extendOptions: Object): Function {
  ...
  // 在这里会触发mergeOptions方法
  Sub.options = mergeOptions(
      Super.options,
      extendOptions
    )
  ...
}

// mergeOptions 源码地址https://github.com/vuejs/vue/blob/dev/src/core/util/options.js

export function mergeOptions (
  parent: Object,
  child: Object,
  vm?: Component
): Object {
  ...

  const options = {}
  let key
  // parent对象内包含components、filter,、directive
  for (key in parent) {
    mergeField(key)
  }
  // child对象内对应的是Vue.extend内定义的参数
  for (key in child) {
    if (!hasOwn(parent, key)) {
      mergeField(key)
    }
  }
  function mergeField (key) {
  // 这一步是根据传入的key找到不同的合并策略filter、components、directives用到合并策略是这个方法mergeAssets和data用到的不一样,当合并到data的时候会进入专属的合并策略方法内
    const strat = strats[key] || defaultStrat
    options[key] = strat(parent[key], child[key], vm, key)
  }
}

// strats.data  源码地址https://github.com/vuejs/vue/blob/dev/src/core/util/options.js
strats.data = function (
  parentVal,
  childVal,
  vm
) {
  if (!vm) {
  // 如果data不是function的话会直接走下面的报错信息
    if (childVal && typeof childVal !== 'function') {
      process.env.NODE_ENV !== 'production' && warn(
        'The "data" option should be a function ' +
        'that returns a per-instance value in component ' +
        'definitions.',
        vm
      );

      return parentVal
    }
    return mergeDataOrFn(parentVal, childVal)
  }

  return mergeDataOrFn(parentVal, childVal, vm)
};
Copier après la connexion

Autres situations

En fait, notre code ci-dessus n'est qu'un processus simple. développement réel, des situations similaires incluent : dans les sous-composants, Data ne peut pas être défini comme un objet dans la route, car ils appellent tous la méthode mergeOptions en bas. Quand peut-il être défini comme un objet Lorsque vue est initialisée ? est la signification de

new Vue({
  data: {
    linke: '//sinker.club'
  }
})
Copier après la connexion

ok, tant de choses ont été dites ci-dessus, alors à quoi ça sert de faire ça ? Pourquoi ces situations ne peuvent-elles pas être définies comme des objets ? En fait, pour répondre à cette question, vous devez revenir à js lui-même. Comme nous le savons tous, les types de données js sont divisés en types de référence et de base. Les types de référence incluent Object, Array et Function. expliqué ici

  var obj = {link: '//www.sinker.club'}
  var obj2 = obj
  var obj3 = obj
  obj2.link = "//gitlab.sinker.club"
  console.log(obj3.link) // "//gitlab.sinker.club"
Copier après la connexion

Le code ci-dessus reflète un problème, car obj3 et obj2 pointent tous deux vers une adresse en mémoire, donc la modification d'obj2 affectera obj3. Bien sûr, la copie profonde peut être utilisée pour résoudre ce problème

. JSON.parse(JSON.stringify(obj))

deepClone(obj)

  • Mais ces deux méthodes nécessitent à chaque fois un développement ou une copie approfondie du framework. Lorsque la quantité de données est importante, ce n'est pas le cas. convivial pour les performances. Alors, comment Vue fait-il ? Définir les données comme une fonction

    function data() {
      return {
       link: '//sinker.club'
      }
    }
    
    var obj = test()
    var obj2 = test()
    
    obj2.link ="//gitlab.sinker.club"
    console.log(obj.link) '//sinker.club'
    Copier après la connexion

  • Pourquoi fais-tu ça ? Quel est le scénario de solution ?

Par exemple, si je définis un sous-composant, les données sont définies comme un objet. Ce composant est référencé à plusieurs endroits. Si l'une des données référençant ce composant est modifiée, les autres données référençant ce composant le seront. être modifié en même temps. Changer, terminer.

Connaissances étendues :

Lors de la définition de l'instance de vue, l'attribut data peut être soit un objet, soit une fonction

const app = new Vue({
    el:"#app",
    // 对象格式
    data:{
        foo:"foo"
    },
    // 函数格式
    data(){
        return {
             foo:"foo"
        }
    }
})
Copier après la connexion

L'attribut data défini dans le composant peut être uniquement une fonction

Si si les données du composant sont directement définies comme un objet

Vue.component('component1',{
    template:`<div>组件</div>`,
    data:{
        foo:"foo"
    }})
Copier après la connexion
, vous recevrez un message d'avertissement

Explication :

Les composants Vue sont utilisés pour être réutilisés. empêcher la réutilisation des données, définissez-la comme une fonction . Quelles sont les méthodes dinitialisation des données dans Vue ?

Les données du composant vue doivent être isolées les unes des autres et ne pas s'influencer les unes les autres. Chaque fois que le composant est réutilisé, les données doivent être copiées une fois. Plus tard, lorsqu'elles sont réutilisées quelque part, les données contenues dans. le composant sera copié. Lors de la modification, les données des autres composants locaux réutilisés ne seront pas affectées, vous devez donc renvoyer un objet comme état du composant via la fonction de données.

  • Lorsque nous écrivons les données dans le composant en tant que fonction, les données sont définies sous la forme d'une valeur de retour de fonction, de sorte qu'à chaque fois que le composant est réutilisé, une nouvelle donnée sera renvoyée avec sa propre portée, similaire à donner à chaque instance de composant crée un espace de données privé, permettant à chaque instance de composant de conserver ses propres données.

  • Lorsque la date de notre composant est simplement écrite sous forme d'objet, ces instances utilisent le même constructeur. En raison des caractéristiques de JavaScript, toutes les instances du composant partagent les mêmes données, ce qui entraînera un changement et tous les résultats.

【Recommandations associées : tutoriel vidéo vuejs, développement web front-end

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment utiliser Bootstrap en Vue Comment utiliser Bootstrap en Vue Apr 07, 2025 pm 11:33 PM

L'utilisation de bootstrap dans vue.js est divisée en cinq étapes: installer bootstrap. Importer un bootstrap dans main.js. Utilisez le composant bootstrap directement dans le modèle. Facultatif: style personnalisé. Facultatif: utilisez des plug-ins.

Comment ajouter des fonctions aux boutons pour Vue Comment ajouter des fonctions aux boutons pour Vue Apr 08, 2025 am 08:51 AM

Vous pouvez ajouter une fonction au bouton VUE en liant le bouton dans le modèle HTML à une méthode. Définissez la logique de la fonction de méthode et d'écriture dans l'instance Vue.

Comment utiliser Watch in Vue Comment utiliser Watch in Vue Apr 07, 2025 pm 11:36 PM

L'option Watch dans Vue.js permet aux développeurs d'écouter des modifications de données spécifiques. Lorsque les données changent, regardez déclenche une fonction de rappel pour effectuer des vues de mise à jour ou d'autres tâches. Ses options de configuration incluent immédiatement, qui spécifie s'il faut exécuter un rappel immédiatement, et profond, ce qui spécifie s'il faut écouter récursivement les modifications des objets ou des tableaux.

Que signifie le développement de plusieurs pages Vue? Que signifie le développement de plusieurs pages Vue? Apr 07, 2025 pm 11:57 PM

Le développement multi-pages VUE est un moyen de créer des applications à l'aide du cadre Vue.js, où l'application est divisée en pages distinctes: Maintenance du code: La division de l'application en plusieurs pages peut rendre le code plus facile à gérer et à maintenir. Modularité: chaque page peut être utilisée comme module séparé pour une réutilisation et un remplacement faciles. Routage simple: la navigation entre les pages peut être gérée par une configuration de routage simple. Optimisation du référencement: chaque page a sa propre URL, ce qui aide le référencement.

Comment référencer le fichier JS avec Vue.js Comment référencer le fichier JS avec Vue.js Apr 07, 2025 pm 11:27 PM

Il existe trois façons de se référer aux fichiers JS dans Vue.js: spécifiez directement le chemin à l'aide du & lt; script & gt; étiqueter;; importation dynamique à l'aide du crochet de cycle de vie monté (); et l'importation via la bibliothèque de gestion de l'État Vuex.

Comment revenir à la page précédente par Vue Comment revenir à la page précédente par Vue Apr 07, 2025 pm 11:30 PM

Vue.js dispose de quatre méthodes pour revenir à la page précédente: $ router.go (-1) $ router.back () utilise & lt; router-link to = & quot; / & quot; Composant Window.History.back (), et la sélection de la méthode dépend de la scène.

Comment utiliser Vue Traversal Comment utiliser Vue Traversal Apr 07, 2025 pm 11:48 PM

Il existe trois méthodes courantes pour que Vue.js traverse les tableaux et les objets: la directive V-FOR est utilisée pour traverser chaque élément et les modèles de rendu; La directive V-Bind peut être utilisée avec V-FOR pour définir dynamiquement les valeurs d'attribut pour chaque élément; et la méthode .map peut convertir les éléments du tableau en nouveaux tableaux.

Comment sauter à la div de Vue Comment sauter à la div de Vue Apr 08, 2025 am 09:18 AM

Il existe deux façons de sauter des éléments div dans Vue: Utilisez le routeur Vue et ajoutez le composant routeur-link. Ajoutez l'écouteur de l'événement @Click et appelez ceci. $ Router.push () pour sauter.

See all articles