欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue2?的?diff?算法規(guī)則原理詳解

 更新時(shí)間:2022年06月28日 11:41:44   作者:????Coboy????  
這篇文章主要介紹了Vue2的diff算法規(guī)則原理詳解,diff?算法,就是通過(guò)比對(duì)新舊兩個(gè)虛擬節(jié)點(diǎn)不一樣的地方,針對(duì)那些不一樣的地方進(jìn)行新增或更新或刪除操作。接下來(lái)我們?cè)敿?xì)介紹節(jié)點(diǎn)更新的過(guò)程

前言

所謂 diff 算法,就是通過(guò)比對(duì)新舊兩個(gè)虛擬節(jié)點(diǎn)不一樣的地方,針對(duì)那些不一樣的地方進(jìn)行新增或更新或刪除操作。接下來(lái)我們?cè)敿?xì)介紹節(jié)點(diǎn)更新的過(guò)程。

首先進(jìn)行靜態(tài)節(jié)點(diǎn)處理,判斷新舊兩個(gè)虛擬節(jié)點(diǎn)是否是靜態(tài)節(jié)點(diǎn),如果是,就不需要進(jìn)行更新操作,可以直接跳過(guò)更新比對(duì)的過(guò)程 。

再更新處理新老節(jié)點(diǎn)的屬性,獲取新老節(jié)點(diǎn)的子節(jié)點(diǎn),然后進(jìn)行一定規(guī)則的判斷。

這里值得多說(shuō)一下的是,Vue2 在更新元素屬性的時(shí)候,是暴力全量 diff 更新的,Vue3 則做了很多優(yōu)化。

算法規(guī)則

具體規(guī)則如下:

  • 如果新節(jié)點(diǎn)有子節(jié)點(diǎn)而老節(jié)點(diǎn)沒(méi)有子節(jié)點(diǎn),則判斷老節(jié)點(diǎn)是否有文本內(nèi)容,如果有就清空老節(jié)點(diǎn)的文本內(nèi)容,然后為其新增子節(jié)點(diǎn)。
  • 如果新節(jié)點(diǎn)沒(méi)有子節(jié)點(diǎn)而老節(jié)點(diǎn)有子節(jié)點(diǎn),則先刪除老節(jié)點(diǎn)的子節(jié)點(diǎn),然后設(shè)置文本內(nèi)容。
  • 如果新節(jié)點(diǎn)沒(méi)有子節(jié)點(diǎn),老節(jié)點(diǎn)也沒(méi)有子節(jié)點(diǎn),則進(jìn)行文本的比對(duì),然后設(shè)置文本內(nèi)容。
  • 如果新節(jié)點(diǎn)有子節(jié)點(diǎn),老節(jié)點(diǎn)也有子節(jié)點(diǎn),則進(jìn)行新老子節(jié)點(diǎn)的比對(duì),然后進(jìn)行新增、移動(dòng)、刪除的操作,這也就是傳說(shuō)中的 diff 算法發(fā)生的地方。

patchVnode 源碼解析:

  // diff 的過(guò)程
  // 分析當(dāng)前兩個(gè)節(jié)點(diǎn)的類型
  // 如果是元素,更新雙方屬性、特性等,同時(shí)比較雙方子元素,這個(gè)遞歸過(guò)程,叫深度優(yōu)先
  // 如果雙方是文本,更新文本
  function patchVnode (
    oldVnode,
    vnode,
    insertedVnodeQueue,
    ownerArray,
    index,
    removeOnly
  ) {
    if (oldVnode === vnode) {
      return
    }
    // 靜態(tài)節(jié)點(diǎn)處理
    // 判斷新舊兩個(gè)虛擬節(jié)點(diǎn)是否是靜態(tài)節(jié)點(diǎn),如果是,就不需要進(jìn)行更新操作,可以直接跳過(guò)更新比對(duì)的過(guò)程
    if (isTrue(vnode.isStatic) &&
      isTrue(oldVnode.isStatic) &&
      vnode.key === oldVnode.key &&
      (isTrue(vnode.isCloned) || isTrue(vnode.isOnce))
    ) {
      vnode.componentInstance = oldVnode.componentInstance
      return
    }
    
    // 獲取雙方孩子
    const oldCh = oldVnode.children
    const ch = vnode.children
    // 比較雙方屬性
    // Vue2在更新元素屬性的時(shí)候,是暴力全量 diff 更新的。Vue3 則做了很多優(yōu)化。
    if (isDef(data) && isPatchable(vnode)) {
      for (i = 0; i < cbs.update.length; ++i) cbs.update[i](oldVnode, vnode)
      if (isDef(i = data.hook) && isDef(i = i.update)) i(oldVnode, vnode)
    }
    // 根據(jù)雙方類型的幾種情況分別處理
    if (isUndef(vnode.text)) {// 新節(jié)點(diǎn)沒(méi)有文本
      if (isDef(oldCh) && isDef(ch)) {
        // 雙方都有子元素,就進(jìn)行重排,傳說(shuō)中的 diff 就發(fā)生在這里
        if (oldCh !== ch) updateChildren(elm, oldCh, ch, insertedVnodeQueue, removeOnly)
      } else if (isDef(ch)) {
        // 新節(jié)點(diǎn)有孩子, 老的沒(méi)有,新增創(chuàng)建
        if (process.env.NODE_ENV !== 'production') {
          checkDuplicateKeys(ch)
        }
        // 判斷老節(jié)點(diǎn)是否有文本內(nèi)容,如果有則先清空
        if (isDef(oldVnode.text)) nodeOps.setTextContent(elm, '')
        // 批量添加子節(jié)點(diǎn)
        addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue)
      } else if (isDef(oldCh)) {
        // 新節(jié)點(diǎn)沒(méi)有孩子,老的有的,則刪除老節(jié)點(diǎn)的孩子節(jié)點(diǎn)
        removeVnodes(oldCh, 0, oldCh.length - 1)
      } else if (isDef(oldVnode.text)) {
        // 新節(jié)點(diǎn)沒(méi)有文本節(jié)點(diǎn),老的有文本節(jié)點(diǎn),則清空老的文本節(jié)點(diǎn)
        nodeOps.setTextContent(elm, '')
      }
    } else if (oldVnode.text !== vnode.text) {
      // 新老節(jié)點(diǎn)都是文本節(jié)點(diǎn),則判斷新老文本內(nèi)容是否相同進(jìn)行文本更新
      nodeOps.setTextContent(elm, vnode.text)
    }
    // 鉤子處理
    if (isDef(data)) {
      if (isDef(i = data.hook) && isDef(i = i.postpatch)) i(oldVnode, vnode)
    }
  }

接下來(lái),我們看看兩組子元素都是多節(jié)點(diǎn)比對(duì)的情況,也就是傳說(shuō) diff 發(fā)生的地方。

在新老兩組VNode節(jié)點(diǎn)的左右頭尾兩側(cè)都有一個(gè)變量標(biāo)記,在遍歷過(guò)程中這幾個(gè)變量都會(huì)向中間靠攏,當(dāng)oldStartIdx > oldEndIdx或者newStartIdx > newEndIdx時(shí)結(jié)束循環(huán)。

diff 優(yōu)化策略

先進(jìn)行以下4種情況的優(yōu)化策略:

  • 老數(shù)組的開(kāi)始與新數(shù)組的開(kāi)始:oldStartVnode, newStartVnode
  • 老數(shù)組的結(jié)尾與新數(shù)組的結(jié)尾:oldEndVnode, newEndVnode
  • 老數(shù)組的開(kāi)始與新數(shù)組的結(jié)尾:oldStartVnode, newEndVnode
  • 老數(shù)組的結(jié)尾與新數(shù)組的開(kāi)始:oldEndVnode, newStartVnode

如果以上4種情況都沒(méi)找到,則從新數(shù)組的第一個(gè)節(jié)點(diǎn)去老數(shù)組中去查找,找到了就進(jìn)行遞歸更新,沒(méi)找到則創(chuàng)建新節(jié)點(diǎn)。

老數(shù)組的開(kāi)始與新數(shù)組的開(kāi)始

新數(shù)組的結(jié)尾節(jié)點(diǎn)有剩余則添加

從左往右比對(duì)完,老數(shù)組的游標(biāo)先相交了,發(fā)現(xiàn)新數(shù)組結(jié)尾還有節(jié)點(diǎn)沒(méi)有比對(duì),則在新數(shù)組結(jié)尾創(chuàng)建剩下沒(méi)有比對(duì)的節(jié)點(diǎn)。

老數(shù)組的結(jié)尾節(jié)點(diǎn)有剩余則刪除

從左往右比對(duì)完,新數(shù)組的游標(biāo)先相交了,發(fā)現(xiàn)老數(shù)組結(jié)尾還有節(jié)點(diǎn)沒(méi)有比對(duì),則刪除老數(shù)組剩下沒(méi)有比對(duì)的節(jié)點(diǎn)。

老數(shù)組的結(jié)尾與新數(shù)組的結(jié)尾

新數(shù)組的開(kāi)頭節(jié)點(diǎn)有剩余則添加

從右往左比對(duì)完,老數(shù)組的游標(biāo)先相交了,發(fā)現(xiàn)新數(shù)組開(kāi)頭還有節(jié)點(diǎn)沒(méi)有比對(duì),則在新數(shù)組開(kāi)頭創(chuàng)建沒(méi)有比對(duì)的節(jié)點(diǎn)。

老數(shù)組的開(kāi)頭節(jié)點(diǎn)有剩余則刪除

從右往左比對(duì)完,新數(shù)組的游標(biāo)先相交了,發(fā)現(xiàn)老數(shù)組的開(kāi)頭還有節(jié)點(diǎn)沒(méi)有比對(duì),則刪除老數(shù)組開(kāi)頭沒(méi)有比對(duì)的節(jié)點(diǎn)。

老數(shù)組的開(kāi)始與新數(shù)組的結(jié)尾

如果老數(shù)組的開(kāi)頭節(jié)點(diǎn)與新數(shù)組的結(jié)尾節(jié)點(diǎn)比對(duì)成功了,除了會(huì)繼續(xù)遞歸比對(duì)它們,還將真實(shí)節(jié)點(diǎn) A 移動(dòng)到結(jié)尾。

老數(shù)組的結(jié)尾與新數(shù)組的開(kāi)始

如果老數(shù)組的結(jié)尾節(jié)點(diǎn)與新數(shù)組的開(kāi)始節(jié)點(diǎn)比對(duì)成功了,除了會(huì)繼續(xù)遞歸比對(duì)它們,還將真實(shí)節(jié)點(diǎn)D移動(dòng)到開(kāi)頭。

以上四種情況都沒(méi)對(duì)比成功

如果以上4種情況都沒(méi)找到,則拿新數(shù)組的第一個(gè)節(jié)點(diǎn)去老數(shù)組中去查找。

如果拿新數(shù)組的第一個(gè)節(jié)點(diǎn)去老數(shù)組中查找成功了,則會(huì)繼續(xù)遞歸比對(duì)它們,同時(shí)將比對(duì)到的節(jié)點(diǎn)移動(dòng)到對(duì)應(yīng)的節(jié)點(diǎn)前面,并且將老數(shù)組原來(lái)的位置內(nèi)容設(shè)置為 undefind。

如果拿新數(shù)組的第一個(gè)節(jié)點(diǎn)去老數(shù)組中查找,沒(méi)找到,則創(chuàng)建一個(gè)新的節(jié)點(diǎn)插入到未處理的節(jié)點(diǎn)前面。

推薦在渲染列表時(shí)為節(jié)點(diǎn)設(shè)置 key

如果我們?cè)谀0驿秩玖斜頃r(shí),為節(jié)點(diǎn)設(shè)置了屬性 key,那么在上面建立的 key 與 index 索引的對(duì)應(yīng)關(guān)系時(shí),就生成了一個(gè) key 對(duì)應(yīng)著一個(gè)節(jié)點(diǎn)下標(biāo)這樣一個(gè)對(duì)象。 也就是說(shuō),如果在節(jié)點(diǎn)上設(shè)置了屬性 key,那么在老的虛擬DOM中找相同節(jié)點(diǎn)時(shí),可以直接通過(guò) key 拿到下標(biāo),從而獲取節(jié)點(diǎn),否則我們就需要每一次都要進(jìn)行遍歷查找。 所以非常推薦在渲染列表時(shí)為節(jié)點(diǎn)設(shè)置 key,最好是后端返回的唯一 ID。

循環(huán)比對(duì)結(jié)束的后續(xù)處理工作

如果老數(shù)組的游標(biāo)先相交了,則判斷新數(shù)組中是否還有剩下的節(jié)點(diǎn),沒(méi)有進(jìn)行比對(duì)的,創(chuàng)建它們。

如果新數(shù)組的游標(biāo)先相交了,則判斷老數(shù)組中是否還有剩下的節(jié)點(diǎn),沒(méi)有進(jìn)行比對(duì)的,把它們都刪除掉。

源碼解析

// 傳說(shuō)中的 diff 發(fā)生的地方
  function updateChildren (parentElm, oldCh, newCh, insertedVnodeQueue, removeOnly) {
    // 4個(gè)游標(biāo)和對(duì)應(yīng)節(jié)點(diǎn)
    let oldStartIdx = 0
    let newStartIdx = 0
    let oldEndIdx = oldCh.length - 1
    let oldStartVnode = oldCh[0]
    let oldEndVnode = oldCh[oldEndIdx]
    let newEndIdx = newCh.length - 1
    let newStartVnode = newCh[0]
    let newEndVnode = newCh[newEndIdx]
    // 后續(xù)查找需要的變量
    let oldKeyToIdx, idxInOld, vnodeToMove, refElm

    const canMove = !removeOnly

    // 循環(huán)條件是游標(biāo)不能交叉,交叉就結(jié)束
    while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {
      // 前兩個(gè)是校正,在之前的比對(duì)中可能會(huì)刪除其中的舊節(jié)點(diǎn),之后就會(huì)往前或者往后移動(dòng)一位
      if (isUndef(oldStartVnode)) {
        oldStartVnode = oldCh[++oldStartIdx] // Vnode has been moved left
      } else if (isUndef(oldEndVnode)) {
        oldEndVnode = oldCh[--oldEndIdx]
      } else if (sameVnode(oldStartVnode, newStartVnode)) {
        // 先查找兩個(gè)開(kāi)頭節(jié)點(diǎn)
        patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue, newCh, newStartIdx)
        oldStartVnode = oldCh[++oldStartIdx]
        newStartVnode = newCh[++newStartIdx]
      } else if (sameVnode(oldEndVnode, newEndVnode)) {
        // 兩個(gè)結(jié)尾節(jié)點(diǎn)
        patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue, newCh, newEndIdx)
        oldEndVnode = oldCh[--oldEndIdx]
        newEndVnode = newCh[--newEndIdx]
      } else if (sameVnode(oldStartVnode, newEndVnode)) { // Vnode moved right
        // 老的開(kāi)始節(jié)點(diǎn),新的結(jié)尾節(jié)點(diǎn)
        patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue, newCh, newEndIdx)
        // 進(jìn)行節(jié)點(diǎn)移動(dòng)
        // node.insertBefore(newnode,existingnode) 1.newnode 必需。需要插入的節(jié)點(diǎn)對(duì)象  2.existingnode 可選。在其之前插入新節(jié)點(diǎn)的子節(jié)點(diǎn)。如果未規(guī)定,則 insertBefore 方法會(huì)在結(jié)尾插入 newnode。
        canMove && nodeOps.insertBefore(parentElm, oldStartVnode.elm, nodeOps.nextSibling(oldEndVnode.elm))
        oldStartVnode = oldCh[++oldStartIdx]
        newEndVnode = newCh[--newEndIdx]
      } else if (sameVnode(oldEndVnode, newStartVnode)) { // Vnode moved left
        // 老的結(jié)尾節(jié)點(diǎn),新的開(kāi)始節(jié)點(diǎn)
        patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue, newCh, newStartIdx)
        // 進(jìn)行節(jié)點(diǎn)移動(dòng)
        canMove && nodeOps.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm)
        oldEndVnode = oldCh[--oldEndIdx]
        newStartVnode = newCh[++newStartIdx]
      } else {
        // 首尾沒(méi)找到
        // 第一次創(chuàng)建一個(gè)老的節(jié)點(diǎn)的索引 Map,方便后續(xù)不需要遍歷查找,這是一個(gè)空間換時(shí)間的方法
        if (isUndef(oldKeyToIdx)) oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx)
        // 拿新虛擬DOM開(kāi)頭的第一個(gè)節(jié)點(diǎn),去老的虛擬DOM中進(jìn)行查找
        // 如果我們?cè)谀0驿秩玖斜頃r(shí),為節(jié)點(diǎn)設(shè)置了屬性 key,那么在上面建立的 key 與 index 索引的對(duì)應(yīng)關(guān)系時(shí),就生成了一個(gè) key 對(duì)應(yīng)著一個(gè)節(jié)點(diǎn)下標(biāo)這樣一個(gè)對(duì)象。
        // 也就是說(shuō),如果在節(jié)點(diǎn)上設(shè)置了屬性 key,那么在老的虛擬DOM中找相同節(jié)點(diǎn)時(shí),可以直接通過(guò) key 拿到下標(biāo),從而獲取節(jié)點(diǎn),否則我們就需要每一次都要進(jìn)行遍歷查找。
        // 所以非常推薦在渲染列表時(shí)為節(jié)點(diǎn)設(shè)置 key,最好是后端返回的唯一 ID。
        idxInOld = isDef(newStartVnode.key)
          ? oldKeyToIdx[newStartVnode.key]
          : findIdxInOld(newStartVnode, oldCh, oldStartIdx, oldEndIdx)
        if (isUndef(idxInOld)) { // New element
          // 沒(méi)找到就進(jìn)行創(chuàng)建,并且插入到未處理的節(jié)點(diǎn)(oldStartVnode.elm)的前面
          createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx)
        } else {
          vnodeToMove = oldCh[idxInOld]
          // 找到之后,也要進(jìn)行判斷是否相同節(jié)點(diǎn)
          if (sameVnode(vnodeToMove, newStartVnode)) {
            // 遞歸更新
            patchVnode(vnodeToMove, newStartVnode, insertedVnodeQueue, newCh, newStartIdx)
            oldCh[idxInOld] = undefined
            canMove && nodeOps.insertBefore(parentElm, vnodeToMove.elm, oldStartVnode.elm)
          } else {
            // same key but different element. treat as new element
            // 創(chuàng)建新的節(jié)點(diǎn)進(jìn)行替換
            createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx)
          }
        }
        newStartVnode = newCh[++newStartIdx]
      }
    }
    // 循環(huán)結(jié)束
    // 后續(xù)處理工作
    if (oldStartIdx > oldEndIdx) {
      // 老的先結(jié)束,判斷新的虛擬DOM中是否還有剩下的節(jié)點(diǎn),批量創(chuàng)建
      refElm = isUndef(newCh[newEndIdx + 1]) ? null : newCh[newEndIdx + 1].elm
      addVnodes(parentElm, refElm, newCh, newStartIdx, newEndIdx, insertedVnodeQueue)
    } else if (newStartIdx > newEndIdx) {
      // 新的先結(jié)束,判斷老的虛擬DOM中是否還剩下,批量刪除
      removeVnodes(oldCh, oldStartIdx, oldEndIdx)
    }
  }

總結(jié)

總的來(lái)說(shuō) Vue2 的 diff 算法就是以新的虛擬DOM為準(zhǔn)進(jìn)行與老虛擬DOM的比對(duì),繼而進(jìn)行各種情況的處理。大概可以分為 4 種情況:更新節(jié)點(diǎn)、新增節(jié)點(diǎn)、刪除節(jié)點(diǎn)、移動(dòng)節(jié)點(diǎn)位置。比對(duì)新老兩個(gè)虛擬DOM,就是通過(guò)循環(huán),每循環(huán)到一個(gè)新節(jié)點(diǎn),就去老節(jié)點(diǎn)列表里面找到和當(dāng)前新節(jié)點(diǎn)相同的舊節(jié)點(diǎn)。如果在舊節(jié)點(diǎn)列表中找不到,說(shuō)明當(dāng)前節(jié)點(diǎn)是需要新增的節(jié)點(diǎn),我們就需要進(jìn)行創(chuàng)建節(jié)點(diǎn)并插入視圖的操作;如果找到了,就做更新操作;如果找到的舊節(jié)點(diǎn)與新節(jié)點(diǎn)位置不同,則需要移動(dòng)節(jié)點(diǎn)等。

其中為了快速查找到節(jié)點(diǎn),Vue2 的 diff 算法設(shè)置了 4 種優(yōu)化策略,分別是:

  • 老數(shù)組的開(kāi)始與新數(shù)組的開(kāi)始
  • 老數(shù)組的結(jié)尾與新數(shù)組的結(jié)尾
  • 老數(shù)組的開(kāi)始與新數(shù)組的結(jié)尾
  • 老數(shù)組的結(jié)尾與新數(shù)組的開(kāi)始

通過(guò)這 4 種快捷的查找方式,我們就不需要循環(huán)來(lái)查找了,只有當(dāng)以上 4 種方式都查找不到的時(shí)候,再進(jìn)行循環(huán)查找。

最后循環(huán)結(jié)束后需要對(duì)未處理的節(jié)點(diǎn)進(jìn)行處理。

如果是老節(jié)點(diǎn)列表先循環(huán)完畢,這個(gè)時(shí)候如果新節(jié)點(diǎn)列表還有剩余的節(jié)點(diǎn),則說(shuō)明這些節(jié)點(diǎn)都是需要新增的節(jié)點(diǎn),直接把這些節(jié)點(diǎn)創(chuàng)建并插入到 DOM 中就行了。

如果是新節(jié)點(diǎn)列表先循環(huán)完畢,這個(gè)時(shí)候如果老節(jié)點(diǎn)列表還有剩余節(jié)點(diǎn),則說(shuō)明這些節(jié)點(diǎn)都是要被廢棄的節(jié)點(diǎn),是應(yīng)該被刪除的節(jié)點(diǎn),直接批量刪除就可以了。

到此這篇關(guān)于Vue2 的 diff 算法規(guī)則原理詳解的文章就介紹到這了,更多相關(guān)Vue2 diff 算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue監(jiān)聽(tīng)一個(gè)數(shù)組id是否與另一個(gè)數(shù)組id相同的方法

    Vue監(jiān)聽(tīng)一個(gè)數(shù)組id是否與另一個(gè)數(shù)組id相同的方法

    今天小編就為大家分享一篇Vue監(jiān)聽(tīng)一個(gè)數(shù)組id是否與另一個(gè)數(shù)組id相同的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • 詳解vue配置請(qǐng)求多個(gè)服務(wù)端解決方案

    詳解vue配置請(qǐng)求多個(gè)服務(wù)端解決方案

    這篇文章主要介紹了詳解vue配置請(qǐng)求多個(gè)服務(wù)端解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • vue項(xiàng)目實(shí)現(xiàn)搜索內(nèi)容變紅色顯示

    vue項(xiàng)目實(shí)現(xiàn)搜索內(nèi)容變紅色顯示

    這篇文章主要為大家介紹了vue項(xiàng)目實(shí)現(xiàn)搜索內(nèi)容變紅色顯示,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 一篇文章總結(jié)Vue3.2語(yǔ)法糖使用

    一篇文章總結(jié)Vue3.2語(yǔ)法糖使用

    Vue3.2(21年8月10日)相比于Vue3新增了語(yǔ)法糖,減少了代碼冗余,下面這篇文章主要給大家介紹了關(guān)于Vue3.2語(yǔ)法糖使用的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • vue實(shí)現(xiàn)跨頁(yè)面定位錨點(diǎn)區(qū)域方式

    vue實(shí)現(xiàn)跨頁(yè)面定位錨點(diǎn)區(qū)域方式

    這篇文章主要介紹了vue實(shí)現(xiàn)跨頁(yè)面定位錨點(diǎn)區(qū)域方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 關(guān)于在vue-cli中使用微信自動(dòng)登錄和分享的實(shí)例

    關(guān)于在vue-cli中使用微信自動(dòng)登錄和分享的實(shí)例

    本篇文章主要介紹了關(guān)于在vue-cli中使用微信自動(dòng)登錄和分享的實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • vue中template模板編譯的過(guò)程全面剖析

    vue中template模板編譯的過(guò)程全面剖析

    這篇文章主要介紹了vue中template模板編譯的過(guò)程全面剖析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • 渲染函數(shù) & JSX詳情

    渲染函數(shù) & JSX詳情

    本篇文章來(lái)講解渲染函數(shù) & JSX,Vue 推薦在絕大多數(shù)情況下使用模板來(lái)創(chuàng)建你的 HTML。然而在一些場(chǎng)景中,你真的需要 JavaScript 的完全編程的能力。這時(shí)我們可以用渲染函數(shù),它比模板更接近編譯器,需要的朋友可以參考一下
    2021-09-09
  • 一份超級(jí)詳細(xì)的Vue-cli3.0使用教程【推薦】

    一份超級(jí)詳細(xì)的Vue-cli3.0使用教程【推薦】

    這篇文章主要介紹了一份超級(jí)詳細(xì)的Vue-cli3.0使用教程,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-11-11
  • Vue觸發(fā)input選取文件點(diǎn)擊事件操作

    Vue觸發(fā)input選取文件點(diǎn)擊事件操作

    這篇文章主要介紹了Vue觸發(fā)input選取文件點(diǎn)擊事件操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08

最新評(píng)論