vue組件開發(fā)那些事

使用vue開發(fā)感悟

剛開始開發(fā)vue的組件有些不太習(xí)慣,對vue templte的模板語法對比react渲染的內(nèi)容寫在render函數(shù)里面鲸伴,
更改狀態(tài)直接調(diào)用this.屬性名而react是this.setState
vue引入組件后要在components里面注冊組件府蔗,而react不需要注冊組件。
vue的props屬性需要聲明汞窗,react直接拿來用
凡此種種姓赤,對比之后我更愛react,函數(shù)式思想簡潔易懂仲吏。
但是vue比較小巧靈活模捂,當(dāng)所有的容器都準(zhǔn)備好了,機(jī)器就開始運行了蜘矢,后面對機(jī)器的一系列操作頁比較簡單。
在這個過程中综看,會遇到a litter坑坑品腹。

開發(fā)前準(zhǔn)備

開發(fā)前抽時間補(bǔ)了下唐金洲老師的課程《vue開發(fā)實戰(zhàn)》課程挺好的實力推薦 git課程源碼生態(tài)篇的知識已經(jīng)夠開發(fā)組件用了『毂《調(diào)試九法》里講到要解決問題首先得理解系統(tǒng)舞吭,開發(fā)前需要對vue有一個清楚得理解,當(dāng)然閱讀官方文檔是必不可少的析珊。

  • 不可以直接修改父組件的props屬性羡鸥。
  • .觸發(fā) update 數(shù)據(jù)驅(qū)動視圖改變。狀態(tài)的改變未必會觸發(fā)組件的更新忠寻,屬性的改變頁未必能觸發(fā)組件的更新惧浴。狀態(tài)未必是響應(yīng)式的,響應(yīng)式的狀態(tài)未必添加到模板里奕剃。
  • 對vue更新時生命周期的理解
    在beforeUpdated和updated之間會進(jìn)行render執(zhí)行衷旅。
    什么時候觸發(fā):狀態(tài)發(fā)生改變或者$foreUpdata()強(qiáng)制跟新捐腿,
    這兩個生命周期可以做什么:更新開始前移除事件監(jiān)聽器,更新后添加事件監(jiān)聽器柿顶。
  • .在updated時候不能更改響應(yīng)式的數(shù)據(jù)茄袖,會導(dǎo)致死循環(huán),在updated的時候可以操作dom嘁锯,添加事件監(jiān)聽器宪祥,有一次我就在updated的時候new了一個組件,并給組件添加了一個事件家乘。這個事件的觸發(fā)會導(dǎo)致響應(yīng)式數(shù)據(jù)的變化蝗羊,結(jié)果就是頁面出現(xiàn)了重復(fù)的dom結(jié)點。并沒有觸發(fā)死循環(huán)烤低。
  • vue組件是什么時候被銷毀的
    組件自己不能銷毀自己,銷毀是在離開或隱藏這個組件的時候肘交,離開組件所在的路由,在這個組件的父組件上調(diào)用方法銷毀組件扑馁,或者使其隱藏涯呻。

組件跨層級通信的幾種方式

父組件provide數(shù)據(jù),子組件inject的數(shù)據(jù)會往上去尋找腻要,找到父組件中的數(shù)據(jù)就停止尋找复罐,否則就繼續(xù)往上尋找。父組件數(shù)據(jù)的改變要影響子組件雄家,要使用observable

provide() {
   this.theme = Vue.observable({
     color: "blue"
   });
   return {
     theme: this.theme
   };
 },

子組件接受父組件提供的數(shù)據(jù)

 inject: {
    theme: {
      default: () => ({})
    }
  },

2 .使用emmit.js具體代碼參見iview emmit.js
iview里有很多設(shè)計很棒的組件效诅,經(jīng)典的樹形結(jié)構(gòu)組件就是通過全局混入emmit.js 實現(xiàn)跨組件通信,設(shè)計非常巧妙趟济,值得好好研究乱投。
emmit使用遞歸向上或向下的方式查找指定的組件名稱,找到后觸發(fā)$emit

function broadcast(componentName, eventName, params) {
    this.$children.forEach(child => {
        const name = child.$options.name;

        if (name === componentName) {
            child.$emit.apply(child, [eventName].concat(params));
        } else {
            // todo 如果 params 是空數(shù)組顷编,接收到的會是 undefined
            broadcast.apply(child, [componentName, eventName].concat([params]));
        }
    });
}
export default {
    methods: {
        dispatch(componentName, eventName, params) {
            let parent = this.$parent || this.$root;
            let name = parent.$options.name;

            while (parent && (!name || name !== componentName)) {
                parent = parent.$parent;

                if (parent) {
                    name = parent.$options.name;
                }
            }
            if (parent) {
                parent.$emit.apply(parent, [eventName].concat(params));
            }
        },
        broadcast(componentName, eventName, params) {
            broadcast.call(this, componentName, eventName, params);
        }
    }
};

子組件狀態(tài)發(fā)生 改變 dispatch(componentName, eventName, params)分發(fā)到響應(yīng)組件名稱的父親戚炫,事件和傳遞的數(shù)據(jù)。

3.v-ant-refs 非遞歸獲取組件實例媳纬,這個方法太牛了双肤,但是我所開發(fā)的組件其實不需要這樣用。


image.png

利用provide來緩存子組件的實例钮惠,E或F實例生成或更新的時候告訴A節(jié)點茅糜。

A節(jié)點
 provide() {
    return {
      setChildrenRef: (name, ref) => {
        this[name] = ref;
      },
      getChildrenRef: name => {
        return this[name];
      },
      getRef: () => {
        return this;
      }
    };
  },
D節(jié)點
<template>
 <div class="border1">
   <h2>D 結(jié)點</h2>
   <ChildrenG />
   <ChildrenH v-ant-ref="c => setChildrenRef('childrenH', c)" />
   <ChildrenI />
 </div>
</template>
<script>
import ChildrenG from "./ChildrenG";
import ChildrenH from "./ChildrenH";
import ChildrenI from "./ChildrenI";
export default {
 components: {
   ChildrenG,
   ChildrenH,
   ChildrenI
 },
 inject: {
   setChildrenRef: {
     default: () => {}
   }
 }
};
</script>

H實例化完成或更新的時候可以主動去調(diào)用

F節(jié)點
<template>
  <div class="border2">
    <h3>F 結(jié)點</h3>
    <button @click="getARef">獲取A Ref</button>
    <button @click="getHRef">獲取H Ref</button>
  </div>
</template>
<script>
export default {
  components: {},
  inject: {
    getParentRef: {
      from: "getRef",
      default: () => {}
    },
    getParentChildrenRef: {
      from: "getChildrenRef",
      default: () => {}
    }
  },
  methods: {
    getARef() {
      console.log(this.getParentRef());
      console.log(this.$parent.$parent)
      //這樣是遞歸的獲取父組件的實例
    },
    getHRef() {
      console.log(this.getParentChildrenRef("childrenH"));
    }
  }
};
</script>

組件開發(fā)具體過程

獨立的組件復(fù)雜度主要集中在細(xì)節(jié),交互素挽,性能優(yōu)化蔑赘,API設(shè)計上,完事開頭難弄,API的設(shè)計和可擴(kuò)展性決定了組件迭代的復(fù)雜性米死,一開始不可能會烤爐的所有的細(xì)節(jié)锌历,但是整體架構(gòu)要清晰可擴(kuò)展,否則很有可能重構(gòu) --來自《vue.js實戰(zhàn)》

設(shè)計
設(shè)計組件的拆分:父組件峦筒,子組件
子組件的狀態(tài):有哪些狀態(tài)究西,是否需要props,組件自身狀態(tài)改變機(jī)制
父組件:有哪些子組件物喷,需要給子組件傳遞什么參數(shù)卤材。

開發(fā)一個color-picker組件,直接上設(shè)計圖峦失,軟件用的是PressOn

color-picker.png

設(shè)計好這個組件可以清晰的codeing扇丛,后面開發(fā)就很快了
具體參見源碼地址,很簡單的一個color-picker
持續(xù)更新中...
歡迎點贊嘿嘿嘿

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末尉辑,一起剝皮案震驚了整個濱河市帆精,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌隧魄,老刑警劉巖卓练,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異购啄,居然都是意外死亡襟企,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門狮含,熙熙樓的掌柜王于貴愁眉苦臉地迎上來顽悼,“玉大人,你說我怎么就攤上這事几迄∥盗” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵映胁,是天一觀的道長木羹。 經(jīng)常有香客問我,道長屿愚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任务荆,我火速辦了婚禮妆距,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘函匕。我一直安慰自己娱据,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著中剩,像睡著了一般忌穿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上结啼,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天掠剑,我揣著相機(jī)與錄音,去河邊找鬼郊愧。 笑死朴译,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的属铁。 我是一名探鬼主播眠寿,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼焦蘑!你這毒婦竟也來了盯拱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤例嘱,失蹤者是張志新(化名)和其女友劉穎狡逢,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝶防,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡甚侣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了间学。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片殷费。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖低葫,靈堂內(nèi)的尸體忽然破棺而出详羡,到底是詐尸還是另有隱情,我是刑警寧澤嘿悬,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布实柠,位于F島的核電站,受9級特大地震影響善涨,放射性物質(zhì)發(fā)生泄漏窒盐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一钢拧、第九天 我趴在偏房一處隱蔽的房頂上張望蟹漓。 院中可真熱鬧,春花似錦源内、人聲如沸葡粒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嗽交。三九已至卿嘲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間夫壁,已是汗流浹背拾枣。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留掌唾,地道東北人放前。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像糯彬,于是被迫代替她去往敵國和親凭语。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

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