<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
之前公司招人,面試了一些的前端同學,因為公司使用的前端技術是Vue
,所以免不了問到其響應式原理和Vue
的雙向資料繫結。但是這邊面試到的80%的同學會把兩者搞混,通常我要是先問響應式原理再問雙向資料繫結原理,來面試的同學大都會認為是一回事,那麼這裡我們就說一下二者的區別。
是Vue的核心特性之一,資料驅動檢視,我們修改資料檢視隨之響應更新,就很優雅~
Vue2.x
是藉助Object.defineProperty()
實現的,而Vue3.x
是藉助Proxy
實現的,下面我們先來看一下2.x的實現。
Object.defineProperty(obj, key, { enumerable: true, configurable: true, //攔截get,當我們存取data.key時會被這個方法攔截到 get: function getter () { //我們在這裡收集依賴 return obj[key]; }, //攔截set,當我們為data.key賦值時會被這個方法攔截到 set: function setter (newVal) { //當資料變更時,通知依賴項變更UI } })
我們通過Object.defineProperty
為物件obj
新增屬性,可以設定物件屬性的getter
和setter
函數。之後我們每次通過點語法獲取屬性都會執行這裡的getter
函數,在這個函數中我們會把呼叫此屬性的依賴收集到一個集合中 ;而在我們給屬性賦值(修改屬性)時,會觸發這裡定義的setter
函數,在次函數中會去通知集合中的依賴更新,做到資料變更驅動檢視變更。
3.x的與2.x的核心思想一致,只不過資料的劫持使用Proxy
而不是Object.defineProperty
,只不過Proxy相比Object.defineProperty在處理陣列和新增屬性的響應式處理上更加方便。
let nObj=new Proxy(obj,{ //攔截get,當我們存取nObj.key時會被這個方法攔截到 get: function (target, propKey, receiver) { console.log(`getting ${propKey}!`); return Reflect.get(target, propKey, receiver); }, //攔截set,當我們為nObj.key賦值時會被這個方法攔截到 set: function (target, propKey, value, receiver) { console.log(`setting ${propKey}!`); return Reflect.set(target, propKey, value, receiver); } })
Proxy
的詳細使用方法參考ES6教學。
Vue
的響應式原理的實現細節相信大多數同學已經很熟悉了,這裡就不在展開細談了,如果還想更詳細的瞭解,或者想要做一個簡易的Vue
實現,可以參考這篇Vue原理,相信你會有不小收穫。
雙向資料繫結通常是指我們使用的v-model
指令的實現,是Vue
的一個特性,也可以說是一個input
事件和value
的語法糖。 Vue
通過v-model
指令為元件新增上input
事件處理和value
屬性的賦值。
<template> <input v-model='localValue'/> </template>
上述的元件就相當於如下程式碼
<template> <!-- 這裡新增了input時間的監聽和value的屬性繫結 --> <input @input='onInput' :value='localValue' /> <span>{{localValue}}</span> </template> <script> export default{ data(){ return { localValue:'', } }, methods:{ onInput(v){ //在input事件的處理常式中更新value的繫結值 this.localValue=v.target.value; console.log(this.localValue) } } } </script>
<template> <div> <input @input='onInput' :value='localValue' /> <span>{{localValue}}</span> </div> </template> <script> // import Vue from 'vue'; export default{ data(){ return { localValue:'hello', } }, methods:{ onInput(v){ this.localValue=v.target.value; console.log(this.localValue) } } } </script> <style> .count { color: red; } </style>
因此當我們修改input輸入框中的值時,我們通過v-model繫結的值也會同步修改,基於上述原理,我們可以很容易的實現一個資料雙向繫結的元件。
首先我們定義一個Vue
元件,相信大家已經很熟悉了。
<tempalte> <div class="count" @click="addCount">click me {{value}}</div> </template> <script> export default{ props:{ //關鍵的第一步:設定一個value屬性 value:{ type:Number, default:0 } }, watch:{ //監聽value變化,更新元件localvalue狀態 value(v){ this.localvalue=v; } }, methods:{ //關鍵的第二步:事件觸發localvalue變更,通過事件同步父元件狀態變更 addCount(){ this.localvalue++; this.$emit('input',this.localvalue); } }, data(){ return{ //元件狀態,遵守單項資料流原則,不直接修改props中的屬性 localvalue:0 } }, created(){ //初始化獲取value值 this.localvalue=this.value; } } </script>
上面的元件定了我們通過在props
中新增value
屬性,並且在值更新時觸發input
事件。created
勾點和watch
中為localvalue
賦值是為了同步父元件狀態到子元件中。
通過上面
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45