国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

盤點(diǎn) Vue3 與 Vue2 的區(qū)別

這篇具有很好參考價(jià)值的文章主要介紹了盤點(diǎn) Vue3 與 Vue2 的區(qū)別。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、Vue3 與 Vue2 區(qū)別詳述

1. 生命周期

對(duì)于生命周期來說,整體上變化不大,只是大部分生命周期鉤子名稱上 + “on”,功能上是類似的。不過有一點(diǎn)需要注意,Vue3 在組合式API(Composition API,下面展開)中使用生命周期鉤子時(shí)需要先引入,而 Vue2 在選項(xiàng)API(Options API)中可以直接調(diào)用生命周期鉤子,如下所示。

// vue3
<script setup>     
import { onMounted } from 'vue';   // 使用前需引入生命周期鉤子
 
onMounted(() => {
  // ...
});
 
// 可將不同的邏輯拆開成多個(gè)onMounted,依然按順序執(zhí)行,不會(huì)被覆蓋
onMounted(() => {
  // ...
});
</script>
 
// vue2
<script>     
export default {         
  mounted() {   // 直接調(diào)用生命周期鉤子            
    // ...         
  },           
}
</script> 

常用生命周期對(duì)比如下表所示。

vue2 vue3
beforeCreate
created
beforeMount onBeforeMount
mounted onMounted
beforeUpdate onBeforeUpdate
updated onUpdated
beforeDestroy onBeforeUnmount
destroyed onUnmounted

Tips: setup 是圍繞 beforeCreate 和 created 生命周期鉤子運(yùn)行的,所以不需要顯式地去定義。

2. 多根節(jié)點(diǎn)

熟悉 Vue2 的朋友應(yīng)該清楚,在模板中如果使用多個(gè)根節(jié)點(diǎn)時(shí)會(huì)報(bào)錯(cuò),如下所示。

// vue2中在template里存在多個(gè)根節(jié)點(diǎn)會(huì)報(bào)錯(cuò)
<template>
  <header></header>
  <main></main>
  <footer></footer>
</template>
 
// 只能存在一個(gè)根節(jié)點(diǎn),需要用一個(gè)<div>來包裹著
<template>
  <div>
    <header></header>
    <main></main>
    <footer></footer>
  </div>
</template>

但是,Vue3 支持多個(gè)根節(jié)點(diǎn),也就是 fragment。即以下多根節(jié)點(diǎn)的寫法是被允許的。

<template>
  <header></header>
  <main></main>
  <footer></footer>
</template>

3. Composition API

Vue2 是選項(xiàng)API(Options API),一個(gè)邏輯會(huì)散亂在文件不同位置(data、props、computed、watch、生命周期鉤子等),導(dǎo)致代碼的可讀性變差。當(dāng)需要修改某個(gè)邏輯時(shí),需要上下來回跳轉(zhuǎn)文件位置。

Vue3 組合式API(Composition API)則很好地解決了這個(gè)問題,可將同一邏輯的內(nèi)容寫到一起,增強(qiáng)了代碼的可讀性、內(nèi)聚性,其還提供了較為完美的邏輯復(fù)用性方案。

4. 異步組件(Suspense)

Vue3 提供 Suspense 組件,允許程序在等待異步組件加載完成前渲染兜底的內(nèi)容,如 loading ,使用戶的體驗(yàn)更平滑。使用它,需在模板中聲明,并包括兩個(gè)命名插槽:default 和 fallback。Suspense 確保加載完異步內(nèi)容時(shí)顯示默認(rèn)插槽,并將 fallback 插槽用作加載狀態(tài)。

<tempalte>
  <suspense>
    <template #default>
      <List />
    </template>
    <template #fallback>
      <div>
        Loading...
      </div>
    </template>
  </suspense>
</template>

在 List 組件(有可能是異步組件,也有可能是組件內(nèi)部處理邏輯或查找操作過多導(dǎo)致加載過慢等)未加載完成前,顯示 Loading…(即 fallback 插槽內(nèi)容),加載完成時(shí)顯示自身(即 default 插槽內(nèi)容)。

5. Teleport

Vue3 提供 Teleport 組件可將部分 DOM 移動(dòng)到 Vue app 之外的位置。比如項(xiàng)目中常見的 Dialog 彈窗。

<button @click="dialogVisible = true">顯示彈窗</button>
<teleport to="body">
  <div class="dialog" v-if="dialogVisible">
    我是彈窗,我直接移動(dòng)到了body標(biāo)簽下
  </div>
</teleport>

6. 響應(yīng)式原理

Vue2 響應(yīng)式原理基礎(chǔ)是 Object.defineProperty;Vue3 響應(yīng)式原理基礎(chǔ)是 Proxy。

  • Object.defineProperty 基本用法:直接在一個(gè)對(duì)象上定義新的屬性或修改現(xiàn)有的屬性,并返回對(duì)象。
let obj = {};
let name = 'leo';
Object.defineProperty(obj, 'name', {
  enumerable: true,   // 可枚舉(是否可通過 for...in 或 Object.keys() 進(jìn)行訪問)
  configurable: true,   // 可配置(是否可使用 delete 刪除,是否可再次設(shè)置屬性)
  // value: '',   // 任意類型的值,默認(rèn)undefined
  // writable: true,   // 可重寫
  get() {
    return name;
  },
  set(value) {
    name = value;
  }
});

Tips: writablevaluegettersetter 不共存。

搬運(yùn) Vue2 核心源碼,略刪減。

function defineReactive(obj, key, val) {
  // 一 key 一個(gè) dep
  const dep = new Dep()
  
  // 獲取 key 的屬性描述符,發(fā)現(xiàn)它是不可配置對(duì)象的話直接 return
  const property = Object.getOwnPropertyDescriptor(obj, key)
  if (property && property.configurable === false) { return }
  
  // 獲取 getter 和 setter,并獲取 val 值
  const getter = property && property.get
  const setter = property && property.set
  if((!getter || setter) && arguments.length === 2) { val = obj[key] }
  
  // 遞歸處理,保證對(duì)象中所有 key 被觀察
  let childOb = observe(val)
  
  Object.defineProperty(obj, key, {
    enumerable: true,
    configurable: true,
    // get 劫持 obj[key] 的 進(jìn)行依賴收集
    get: function reactiveGetter() {
      const value = getter ? getter.call(obj) : val
      if(Dep.target) {
        // 依賴收集
        dep.depend()
        if(childOb) {
          // 針對(duì)嵌套對(duì)象,依賴收集
          childOb.dep.depend()
          // 觸發(fā)數(shù)組響應(yīng)式
          if(Array.isArray(value)) {
            dependArray(value)
          }
        }
      }
    }
    return value
  })
  // set 派發(fā)更新 obj[key]
  set: function reactiveSetter(newVal) {
    ...
    if(setter) {
      setter.call(obj, newVal)
    } else {
      val = newVal
    }
    // 新值設(shè)置響應(yīng)式
    childOb = observe(val)
    // 依賴通知更新
    dep.notify()
  }
}

那 Vue3 為何會(huì)拋棄它呢?那肯定是因?yàn)樗嬖谀承┚窒扌浴?/p>

主要原因:無(wú)法監(jiān)聽對(duì)象或數(shù)組新增、刪除的元素。

Vue2 相應(yīng)解決方案:針對(duì)常用數(shù)組原型方法push、pop、shift、unshift、splice、sort、reverse進(jìn)行了hack處理;提供Vue.set監(jiān)聽對(duì)象/數(shù)組新增屬性。對(duì)象的新增/刪除響應(yīng),還可以new個(gè)新對(duì)象,新增則合并新屬性和舊對(duì)象;刪除則將刪除屬性后的對(duì)象深拷貝給新對(duì)象。

  • Proxy Proxy 是 ES6 新特性,通過第2個(gè)參數(shù) handler 攔截目標(biāo)對(duì)象的行為。相較于 Object.defineProperty 提供語(yǔ)言全范圍的響應(yīng)能力,消除了局限性。

局限性:

(1)、對(duì)象/數(shù)組的新增、刪除

(2)、監(jiān)測(cè) .length 修改

(3)、Map、Set、WeakMap、WeakSet 的支持

基本用法:創(chuàng)建對(duì)象的代理,從而實(shí)現(xiàn)基本操作的攔截和自定義操作。

let handler = {
  get(obj, prop) {
    return prop in obj ? obj[prop] : '';
  },
  set() {
    // ...
  },
  ...
};

搬運(yùn) vue3 的源碼 reactive.ts 文件。

function createReactiveObject(target, isReadOnly, baseHandlers, collectionHandlers, proxyMap) {
  ...
  // collectionHandlers: 處理Map、Set、WeakMap、WeakSet
  // baseHandlers: 處理數(shù)組、對(duì)象
  const proxy = new Proxy(
    target,
    targetType === TargetType.COLLECTION ? collectionHandlers : baseHandlers
  )
  proxyMap.set(target, proxy)
  return proxy
}

7. 虛擬DOM

Vue3 相比于 Vue2,虛擬DOM上增加 patchFlag 字段。我們借助Vue3 Template Explorer來看。

<div id="app">
  <h1>vue3虛擬DOM講解</h1>
  <p>今天天氣真不錯(cuò)</p>
  <div>{{name}}</div>
</div>

渲染函數(shù)如下所示。

import { createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from vue
 
const _withScopeId = n => (_pushScopeId(scope-id),n=n(),_popScopeId(),n)
const _hoisted_1 = { id: app }
const _hoisted_2 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/_createElementVNode(h1, null, vue3虛擬DOM講解, -1 /* HOISTED */))
const _hoisted_3 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/_createElementVNode(p, null, 今天天氣真不錯(cuò), -1 /* HOISTED */))
 
export function render(_ctx, _cache, $props, $setup, $data, $options) {
  return (_openBlock(), _createElementBlock(div, _hoisted_1, [
    _hoisted_2,
    _hoisted_3,
    _createElementVNode(div, null, _toDisplayString(_ctx.name), 1 /* TEXT */)
  ]))
}

注意第3個(gè)_createElementVNode的第4個(gè)參數(shù)即 patchFlag 字段類型。

字段類型情況:1 代表節(jié)點(diǎn)為動(dòng)態(tài)文本節(jié)點(diǎn),那在 diff 過程中,只需比對(duì)文本對(duì)容,無(wú)需關(guān)注 class、style等。除此之外,發(fā)現(xiàn)所有的靜態(tài)節(jié)點(diǎn)(HOISTED 為 -1),都保存為一個(gè)變量進(jìn)行靜態(tài)提升,可在重新渲染時(shí)直接引用,無(wú)需重新創(chuàng)建。

// patchFlags 字段類型列舉
export const enum PatchFlags { 
  TEXT = 1,   // 動(dòng)態(tài)文本內(nèi)容
  CLASS = 1 << 1,   // 動(dòng)態(tài)類名
  STYLE = 1 << 2,   // 動(dòng)態(tài)樣式
  PROPS = 1 << 3,   // 動(dòng)態(tài)屬性,不包含類名和樣式
  FULL_PROPS = 1 << 4,   // 具有動(dòng)態(tài) key 屬性,當(dāng) key 改變,需要進(jìn)行完整的 diff 比較
  HYDRATE_EVENTS = 1 << 5,   // 帶有監(jiān)聽事件的節(jié)點(diǎn)
  STABLE_FRAGMENT = 1 << 6,   // 不會(huì)改變子節(jié)點(diǎn)順序的 fragment
  KEYED_FRAGMENT = 1 << 7,   // 帶有 key 屬性的 fragment 或部分子節(jié)點(diǎn)
  UNKEYED_FRAGMENT = 1 << 8,   // 子節(jié)點(diǎn)沒有 key 的fragment
  NEED_PATCH = 1 << 9,   // 只會(huì)進(jìn)行非 props 的比較
  DYNAMIC_SLOTS = 1 << 10,   // 動(dòng)態(tài)的插槽
  HOISTED = -1,   // 靜態(tài)節(jié)點(diǎn),diff階段忽略其子節(jié)點(diǎn)
  BAIL = -2   // 代表 diff 應(yīng)該結(jié)束
}

8. 事件緩存

Vue3 的cacheHandler可在第一次渲染后緩存我們的事件。相比于 Vue2 無(wú)需每次渲染都傳遞一個(gè)新函數(shù)。加一個(gè) click 事件。

<div id="app">
  <h1>vue3事件緩存講解</h1>
  <p>今天天氣真不錯(cuò)</p>
  <div>{{name}}</div>
  <span onCLick=() => {}><span>
</div>

渲染函數(shù)如下所示。

import { createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from vue
 
const _withScopeId = n => (_pushScopeId(scope-id),n=n(),_popScopeId(),n)
const _hoisted_1 = { id: app }
const _hoisted_2 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/_createElementVNode(h1, null, vue3事件緩存講解, -1 /* HOISTED */))
const _hoisted_3 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/_createElementVNode(p, null, 今天天氣真不錯(cuò), -1 /* HOISTED */))
const _hoisted_4 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/_createElementVNode(span, { onCLick: () => {} }, [
  /*#__PURE__*/_createElementVNode(span)
], -1 /* HOISTED */))
 
export function render(_ctx, _cache, $props, $setup, $data, $options) {
  return (_openBlock(), _createElementBlock(div, _hoisted_1, [
    _hoisted_2,
    _hoisted_3,
    _createElementVNode(div, null, _toDisplayString(_ctx.name), 1 /* TEXT */),
    _hoisted_4
  ]))
}

觀察以上渲染函數(shù),你會(huì)發(fā)現(xiàn) click 事件節(jié)點(diǎn)為靜態(tài)節(jié)點(diǎn)(HOISTED 為 -1),即不需要每次重新渲染。

9. Diff算法優(yōu)化

搬運(yùn) Vue3 patchChildren 源碼。結(jié)合上文與源碼,patchFlag 幫助 diff 時(shí)區(qū)分靜態(tài)節(jié)點(diǎn),以及不同類型的動(dòng)態(tài)節(jié)點(diǎn)。一定程度地減少節(jié)點(diǎn)本身及其屬性的比對(duì)。

function patchChildren(n1, n2, container, parentAnchor, parentComponent, parentSuspense, isSVG, optimized) {
  // 獲取新老孩子節(jié)點(diǎn)
  const c1 = n1 && n1.children
  const c2 = n2.children
  const prevShapeFlag = n1 ? n1.shapeFlag : 0
  const { patchFlag, shapeFlag } = n2
  
  // 處理 patchFlag 大于 0 
  if(patchFlag > 0) {
    if(patchFlag && PatchFlags.KEYED_FRAGMENT) {
      // 存在 key
      patchKeyedChildren()
      return
    } els if(patchFlag && PatchFlags.UNKEYED_FRAGMENT) {
      // 不存在 key
      patchUnkeyedChildren()
      return
    }
  }
  
  // 匹配是文本節(jié)點(diǎn)(靜態(tài)):移除老節(jié)點(diǎn),設(shè)置文本節(jié)點(diǎn)
  if(shapeFlag && ShapeFlags.TEXT_CHILDREN) {
    if (prevShapeFlag & ShapeFlags.ARRAY_CHILDREN) {
      unmountChildren(c1 as VNode[], parentComponent, parentSuspense)
    }
    if (c2 !== c1) {
      hostSetElementText(container, c2 as string)
    }
  } else {
    // 匹配新老 Vnode 是數(shù)組,則全量比較;否則移除當(dāng)前所有的節(jié)點(diǎn)
    if (prevShapeFlag & ShapeFlags.ARRAY_CHILDREN) {
      if (shapeFlag & ShapeFlags.ARRAY_CHILDREN) {
        patchKeyedChildren(c1, c2, container, anchor, parentComponent, parentSuspense,...)
      } else {
        unmountChildren(c1 as VNode[], parentComponent, parentSuspense, true)
      }
    } else {
      
      if(prevShapeFlag & ShapeFlags.TEXT_CHILDREN) {
        hostSetElementText(container, '')
      } 
      if (shapeFlag & ShapeFlags.ARRAY_CHILDREN) {
        mountChildren(c2 as VNodeArrayChildren, container,anchor,parentComponent,...)
      }
    }
  }
}

patchUnkeyedChildren 源碼如下所示。

function patchUnkeyedChildren(c1, c2, container, parentAnchor, parentComponent, parentSuspense, isSVG, optimized) {
  c1 = c1 || EMPTY_ARR
  c2 = c2 || EMPTY_ARR
  const oldLength = c1.length
  const newLength = c2.length
  const commonLength = Math.min(oldLength, newLength)
  let i
  for(i = 0; i < commonLength; i++) {
    // 如果新 Vnode 已經(jīng)掛載,則直接 clone 一份,否則新建一個(gè)節(jié)點(diǎn)
    const nextChild = (c2[i] = optimized ? cloneIfMounted(c2[i] as Vnode)) : normalizeVnode(c2[i])
    patch()
  }
  if(oldLength > newLength) {
    // 移除多余的節(jié)點(diǎn)
    unmountedChildren()
  } else {
    // 創(chuàng)建新的節(jié)點(diǎn)
    mountChildren()
  }
 
}

10. 打包優(yōu)化

Tree-shaking:模塊打包 webpack、rollup 等中的概念。移除 JavaScript 上下文中未引用的代碼。主要依賴于 import 和 export 語(yǔ)句,用來檢測(cè)代碼模塊是否被導(dǎo)出、導(dǎo)入,且被 JavaScript 文件使用。

以 nextTick 為例子,在 Vue2 中,全局API暴露在Vue實(shí)例上,即使未使用,也無(wú)法通過 tree-shaking 進(jìn)行消除。

import Vue from 'vue';
 
Vue.nextTick(() => {
  // 一些和DOM有關(guān)的東西
});

Vue3 中針對(duì)全局和內(nèi)部的API進(jìn)行了重構(gòu),并考慮到 tree-shaking 的支持。因此,全局API現(xiàn)在只能作為ES模塊構(gòu)建的命名導(dǎo)出進(jìn)行訪問。

import { nextTick } from 'vue';   // 顯式導(dǎo)入
 
nextTick(() => {
  // 一些和DOM有關(guān)的東西
});

通過這一更改,只要模塊綁定器支持 tree-shaking,則Vue應(yīng)用程序中未使用的 api 將從最終的捆綁包中消除,獲得最佳文件大小。

受此更改影響的全局API如下所示。

  • Vue.nextTick
  • Vue.observable (用 Vue.reactive 替換)
  • Vue.version
  • Vue.compile (僅全構(gòu)建)
  • Vue.set (僅兼容構(gòu)建)
  • Vue.delete (僅兼容構(gòu)建)

內(nèi)部API也有諸如 transition、v-model 等標(biāo)簽或者指令被命名導(dǎo)出。只有在程序真正使用才會(huì)被捆綁打包。Vue3 將所有運(yùn)行功能打包也只有約22.5kb,比 Vue2 輕量很多。

11. TypeScript支持

Vue3 由 TypeScript 重寫,相對(duì)于 Vue2 有更好的 TypeScript 支持。

  • Vue2 Options API 中 option 是個(gè)簡(jiǎn)單對(duì)象,而 TypeScript 是一種類型系統(tǒng),面向?qū)ο蟮恼Z(yǔ)法,不是特別匹配。
  • Vue2 需要vue-class-component強(qiáng)化vue原生組件,也需要vue-property-decorator增加更多結(jié)合Vue特性的裝飾器,寫法比較繁瑣。

二、Options API 與 Composition API

Vue 組件可以用兩種不同的 API 風(fēng)格編寫:Options API 和 Composition API。

1. Options API

使用 Options API,我們使用選項(xiàng)對(duì)象定義組件的邏輯,例如data、methods和mounted。由選項(xiàng)定義的屬性在 this 內(nèi)部函數(shù)中公開,指向組件實(shí)例,如下所示。

<template>
  <button @click="increment">count is: {{ count }}</button>
</template>
 
<script>
export default {
  data() {
    return {
      count: 0
    }
  },
  methods: {
    increment() {
      this.count++;
    }
  },
  mounted() {
    console.log(`The initial count is ${this.count}.`);
  }
}
</script>

2. Composition API

使用 Composition API,我們使用導(dǎo)入的 API 函數(shù)定義組件的邏輯。在 SFC 中,Composition API 通常使用文章來源地址http://www.zghlxwxcb.cn/news/detail-772740.html

<template>
  <button @click="increment">Count is: {{ count }}</button>
</template>
 
<script setup>
import { ref, onMounted } from 'vue';
 
const count = ref(0);
 
function increment() {
  count.value++;
}
 
onMounted(() => {
  console.log(`The initial count is ${count.value}.`);
})
</script>

到了這里,關(guān)于盤點(diǎn) Vue3 與 Vue2 的區(qū)別的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • vue2和vue3的區(qū)別(Vue3升級(jí)部分)

    區(qū)別有兩個(gè)目的:一面試說一下書面化的表達(dá),二工作需要升級(jí)大白話說一下項(xiàng)目應(yīng)用的區(qū)別。 雙向數(shù)據(jù)綁定: vue2 的雙向數(shù)據(jù)綁定是利?ES5 的?個(gè) API ,Object.defineProperty()對(duì)數(shù)據(jù)進(jìn)?劫持 結(jié)合 發(fā)布訂閱(gettersetter)模式的?式來實(shí)現(xiàn)的。 vue3 中使?了 ES6 的 ProxyAPI 對(duì)數(shù)據(jù)

    2024年02月12日
    瀏覽(28)
  • vue2與vue3的區(qū)別

    引言:本文講的是vue2與vue3的區(qū)別,其實(shí)這算是老生常談了,vue3出的時(shí)間也很久了,在vue2的基礎(chǔ)上使得整個(gè)框架更加的輕便,在企業(yè)中應(yīng)用vue3的也不少,但是vue2作為經(jīng)典且穩(wěn)定版本也有很多項(xiàng)目在使用,接下來就講講vue2與vue3有哪些區(qū)別。 響應(yīng)式作為vue關(guān)鍵的特性,vue3在

    2024年02月12日
    瀏覽(20)
  • vue2和vue3的區(qū)別

    Vue 2和Vue 3是Vue.js框架的兩個(gè)不同版本,下面是它們之間的一些主要區(qū)別: 性能提升:Vue 3在底層進(jìn)行了重寫,使用了更高效的編譯器,生成的代碼更小,在運(yùn)行時(shí)有更快的速度和更低的內(nèi)存消耗。 Composition API:Vue 3引入了Composition API,它使得組件邏輯可以更容易地組織和復(fù)用

    2024年01月18日
    瀏覽(22)
  • Vue3和Vue2有什么區(qū)別?

    先來說說Vue3相對(duì)于Vue2的優(yōu)點(diǎn)吧: 更快的渲染速度 更小的體積 更少的內(nèi)存占用 更豐富的功能 聽起來好像Vue3比Vue2強(qiáng)很多啊,但是具體強(qiáng)在哪里呢?我們來看幾個(gè)代碼例子: 首先是安裝Vue3和Vue2: 在Vue3中,如果你想注冊(cè)一個(gè)組件,你可以這樣做: 而在Vue2中,你需要這樣做:

    2024年02月08日
    瀏覽(29)
  • vue2和vue3有啥區(qū)別,vue3的優(yōu)點(diǎn)有哪些?

    Vue.js 是一種流行的 JavaScript 框架,用于開發(fā)現(xiàn)代 Web 應(yīng)用程序。Vue.js 具有簡(jiǎn)單易用、高效和靈活等特點(diǎn),能夠極大地提高開發(fā)效率并改進(jìn)用戶體驗(yàn)。Vue.js 一直在不斷更新和改進(jìn),它的最新版本是 Vue 3。 在本文中,我們將探討 Vue 2 和 Vue 3 的區(qū)別,以及如何從 Vue 2 遷移到 Vu

    2024年02月06日
    瀏覽(32)
  • Vue3與Vue2的區(qū)別和優(yōu)化

    Vue3和Vue2之間存在一些重要的區(qū)別。以下是其中的一些主要區(qū)別: 1. 性能優(yōu)化:Vue3通過重新設(shè)計(jì)和重寫了底層的響應(yīng)式系統(tǒng),使得Vue在性能方面有了顯著的提升。Vue3使用Proxy來實(shí)現(xiàn)響應(yīng)式,而不再使用Object.defineProperty,這樣可以避免一些性能問題,并提高了運(yùn)行時(shí)的性能。

    2024年01月22日
    瀏覽(25)
  • vue3.0與vue2.0的區(qū)別

    Vue 3.0是一個(gè)用于構(gòu)建用戶界面的JavaScript框架。相比于Vue 2.x,Vue 3.0在性能、體積和開發(fā)體驗(yàn)上都有了很大的提升。 以下將從不同的角度上去分析Vue 3.0與Vue 2.0的區(qū)別: 從項(xiàng)目搭建和打包工具的選擇來看: Vue 2.0 中通常會(huì)選擇使用 webpack 或者 vue-cli 來進(jìn)行項(xiàng)目搭建和打包。這

    2024年02月07日
    瀏覽(17)
  • Vue3與Vue2的區(qū)別簡(jiǎn)明筆記

    vue經(jīng)歷從2.0到3.0更新之后,簡(jiǎn)??之就是變得更輕,更快,使?起來更加?便,每?次的版本迭代都是對(duì)上?個(gè)版本的升級(jí)優(yōu)化,不管 是對(duì)于我們開發(fā)者還是對(duì)于?戶體驗(yàn)都是不斷地在越來越?便,接下來我會(huì)著重于開發(fā)者來說?下兩個(gè)不同版本的區(qū)別 Vue2 Vue3 beforeCreate 無(wú)

    2024年02月09日
    瀏覽(26)
  • vue面試題_vue2和vue3的區(qū)別

    1、數(shù)據(jù)綁定原理不同 vue2:vue2的數(shù)據(jù)綁定是利用ES5的一個(gè)API:Object.definePropert() 對(duì)數(shù)據(jù)進(jìn)行劫持,結(jié)合發(fā)布訂閱模式的方式來實(shí)現(xiàn)的。 vue3:vue3中使用了ES6的Proxy API對(duì)數(shù)據(jù)代理。相比vue2.x,使用proxy的優(yōu)勢(shì)如下: defineProperty只能監(jiān)聽某個(gè)屬性,不能對(duì)全對(duì)象監(jiān)聽 可以省去for

    2024年02月10日
    瀏覽(26)
  • Vue經(jīng)典面試題:Vue2和Vue3的區(qū)別

    雙向綁定原理 vue2是用過ES5的一個(gè)API Object.defineProperty()對(duì)數(shù)據(jù)進(jìn)行劫持配合發(fā)布訂閱者模式的方式來實(shí)現(xiàn)的 Vue3是使用了ES6的proxyAPI對(duì)數(shù)據(jù)代理 Vue3支持碎片(Fragments) 就是說組件可以有多個(gè)根節(jié)點(diǎn) Composition API vue2采用選項(xiàng)類型API,而vue3采用 合成型API。代碼更加的簡(jiǎn)便整潔 生

    2023年04月19日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包