Bagaimana untuk melaksanakan pengikatan dua hala dalam Vue? Artikel ini akan mengajar anda langkah demi langkah cara menulis pengikatan dua hala untuk vue, supaya semua orang dapat memahami dengan lebih baik arah logik pengikatan dua hala, saya harap ia dapat membantu semua orang.
Artikel ini adalah terutamanya proses menulis dan mengisi perangkap, supaya penonton lebih memahami cara melaksanakan pengikatan dua hala dan arah logik pengikatan dua hala . Setakat ini, langkah demi langkah Mari kita laksanakan pengikatan dua hala dari awal. Ini adalah artikel tutorial kelas Selagi anda mengikuti artikel dan memerhatikan setiap kelas dengan teliti, ia tidak sukar untuk dilaksanakan.
Memulakan ahli sihir? !
Nampak tak betul
Mari kita mulakan semula dengan gambar
Ia boleh dilihat daripada gambar yang new Vue()
dibahagikan kepada dua langkah
Ejen mendengar semua data dan mengaitkan dengan Dep
untuk memberitahu pelanggan tentang kemas kini paparan melalui Dep
. [Pengesyoran berkaitan: tutorial video vuejs]
Menghuraikan semua templat, melanggan data yang digunakan dalam templat dan mengikat fungsi kemas kini, data berlaku Apabila perubahan Dep
memberitahu pelanggan untuk melaksanakan fungsi kemas kini.
Langkah seterusnya ialah menganalisis cara melaksanakannya dan apa yang perlu ditulis Mari kita lihat sekeping kod asas vue ini dari awal
1 2 3 4 |
|
1 2 3 4 5 6 |
|
Daripada kod di atas, kita boleh melihat operasi new Vue
, yang membawa atribut el
dan data
, yang merupakan atribut paling asas dalam kod html, kita tahu itu <div id="app">
ialah nod akar templat yang diberikan oleh vue , jadi untuk memaparkan halaman, Vue mesti melaksanakan kaedah penghuraian templat Compile
kaedah penghuraian juga perlu memproses dua arahan {{ }}
dan v-model
selain menghuraikan templat, kita juga perlu melaksanakan proksi data Ia adalah untuk melaksanakan kelas Observer
seperti yang ditunjukkan dalam kod berikut. Ini melengkapkan kelas Vue
Ia cukup mudah Jika anda berminat dengan class
Jika anda tidak biasa dengan kata kunci, anda disyorkan untuk mempelajarinya terlebih dahulu kelas digunakan di sini, satu ialah kelas data proksi, dan satu lagi ialah kelas templat penghuraian.
1 2 3 4 5 6 7 8 9 10 |
|
Seterusnya, mari tulis kelas Compile
untuk menghuraikan templat Mari kita menganalisisnya sekali lagi Untuk menghuraikan templat, adalah mustahil untuk terus beroperasi pada DOM, jadi kita perlu mencipta serpihan dokumen (DOM maya), dan kemudian menyalin nod DOM templat ke nod DOM maya Selepas nod DOM maya dihuraikan, nod DOM maya Selepas menggantikan nod DOM asal
dan menyalin nod maya, kita perlu melintasi keseluruhan pepohon nod untuk penghuraian Semasa proses penghuraian, atribut atrr DOM akan dilalui untuk mencari arahan berkaitan Vue Selain itu, kandungan nod
mesti dihuraikan untuk menentukan sama ada terdapat pendakap kerinting bergandatextContent
dan langganan kepada atribut yang dihuraikan yang digunakan.
Melaksanakan penghuraian templat kelas Compile
bina kelas
, mula-mula dapatkan nod statik dan kejadian Vue, dan kemudian Tentukan atribut dom maya untuk menyimpan dom mayaCompile
1 2 3 4 5 6 7 8 9 10 11 12 |
|
init()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
parseTemplate
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
实现modelCommand
方法,在模板解析阶段来说,我们只要把 vue实例中data的值绑定到元素上,并实现监听input方法更新数据即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
处理Text元素就相对简单了,主要是将元素中的textContent
内容替换成数据即可
1 2 3 4 5 6 7 8 9 10 |
|
至此已经完成了Compile
类的初步编写,测试结果如下,已经能够正常解析模板
下面就是我们目前所实现的流程图部分
坑点一:
modelCommand
方法中并没有实现双向绑定,只是单向绑定,后续要双向绑定时还需要继续处理坑点二:
parseText
方法上面的代码中并没有去订阅数据的改变,所以这里只会在模板解析时绑定一次数据这里主要是用于代理data中的所有数据,这里会用到一个Object.defineProperty
方法,如果不了解这个方法的先去看一下文档传送门:
文档:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty
Observer
类主要是一个递归遍历所有data中的属性然后进行数据代理的的一个方法
defineReactive
中传入三个参数data
, key
, val
data
和key
都是Object.defineProperty
的参数,而val
将其作为一个闭包变量供Object.defineProperty
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
|
下面我们来测试一下是否成功实现了数据代理,在Vue的构造函数输出一下数据
1 2 3 4 5 6 7 8 9 10 11 |
|
结果如下,我们可以看出已经实现了数据代理。
对应的流程图如下所示
坑点三:
上面我们已经实现了模板解析到初始化视图,还有数据代理。而下面要实现的Dep
类主要是用于管理订阅者和通知订阅者,这里会用一个数组来记录每个订阅者,而类中也会给出一个notify
方法去调用订阅者的update
方法,实现通知订阅者更新功能。这里还定义了一个target
属性用来存储临时的订阅者,用于加入管理器时使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
管理器实现完成之后我们也就实现了流程图中的以下部分。要注意下面几点
Observer
通知Dep
主要是通过调用notify
方法Dep
通知Watcher
主要是是调用了Watcher
类中的update
方法订阅者代码相对少,但是理解起来还是有点难度的,在Watcher
类中实现了两个方法,一个是update
更新视图方法,一个putIn
方法(我看了好几篇文章都是定义成 get 方法,可能是因为我理解的不够好吧)。
cb
方法体,用于更新页面数据Dep
管理器中。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
坑点四:
Watcher
类中的putIn
方法再构造函数调用后并没有加入到管理器中,而是将订阅者本身绑定到target
全局属性上而已通过上面的代码我们已经完成了每一个类的构建,如下图所示,但是还是有几个流程是有问题的,也就是上面的坑点。所以下面要填坑
埋坑 1 和 2
完成坑点一和坑点二,在modelCommand
和parseText
方法中增加实例化订阅者代码,并自定义要更新时执行的方法,其实就是更新时去更新页面中的值即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
埋坑 3
完成坑点三,主要是为了引入管理器,通知管理器发生改变,主要是在Object.defineProperty set
方法中调用dep.notify()
方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
埋坑 4
完成坑点四,主要四将订阅者加入到管理器中
1 2 3 4 5 6 7 8 9 10 11 |
|
完成了坑点四可能就会有靓仔疑惑了,这里是怎么加入的呢Dep.target
又是什么呢,我们不妨从头看看代码并结合下面这张图
至此我们已经实现了一个简单的双向绑定,下面测试一下
完结撒花
本文解释的并不多,所以才是类教程文章,如果读者有不懂的地方可以在评论去留言讨论
Atas ialah kandungan terperinci Ajar anda langkah demi langkah cara melaksanakan pengikatan dua hala vue. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!