Vue2組件

注冊組件

  1. 必須要有一個(gè)根元素

  2. data 須是一個(gè)function,防止使用多個(gè)組件時(shí)驳遵,引用的是相同的數(shù)據(jù)

  3. 局部注冊的組件使用時(shí)需要在components里聲明下。

注冊局部組件

const Bar = {
  data() {
    return {
      count: 0,
    };
  },
  template: `<div>Bar
      {{count}}
      <button @click="count++"></button>
      </div>`,
};

注冊全局組件和使用局部組件

Vue.component("Foo", {
//需要在components里聲明下局部組件
components: {
    Bar,
  },
  template: `<div>foo
      <Bar></Bar>
      <Bar></Bar>
      </div>`,
});

使用全局組件

const app = new Vue({
  el: "#app",
  //全局組件不需要聲明
  template: `
       <div>app
       <Foo></Foo>
       </div>
  `,
  data: {},
});

組件生命周期

beforeCreate() {
// 實(shí)例剛在內(nèi)存中被創(chuàng)建出來山涡,此時(shí)堤结,還沒有初始化好 data 和 methods 屬性
},
created() {
// 實(shí)例已經(jīng)在內(nèi)存中創(chuàng)建,data 和 methods 已經(jīng)創(chuàng)建鸭丛,但是還沒有開始 編譯模板霍殴,可以在這調(diào)用接口獲取數(shù)據(jù)
},
beforeMount() {
//已經(jīng)完成了模板的編譯,但是還沒有掛載到頁面中系吩,頁面里還是沒解析好的數(shù)據(jù)。
},
mounted() {
// 掛載完成 妒蔚,可以獲取dom元素了
// window.addEventListener("")
},
beforeUpdate() {
// 狀態(tài)更新之前執(zhí)行此函數(shù)穿挨, 此時(shí) data 中的狀態(tài)值是最新的月弛,但是界面上顯示的數(shù)據(jù)還是舊的,因?yàn)榇藭r(shí)還沒有開始重新渲染DOM節(jié)點(diǎn)
},
updated() {
// 更新完成
},
beforeDestroy() {
// 銷毀前
},
destroyed() {
// window.removeEventListener
// 銷毀完
},

父子組件生命周期執(zhí)行順序

father: beforeCreate
father: created
father: beforeMount

child: beforeCreate
child: created
child: beforeMount

child: mounted
father: mounted

父子組件傳值

父組件

  <div id="app">
      <p>father{{ counter }}</p>
      <button-counter @increment="fatherIncrement" :counter="counter"></button-counter>
  </div>
  <script>
    const app = new Vue({
      el: "#app",
      data: {
        counter: 0
      },
      methods: {
        fatherIncrement(value) {
          this.counter += value
        }
      },
    });
  </script>

子組件

 Vue.component('button-counter', {
      props: ['counter'],
      template: '<button @click="incrementHandler">child{{ counter }}</button>',
      methods: {
        incrementHandler() {
          this.$emit('increment', 10)
        }
      },
    })

.sync 修飾符:

用來簡寫子組件給父組件傳值科盛,不再需要父組件特意定一個(gè)方法接受子組件參數(shù)

  <div id="app">
    <div id="counter-event-example">
      <p>father{{ counter }}</p>
      <button-counter :counter.sync="counter"></button-counter>
    </div>
  </div>
  <script>

    Vue.component('button-counter', {
      props: ['counter'],
      template: '<button @click="changeCounter">child{{ counter }}</button>',
      methods: {
        changeCounter() {
          this.$emit('update:counter', 100)
        }
      },
    })

    const app = new Vue({
      el: "#app",
      data: {
        counter: 0
      },
    });
  </script>

插槽

實(shí)現(xiàn)將父組件里分發(fā)內(nèi)容給子組件

<!--父組件-->
<!--引用子組件時(shí)內(nèi)標(biāo)簽內(nèi)寫內(nèi)容-->
<navigation-link url="/profile">
  Your Profile
</navigation-link>

<!--子組件-->
<!--子組件里預(yù)寫了slot標(biāo)簽帽衙,最終會渲染為父組件傳過來的“Your Profile”-->
<a
  v-bind:href="url"
  class="nav-link"
>
  <slot></slot>
</a>

給插槽命名,以使用多個(gè)插槽,沒有命名的為默認(rèn)插槽贞绵。

<!--子組件-->
<div class="container">
  <header>
    <slot name="header"></slot>
  </header>
  <main>
    <slot></slot>
  </main>
  <footer>
    <slot name="footer"></slot>
  </footer>
</div>
<!--父組件-->
<base-layout>
<!--v-slot:header 可以被縮寫為 #header-->
  <template  #header>
    <h1>Here might be a page title</h1>
  </template>
  <p>A paragraph for the main content.</p>
  <p>And another one.</p>
  <template v-slot:footer>
    <p>Here's some contact info</p>
  </template>
</base-layout>

如果父組件想要訪問子組件的數(shù)據(jù)厉萝。可以通過bind向父組件傳遞數(shù)據(jù)榨崩。

<!--子組件-->
<span>
  <slot v-bind:user="user">
    {{ user.lastName }}
  </slot>
</span>
<!--父組件谴垫,接收對應(yīng)插槽default的數(shù)據(jù)并定義一個(gè)名稱。-->
<!--獲取到一個(gè)對象母蛛,里面有子組件傳過來的user翩剪,key為user-->
<current-user>
  <template v-slot:default="slotProps">
    {{ slotProps.user.firstName }}
  </template>
</current-user>

<!--解構(gòu)插槽對象-->
<current-user v-slot="{ user }">
  {{ user.firstName }}
</current-user>

混入

出現(xiàn)命名沖突時(shí):

數(shù)據(jù)對象在內(nèi)部會進(jìn)行遞歸合并,并在發(fā)生沖突時(shí)以組件數(shù)據(jù)優(yōu)先彩郊。

同名鉤子函數(shù)將合并為一個(gè)數(shù)組前弯,因此都將被調(diào)用。另外秫逝,混入對象的鉤子將在組件自身鉤子之前調(diào)用恕出。

值為對象的選項(xiàng),例如 methods违帆、componentsdirectives浙巫,將被合并為同一個(gè)對象。兩個(gè)對象鍵名沖突時(shí)前方,取組件對象的鍵值對狈醉。

局部混入

// 定義局部混入
const fooMixin = {
  data() {
    return {
      valueMixin: "foo - mixin",
    };
  },
};

const Foo = {
// 引入定義局部混入
  mixins: [fooMixin],
  data() {
    return {
      value: "foo - self",
    };
  },
  mounted() {
    console.log(this.value);//"foo - self"
    console.log(this.valueMixin);//"foo - mixin"
  },
}

全局混入

Vue.component("Foo", {
  data() {
    return {
      myOption: "Foo - option",
    };
  },
  template: `<div>Foo</div> `,
});

Vue.component("Bar", {
  data() {
    return {
      myOption: "Bar - option",
    };
  },
  template: `<div>Bar</div> `,
});

Vue.mixin({
  created: function () {
    console.log(this.myOption)
  }
})

new Vue({
  el: "#app",
  myOption: 'hell11o!',
  template: `<div> <Foo></Foo><Bar></Bar></div> `,
})

//控制臺輸出
Foo - option
Bar - option

動(dòng)態(tài)組件is

使用:is屬性來切換不同的子組件,is綁定的變量對應(yīng)的值為組件的名稱

<component :is="comName"></component>

keep-alive

失活的組件將會被緩存,切換組件保持頁面之前的狀態(tài),

keep-alive要求被切換到的組件都有自己的名字

includeexclude prop 允許組件有條件地緩存

被換成的組件有activateddeactivated兩個(gè)鉤子函數(shù)

<keep-alive include="a,b">
  <component v-bind:is="currentTabComponent"></component>
</keep-alive>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市惠险,隨后出現(xiàn)的幾起案子苗傅,更是在濱河造成了極大的恐慌,老刑警劉巖班巩,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渣慕,死亡現(xiàn)場離奇詭異,居然都是意外死亡抱慌,警方通過查閱死者的電腦和手機(jī)逊桦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抑进,“玉大人强经,你說我怎么就攤上這事∷律” “怎么了匿情?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵兰迫,是天一觀的道長。 經(jīng)常有香客問我炬称,道長汁果,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任玲躯,我火速辦了婚禮据德,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘跷车。我一直安慰自己棘利,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布姓赤。 她就那樣靜靜地躺著赡译,像睡著了一般。 火紅的嫁衣襯著肌膚如雪不铆。 梳的紋絲不亂的頭發(fā)上蝌焚,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機(jī)與錄音誓斥,去河邊找鬼只洒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛劳坑,可吹牛的內(nèi)容都是我干的毕谴。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼距芬,長吁一口氣:“原來是場噩夢啊……” “哼涝开!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起框仔,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤舀武,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后离斩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體银舱,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年跛梗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寻馏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡核偿,死狀恐怖诚欠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤轰绵,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布家乘,位于F島的核電站,受9級特大地震影響藏澳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜耀找,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一翔悠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧野芒,春花似錦蓄愁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至摇锋,卻和暖如春丹拯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背荸恕。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工乖酬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人融求。 一個(gè)月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓咬像,卻偏偏與公主長得像,于是被迫代替她去往敵國和親生宛。 傳聞我的和親對象是個(gè)殘疾皇子县昂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

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

  • 丨 props 父組件向子組件傳遞值和方法,不能修改父組件的數(shù)據(jù)陷舅,會報(bào)錯(cuò)倒彰,如果要對值進(jìn)行修改需要用到.sync進(jìn)行...
    墨浮云閱讀 260評論 0 2
  • Vue 組件之間的通信大概歸類為: 父子組件通信: props/$emit;ref/refs蔑赘;$attrs / $...
    睡神瘋子閱讀 7,347評論 0 25
  • 1. 父子組件通信 盡管我們可以使用1??this.$parent訪問父組件實(shí)例2??this.$children...
    overflow_hidden閱讀 249評論 0 0
  • 前言: vue3項(xiàng)目是在兩年前開始的狸驳,正式版3.0于2020年9月發(fā)布;目前vue生態(tài)支持情況還不完善缩赛,如vuex...
    eks閱讀 1,360評論 0 0
  • 一耙箍、組件 個(gè)人理解:為了復(fù)用代碼而進(jìn)行封裝代碼,以及封裝代碼塊之間的通信 1酥馍、全局組件 注:(1)辩昆、table標(biāo)簽...
    wsgdiv閱讀 434評論 1 2