VUE2升級成VUE3的優(yōu)化與區(qū)別

大家好球散,我是小編阿賢溉奕。歡迎各位大神關(guān)注《全棧技術(shù)圈》瘾敢,讓技術(shù)更加簡單易懂。

1. vue2和vue3實例區(qū)別

1.1 創(chuàng)建一個vue2實例

在vue2里面的Vue是一個構(gòu)造函數(shù),通過該構(gòu)造函數(shù)創(chuàng)建一個Vue實例肯尺,data選項可以是對象侧巨,也可以是方法返回一個對象舅锄。可以通過el選項指定一個掛載的容器司忱,也可以通過$mount()方法指定掛載的容器皇忿。

 new Vue({
  el: '#app',
  data: {
    name: 'Vue2',
    age: '6'
  }
}).$mount('#app') 

1.2 創(chuàng)建一個vue3實例

在vue3里面Vue是一個對象碉怔,通過該對象的createApp()方法,創(chuàng)建一個Vue實例禁添。vue3中撮胧,取消了el選項。vue3中老翘,無論是組件和是vue實例芹啥,data選項都必須是一個方法,由方法返回對象铺峭。

Vue.createApp({
  //el: '#app',
  data() {
    return {
      name: 'Vue3',
        age: '2'
      }
  }
}).mount('#app')

2.Vue2和Vue3的響應(yīng)式區(qū)別

2.1 vue2的響應(yīng)式

在addSex方法中后添加的屬性是非響應(yīng)式的墓怀。在delName方法中直接使用delete方式刪除對象的屬性后,不具備響應(yīng)式卫键。在addFood方法中操作數(shù)組后同時要具有響應(yīng)式傀履。推薦使用$set方法根據(jù)下標(biāo)添加數(shù)組元素,確保新添加的元素同樣具備響應(yīng)式莉炉。在delFood方法中直接根據(jù)下標(biāo)刪除數(shù)組元素钓账,不具備響應(yīng)式。

new Vue({
  el:'#app',
  data:{
    student:{
      name:'張三',
      age:20
    },
    foods:['魚翅','松茸','魚子醬','帝王蟹','熊掌']
  },
  methods: {
    addSex(){ //添加性別
      // this.student.sex='男'
      //可以通過$forceUpdate()強(qiáng)制頁面更新一次
      // this.$forceUpdate()
      //推薦使用$set方法給對象添加新的屬性絮宁,確保新添加的屬性同樣具備響應(yīng)式
      this.$set(this.student,'sex','男')
    },
    delName(){ //刪除姓名
      // 不具備響應(yīng)式
      // delete this.student.name
      //使用$delete方法梆暮,刪除對象的屬性后,繼續(xù)具備響應(yīng)式
      this.$delete(this.student,'name')
    },
    addFood(){ //添加食物
      // 具有響應(yīng)式绍昂,必須要使用下面的方法:
      // push pop unshift shift sort reverse splice
      // this.foods.push('佛跳墻')
      // this.foods[5] = '佛跳墻'
      // this.$forceUpdate()
      this.$set(this.foods,5,'佛跳墻')
    },
    //刪除食物
    delFood(){
      // this.foods.splice(3,1)
      //不具備響應(yīng)式
      // this.foods[3] = null
      //使用$delete方法啦粹,刪除數(shù)組中指定位置的元素,繼續(xù)具備響應(yīng)式
      this.$delete(this.foods,3)
    }
  }
})

2.2 vue3修復(fù)了vue2中響應(yīng)式的所有缺陷

vue3后續(xù)新增屬性值具有響應(yīng)式窘游,delete自己刪除屬性也具有響應(yīng)式唠椭。

 Vue.createApp({
  data() {
    return {
      student:{
        name:'張三',
        age:20
      },
      foods:['魚翅','松茸','魚子醬','帝王蟹','熊掌']
    }
  },
  methods: {
    addSex(){
      this.student.sex = '男'
    },
    delName(){
      delete this.student.name
    },
    addFood(){
      this.foods[5] = '佛跳墻'
    },
    delFood(){
      delete this.foods[3]
    }
  }
}).mount("#app")

3 Vue2和Vue3的響應(yīng)式原理

3.1 vue2的響應(yīng)式原理

vue2在實例化時,會將data里面的所有數(shù)據(jù)采用 Object.defineProperty 進(jìn)行處理忍饰,實現(xiàn)實現(xiàn)響應(yīng)式功能贪嫂。但是你之后往data里面添加的數(shù)據(jù),由于沒有采用 Object.defineProperty 進(jìn)行處理喘批,所以不具備響應(yīng)式撩荣。$set()方法,內(nèi)部就是對單個屬性重新采用 Object.defineProperty 進(jìn)行處理饶深,從而具備響應(yīng)式餐曹。

//源對象
let obj = {
  name:'張三',
  age:20,
  sex:'男'
};
document.querySelector('#name').innerHTML = obj.name;
document.querySelector('#age').innerHTML = obj.age;
document.querySelector('#sex').innerHTML = obj.sex;
//定義一個obj2對象,作為obj的代理對象
let obj2 = {};
//通過Object.defineProperty方法敌厘,給obj2添加屬性
Object.defineProperty(obj2, 'name', {
  //讀取屬性的值台猴,調(diào)用get方法
  get(){
    return obj.name;
  },
  //設(shè)置屬性的值,調(diào)用set方法
  set(val){
    obj.name = val;
    document.querySelector('#name').innerHTML = obj.name;
  }
});
Object.defineProperty(obj2, 'age', {
  //讀取屬性的值,調(diào)用get方法
  get(){
    return obj.age;
  },
  //設(shè)置屬性的值饱狂,調(diào)用set方法
  set(val){
    obj.age = val;
    document.querySelector('#age').innerHTML = obj.age;
  }
});
Object.defineProperty(obj2,'sex',{
  //讀取屬性的值曹步,調(diào)用get方法
  get(){
    return obj.sex
  },
  //設(shè)置屬性的值,調(diào)用set方法
  set(val){
    obj.sex = val
    document.querySelector('#sex').innerHTML = obj.sex
  }
});

3.2 vue3的響應(yīng)式原理

使用new Proxy()創(chuàng)建一個代理對象休讳,通過放射對象從指定的對象身上發(fā)射出指定的屬性值讲婚。

// 源對象
let obj3 = {
  name:'張三',
  age:20,
  sex:'男'
}
document.querySelector('#name2').innerHTML = obj3.name
document.querySelector('#age2').innerHTML = obj3.age
document.querySelector('#sex2').innerHTML = obj3.sex
let obj4 = new Proxy(obj3, {
  //獲取屬性
  get(target, property){
    // 直接返回源對象身上的指定的屬性值
    // return target[property];
    // 通過放射對象從指定的對象身上發(fā)射出指定的屬性值
    return Reflect.get(target, property);
  },
  //設(shè)置屬性
  set(target, property, value){
    // target[property] = value;
    Reflect.set(target,property,value);
    document.querySelector(`#${property}2`).innerHTML = Reflect.get(target,property);
  },
  //刪除屬性
  deleteProperty(target, property){
    // return delete target[property];
    document.querySelector(`#${property}2`).remove();
    return Reflect.deleteProperty(target,property);
  }
});

4 Vue3新推出的組合式API

4.1 vue2中只能這樣寫代碼,vue3也可以這樣寫

data() {
  return {
    carName:'保時捷',
    carPrice:'100W'
  }
},
methods: {
  updateCar(){
    this.carName = '特斯拉'
    this.carPrice = '80W'
  }
}

4.2 vue3引入了全新的功能俊柔,組合式API

組合式api的作用是:將原來分散開來定義的數(shù)據(jù)筹麸,方法,計算屬性雏婶,監(jiān)聽器物赶,組合起來定義一個完整的業(yè)務(wù)。

// ref用于定義響應(yīng)式數(shù)據(jù)
let {ref} = Vue
Vue.createApp({
  // setup是組合式api的舞臺留晚,所有的組合式api都要在setup里面使用
  setup() {
    //定義汽車相關(guān)數(shù)據(jù)
    // 使用ref()方法酵紫,定義一個響應(yīng)式對象
    let carName=ref('保時捷')
    let carPrice=ref('100W')
    //定義汽車相關(guān)方法
    function updateCar(){
      //修改對象的值,要通過value屬性
      carName.value = '特斯拉'
      carPrice.value = '80W'
    }
    return{
      //返回汽車相關(guān)數(shù)據(jù)
      carName,
      carPrice,
      updateCar,
    }
  })
})

總結(jié):

Vue2升級Vue3帶來更快的改動主要有兩方面
1错维、vue3重新審視了 vdom奖地,更改了自身對于 vdom的對比算法。vdom從之前的每次更新需五,都進(jìn)行一次完整遍歷對比鹉动,改為了切分區(qū)塊樹轧坎,來進(jìn)行動態(tài)內(nèi)容更新宏邮。也就是只更新 vdom的綁定了動態(tài)數(shù)據(jù)的部分,把速度提高了6倍缸血;
2蜜氨、 把 definePerproty改為了 proxy,對于 JavaScript引擎更加友好捎泻,響應(yīng)更加高效飒炎。
本篇文件先寫到這后續(xù)我們在深入Vue3升級改動。歡迎各位大神關(guān)注《全棧技術(shù)圈》笆豁,讓技術(shù)更加簡單易懂郎汪。

關(guān)注全棧技術(shù)圈,全面提升技術(shù)闯狱。

本作品系原創(chuàng)煞赢。禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者哄孤。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末照筑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凝危,老刑警劉巖波俄,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蛾默,居然都是意外死亡懦铺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進(jìn)店門支鸡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來阀趴,“玉大人,你說我怎么就攤上這事苍匆×跫保” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵浸踩,是天一觀的道長叔汁。 經(jīng)常有香客問我,道長检碗,這世上最難降的妖魔是什么据块? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮折剃,結(jié)果婚禮上另假,老公的妹妹穿的比我還像新娘。我一直安慰自己怕犁,他們只是感情好边篮,可當(dāng)我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奏甫,像睡著了一般戈轿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上阵子,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天思杯,我揣著相機(jī)與錄音,去河邊找鬼挠进。 笑死色乾,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的领突。 我是一名探鬼主播暖璧,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼攘须!你這毒婦竟也來了漆撞?” 一聲冷哼從身側(cè)響起殴泰,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浮驳,沒想到半個月后悍汛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡至会,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年离咐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奉件。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡宵蛀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出县貌,到底是詐尸還是另有隱情术陶,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布煤痕,位于F島的核電站梧宫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏摆碉。R本人自食惡果不足惜塘匣,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望巷帝。 院中可真熱鬧忌卤,春花似錦、人聲如沸楞泼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽现拒。三九已至辣垒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間印蔬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工脱衙, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留侥猬,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓捐韩,卻偏偏與公主長得像退唠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子荤胁,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容