Cause
Lorsque j'ai imprimé les attributs dans l'objet de données sous l'instance Vue, j'ai trouvé une chose intéressante :
Chacun de ses attributs Il y a deux méthodes get et set correspondantes. J'ai pensé que c'était inutile, alors je suis allé en ligne pour vérifier le principe de mise en œuvre de la liaison bidirectionnelle Vue, seulement pour découvrir qu'il est complètement différent du principe de mise en œuvre de la liaison bidirectionnelle Angular.js. Il utilise la détection des données sales. Lorsque le modèle change, il détectera si toutes les vues sont liées aux données pertinentes, puis modifiera les vues. Le modèle de publication-abonnement utilisé par Vue est une liaison de données point à point.
La liaison de données de Vue ne comporte que deux étapes, compile=>link.
J'ai réfléchi à la façon dont Vue surveille les modifications apportées par les utilisateurs au modèle. Ce n'est que lorsque j'ai découvert que chaque attribut des données de Vue avait défini et obtenu des attributs que j'ai compris.
En temps normal, on crée un objet et on modifie ses propriétés, comme ceci :
var obj = { val:99 } obj.val = 100; console.log(obj.val)//100
Il n'y a pas de problème, mais si on vous a demandé de surveiller et de faire quelque chose lorsque je modifiais les propriétés de cet objet, que feriez-vous ?
Pensées connexes
Cela nécessite l'utilisation de getters et de setters.
Supposons que je veuille ajouter un attribut de nom à un objet codeur, et chaque fois que je mets à jour l'attribut de nom, je dois compléter quelque chose. Nous pouvons faire ceci :
var Coder = function() { var that = this; return { get name(){ if(that.name){ return that.name } return '你还没有取名' }, set name(val){ console.log('你把名字修成了'+val) that.name = val } } } var isMe = new Coder() console.log(isMe.name) isMe.name = '周神' console.log(isMe.name) console.log(isMe)
< 🎜. >
Sortie : Vous constaterez que l'effet imprimé de cet objet est le même que l'objet de données dans Vue en haut, les deux ont le mêmes propriétés get et set. Analysons le code ci-dessus étape par étape, c'est très intéressant. Nous créons d'abord un objet littéral :var Coder = function() {...}
var that = this;
La chose suivante est la plus importante, on renvoie un objet :
{ get name(){...}, set name(val){...} }
isMe.name="周神"
var Coder = function() { } Coder.prototype.__defineGetter__('name', function() { if (this.name) { return this.name }else{ return '你还没有取名' } }) Coder.prototype.__defineSetter__('name', function(val) { this.name = val }) var isMe = new Coder() console.log(isMe.name) isMe.name = '周神' console.log(isMe.name) console.log(isMe)