鍍金池/ 問(wèn)答/HTML/ vue custom directive里的vnode是干嘛用的

vue custom directive里的vnode是干嘛用的

看到一個(gè)example,code在問(wèn)題底部,用于權(quán)限控制,如果權(quán)限不夠,就沒(méi)有這個(gè)element。
想請(qǐng)大俠幫忙看看:

  1. 為什么需要做
Object.defineProperty(comment, 'setAttribute', {
      value: () => undefined,
    });

2 沒(méi)看明白vnode是什么,用處是什么?

Vue.directive('permission', (el, binding, vnode) => {
  if (!isUserGranted(binding.value)) {
    // replace HTMLElement with comment node
    const comment = document.createComment(' ');
    Object.defineProperty(comment, 'setAttribute', {
      value: () => undefined,
    });
    vnode.elm = comment;
    vnode.text = ' ';
    vnode.isComment = true;
    vnode.context = undefined;
    vnode.tag = undefined;
    vnode.data.directives = undefined;

    if (vnode.componentInstance) {
      vnode.componentInstance.$el = comment;
    }

    if (el.parentNode) {
      el.parentNode.replaceChild(comment, el);
    }
  }
});
回答
編輯回答
莫小染
  1. 復(fù)寫(xiě)了 這個(gè)空注釋節(jié)點(diǎn)(createComment)的 setAttribute 方法為一個(gè)不會(huì)產(chǎn)生任何作用的函數(shù),可能是為了防止后續(xù)操作的報(bào)錯(cuò)吧,因?yàn)樵臼?dom 節(jié)點(diǎn),肯定會(huì)有對(duì) dom 的屬性的操作的,而換成注釋節(jié)點(diǎn)后不能設(shè)置屬性?(不清楚)。
  2. vnode 是虛擬節(jié)點(diǎn),可以把 vnode 當(dāng)做實(shí)際節(jié)點(diǎn)創(chuàng)建的前身。你看把原本要?jiǎng)?chuàng)建的 elm 就換成了一個(gè)注釋節(jié)點(diǎn),就創(chuàng)建不出來(lái)原本的 element 了。存儲(chǔ)了要?jiǎng)?chuàng)建的節(jié)點(diǎn)的一些信息,和創(chuàng)建使用的方法。把 vnode 上的 節(jié)點(diǎn)相關(guān)信息清空或修改,就創(chuàng)建不出來(lái)原本的節(jié)點(diǎn)結(jié)構(gòu)了。
2017年8月25日 14:45