Element分析(工具篇)——Sync

說明

v-sync是用來同步組件的prop和它上下文中的變量的,這里面有一個(gè)非常有趣的小技巧:$watch會(huì)返回一個(gè)unwatch的函數(shù)來取消監(jiān)聽。

源碼解讀

const SYNC_HOOK_PROP = '$v-sync';

/**
 * v-sync directive
 *
 * Usage:
 *  v-sync:component-prop="context prop name"
 *
 * If your want to sync component's prop "visible" to context prop "myVisible", use like this:
 *  v-sync:visible="myVisible"
 */
export default {
  bind(el, binding, vnode) {
    const context = vnode.context;  // 獲取上下文,即組件渲染的作用域中
    const component = vnode.child;  // 返回組件實(shí)例
    const expression = binding.expression;  // 返回表達(dá)式
    const prop = binding.arg;  // 返回傳參

    if (!expression || !prop) {  // 如果沒有表達(dá)式或者傳參
      console.warn('v-sync should specify arg & expression, for example: v-sync:visible="myVisible"');
      return;
    }

    if (!component || !component.$watch) {  // 判斷是否包含 watch 來確保是 Vue 的組件
      console.warn('v-sync is only available on Vue Component');
      return;
    }

    // 將組件的 prop 與上下文中的信息同步,返回取消 watch 的函數(shù)
    const unwatchContext = context.$watch(expression, (val) => {
      component[prop] = val;
    });

    // 將上下文中的信息和組件的 prop,返回取消 watch 的函數(shù)
    const unwatchComponent = component.$watch(prop, (val) => {
      context[expression] = val;
    });

    // 保存到組件實(shí)例中
    Object.defineProperty(component, SYNC_HOOK_PROP, {
      value: {
        unwatchContext,
        unwatchComponent
      },
      enumerable: false
    });
  },

  unbind(el, binding, vnode) {
    const component = vnode.child;
    if (component && component[SYNC_HOOK_PROP]) {  // 取消監(jiān)聽
      const { unwatchContext, unwatchComponent } = component[SYNC_HOOK_PROP];
      unwatchContext && unwatchContext();
      unwatchComponent && unwatchComponent();
    }
  }
};

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,765評(píng)論 25 709
  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容,還有我對(duì)于 Vue 1.0 印象不深的內(nèi)容。關(guān)于...
    云之外閱讀 5,168評(píng)論 0 29
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139

友情鏈接更多精彩內(nèi)容