【インタビュー質問】v-modelの実現原理について語る

チャットパート

まず、双方向のデータバインディング、つまり、データがビューに変更され、ビューがデータに変更される機能について説明します。この機能を React で実現するには、制御されたフォームを記述する必要があります。 vue のコマンド、とても便利です

v-model 命令、この命令は非常に強力であると言えます。双方向のデータ バインディングを実現できます。まずは簡単な使用法を見てください。

<div id="app">
  <input type="text" v-model="message">
  <p>您输入的内容是: {
   
   { message }}</p>
</div>
 
<script>
  var vm = new Vue({
    el: '#app',
    data: {
      message: ''
    }
  });
</script>

このようにして双方向のデータバインディングが実現できるのですが、それが何なのかご存知ですか?

家にもっと近い

この問題に関してはバージョンごとに話さなければなりませんが、Xiaobi も最近 vue3 を完成させたので、最初にそれについて話しましょう。

vue2.x では Object 上のメソッドを使用して応答性を実装していますが、vue3 では Proxy を使用して応答性を実装しています。

vue2.xではv-model命令をObject.defineProperty()メソッドに基づいて変換しgetter/setter、データが変化した場合はsetter関数が該当するビューに更新を通知することで双方向のデータバインディングを実現しています。data 関数によって返されるデータが応答性があることは誰もが知っています。これは、大きなフロントエンド フレームワークの主な機能でもあります。では、応答性とは何でしょうか?

データが変更されると、フレームワークがそれを検出し、ページの更新に役立つことを理解してください。

上記を理解した上で、疑似コードを書いてみましょう

let person = {
    
    
    name: '张三',
    age:20
}
let vm = {
    
    };
Object.defineProperty(vm, 'name', {
    
    
    set(value) {
    
    
        console.log(`有人新增或修改了vm身上的属性name,我要去更新页面了`)
        person.name = value
    },
    get(){
    
    
        return person.name
    }
})
Object.defineProperty(vm, 'age', {
    
    
    set(value) {
    
    
        console.log(`有人新增或修改了vm身上的属性age,我要去更新页面了`)
        person.age = value
    },
    get(){
    
    
        return person.age
    }
})

vm の値が変更されると、ページを更新するロジックがトリガーされ、レスポンシブを実現します。

では、これの何が問題なのでしょうか。なぜ vue3 はそれを最適化するのでしょうか?

1. まず第一に、このメソッドは一度に 1 つのオブジェクトの 1 つのプロパティしか監視できないため、複雑なオブジェクトの場合、最下層はループ処理を使用し、最適化することができません。

2. このメソッドでは属性の追加と削除を監視できません。

3. 配列型の場合、添字等でデータを変更しても検出できません

vue2では注意してください

1. オブジェクトへの属性の追加は直接追加できませんが、渡す必要がありますthis.$set(要操作的对象,添加的属性,值)。そうしないと、Vue,set(要操作的对象,添加的属性,值)ページが検出されてページが更新されます。

2. オブジェクトの属性を削除するには、xxx.xx を直接削除することはできませんが、this.$delete(要操作的对象,删除的属性)

vue3ではプロキシによりレスポンシブデザインを実現しています、疑似コードを見てみましょう

let person = {
    
    
    name: '张三',
    age:20
}

const p = new Proxy(person, {
    
    
    set(target, prop, value) {
    
    
        console.log(`有人新增或修改了p身上的属性${
      
      prop},我要去更新页面了`)
        Reflect.set(target, prop, value)
    },
    get(target, prop) {
    
    
        console.log(`有人读取了p身上的属性${
      
      prop}`)
        return Reflect.get(target, prop)
    },
    deleteProperty(target, prop) {
    
    
        console.log(`有人删除了p身上的属性${
      
      prop},我要去更新页面了`)
        return Reflect.deleteProperty(target, prop)
    }
})

プロキシ メソッドは、オブジェクトのすべてのプロパティを一度に監視でき、プロパティの削除も監視でき、配列型の添え字の変更も検出できるため、2.x で残された問題が解決されます。

エピローグ

1. プロキシによって実装されたデータ応答システムはより柔軟かつ効率的であり、オブジェクト全体をプロキシできます。

2. Object.defineProperty() メソッドは単一のオブジェクト プロパティのみをプロキシでき、オブジェクト全体はループまたは再帰によってのみ監視できます。

3. Vue2.x の応答原理は、Object.defineProperty() に基づいて実現されます。

4. Vue3 の応答原理は、Proxy プロキシ + Reflect に基づいて実現されます。

5. 作るのは簡単ではありませんが、ワンクリックと 3 回連続でやってみましょう。皆さんのサポートが私の最大のモチベーションです。

Guess you like

Origin blog.csdn.net/admin_2022/article/details/130485222