Vue學(xué)習(xí)筆記——組件化開發(fā)

視頻資源來自:b站coderwhy王紅元老師——最全最新Vue、Vuejs教程,從入門到精通
文件僅為個人觀看視頻后的學(xué)習(xí)心得筆記,用于個人查看和記錄保存。文中定有疏漏錯誤之處,懇請指正。

目錄:
邂逅Vuejs
Vue基礎(chǔ)語法
組件化開發(fā)
前端模塊化
webpack詳解
Vue CLI詳解
vue-router
Promise的使用
Vuex詳解
網(wǎng)絡(luò)模塊封裝
項目實戰(zhàn)

組件化開發(fā)

認識組件化

組件化是Vue.js中的重要思想,提供了一種抽象,讓我們可以開發(fā)出一個個獨立可復(fù)用的小組件來構(gòu)造我們的應(yīng)用。

注冊組件

組件的使用分成三個步驟:

①創(chuàng)建組件構(gòu)造器
②注冊組件
③使用組件

image-20210725092428867

反單引號可以自由換行:

a = `asdas
dads`
<div id="app">
  <my-cpn></my-cpn>
  <my-cpn></my-cpn>
</div>
<script src="../js/vue.js"></script>
<script>
  //1.創(chuàng)建組件構(gòu)造器對象
  const cpnC = Vue.extend({
    template: `
    <div>
      <h2>我是標(biāo)題</h2>
      <p>我是內(nèi)容</p>
      <p>內(nèi)容是我</p>
    </div>
    `
  })

  //2.注冊組件
  Vue.component('my-cpn',cpnC)
  

必須放在vue實例中才能實現(xiàn)

組件其它補充

全局組件和局部組件

全局組件:意味著可以在多個Vue的實例下面使用

<script>
  const cpnC = Vue.extend({
    template: `
      <div>
        <h2>我是標(biāo)題</h2>
        <p>我是內(nèi)容</p>
      </div>
    `
  })

  /*全局組件*/
  Vue.component('cpn',cpnC)

  const app=new Vue({
    el: '#app',
    data: {
      message: '你好啊'
    },
    /*局部組件*/
    components: {
      cpn: cpnC
    }
  })
</script>

父組件和子組件

<div id="app">
  <cpn2></cpn2>
</div>
<script src="../js/vue.js"></script>
<script>
  const cpnC1 = Vue.extend({
    template: `
      <div>
        <h2>我是標(biāo)題1</h2>
        <p>我是內(nèi)容1</p>
      </div>
    `
  })
  const cpnC2 = Vue.extend({
    template: `
      <div>
        <h2>我是標(biāo)題2</h2>
        <cpn1></cpn1>
        <p>我是內(nèi)容2</p>
      </div>
    `,
    components: {
      cpn1: cpnC1
    }
  })
  const app=new Vue({
    el: '#app',
    data: {
      message: '你好啊'
    },
    components: {
      cpn2: cpnC2,
    }
  })
</script>

這里,cpn1是子組件,cpn2是父組件

注冊組件的語法糖寫法

全局組件:

Vue.component('cpn1',{
  template: `
    <div>
      <h2>我是標(biāo)題1</h2>
      <p>我是內(nèi)容1</p>
    </div>
  `
})

局部組件:

const app=new Vue({
  el: '#app',
  data: {
    message: '你好啊'
  },
  components: {
    'cpn2': {
      template: `
        <div>
          <h2>我是標(biāo)題1</h2>
          <p>我是內(nèi)容1</p>
        </div>
      `
    }
  }
})

組件模板的分離寫法

<template id="cpn">
<div>
  <h2>{{title}}</h2>
  <p>我是內(nèi)容</p>
</div>
</template>

<script src="../js/vue.js"></script>
<script>
  Vue.component('cpn',{
    template: '#cpn',
    data(){
      return {
        title: 'abc'
      }
    }
  })

組件數(shù)據(jù)存放

組件中不能直接訪問vue實例中的data

<template id="cpn">
  <div>
    <h2>當(dāng)前計數(shù):{{counter}}</h2>
    <button @click="add">+</button>
    <button @click="sub">-</button>
  </div>
</template>

<script src="../js/vue.js"></script>
<script>
  Vue.component('cpnc',{
    template: '#cpn',
    data(){
      return {
        counter: 0
      }
    },

組件模板的{{}}必須用自己的data數(shù)據(jù),而不是頂層vue

組件對象也有data屬性,但必須是一個函數(shù)。
為什么?

<div id="app">
  <cpnc></cpnc>
  <cpnc></cpnc>
  <cpnc></cpnc>
</div>

<template id="cpn">
  <div>
    <h2>當(dāng)前計數(shù):{{counter}}</h2>
    <button @click="add">+</button>
    <button @click="sub">-</button>
  </div>
</template>

這個三個cpnc數(shù)據(jù)不共享,因為data是函數(shù)。數(shù)據(jù)獨立

父子組件通信

父傳子(props)

properties屬性

實際開發(fā)中,一般是服務(wù)器給大組件數(shù)據(jù),小組件不請求(壓力大)

image-20210725102403420
<div id="app">
  <cpn :cmovies="movies" :cmessage="message"></cpn>
</div>

<template id="cpn">
  <div>
    <p>{{cmovies}}</p>
    <h2>{{cmessage}}</h2>
  </div>
</template>

↑一定要v-bind,否則就把message當(dāng)成字符串了

props: ['cmovies','cmessage'],

props,數(shù)組寫法↑

props,對象寫法↓

const cpn ={
  template: '#cpn',
  props: {
    cmessage:{
      type: String,
      default: 'aaaaaa',
      requires: true
    },
    cmovies: {
      type: Array,
      default: []
    }
  }
}

const app=new Vue({
  el: '#app',
  data: {
    message: '你好啊',
    movies: ['海王','海賊王','海爾兄弟']
  },
  components: {
    cpn
  }
})

requires: true ——必傳值
還可以傳對象(用函數(shù)寫)、自定義驗證函數(shù)

image-20210725103708584

props 用駝峰標(biāo)識 iLoveYou
html 類型屬性不區(qū)分大小寫,- - -命名法。cInfo可以寫作c-info

子傳父(自定義事件)

子組件 $emit 發(fā)射事件
父組件 v-on

<div id="app">
  <cpn v-on:item-click="cpnClick"></cpn>
</div>

<template id="cpn">
  <div>
    <button v-for="m in categories"
            v-on:click="btnClick(m)">
      {{m.name}}
    </button>
  </div>
</template>
<script src="../js/vue.js"></script>
<script>
  const cpn={
    template: '#cpn',
    data() {
      return {
        categories: [
          {id:'aaa',name: '熱門推薦'},
          {id:'bbb',name: '手機數(shù)碼'},
          {id:'ccc',name: '家用家電'},
        ]
      }
    },
    methods: {
      btnClick(item) {
        this.$emit('item-click',item);
      }
    }
  }
  const app=new Vue({
    el: '#app',
    data: {
    },
    components: {
      cpn
    },
    methods: {
      cpnClick(itemm){
        console.log('cpnnn',itemm);
      }
    }
  })
</script>

結(jié)合雙向綁定案例

num = parseInt(value)
num = parseFloat(value)

將數(shù)據(jù)轉(zhuǎn)成number型

props: {
  number1:Number,
},
data(){
  return{
    dnumber1:this.number1,
  }
},

父組件傳過來的值不可更改,必須用data把父組件數(shù)據(jù)拷貝一次后才能更改。

若想父組件跟著子組件改,用v-model雙向綁定的例子。@input="函數(shù)"

watch實現(xiàn)

父子組件的訪問

父子組件的訪問方式$children、$refs (reference 引用)
子訪問父 $parent、$root

<div id="app">
  <cpn></cpn>
  <cpn></cpn>
  <cpn ref="aaa"></cpn>
  <button @click="btnClick">按鈕</button>
</div>

<template id="cpn">
  <div>
    <h2>我是子組件</h2>
  </div>
</template>
console.log(this.$children);
for(let c of this.$children){
  console.log(c.name);
  c.showMessage();
}

↑用$children,當(dāng)有好幾個子組件的時候,還可以依次訪問。但是數(shù)組只能用1、2、3來標(biāo)識,可能會指示不清。可以用$refs

↓在html標(biāo)簽上加上ref="aaa",相當(dāng)于key,aaa是給這個子組件取的名字。用$refs訪問。

console.log(this.$refs.aaa.name)

實際中,$refs用得多

用$parent,子組件與父組件耦合度太高,復(fù)用性低

而this.$root.message 直接訪問vue實例

slot的使用

基本使用

<div id="app">
  <cpn></cpn>
  <cpn><span>哈哈哈</span></cpn>
  <cpn><i>111</i></cpn>
</div>

<template id="cpn">
  <div>
    <h2>我是標(biāo)題</h2>
    <p>我是組件</p>
    <slot><button>按鈕</button></slot>
  </div>
</template>
image

因為只有一個插槽,如果寫得多了,就全部替換

<slot></slot>里的是默認顯示

具名插槽

<div id="app">
  <cpn>
    <span slot="center">標(biāo)題</span>
    <button slot="right">返回</button>
  </cpn>
</div>

<template id="cpn">
  <div>
    <slot name="left"><span>左邊</span></slot>
    <slot name="center"><span>中間</span></slot>
    <slot name="right"><span>右邊</span></slot>
  </div>
</template>
image

編譯的作用域

<!--vue實例作用域-->
<div id="app">
  <cpn v-show="isShow"></cpn>
</div>

<!--字組件作用域-->
<template id="cpn">
  <div>
    <h2>我是標(biāo)題</h2>
    <p>我是內(nèi)容</p>
    <button v-show="isShow">按鈕</button>
  </div>
</template>

作用域插槽

父組件替換插槽的標(biāo)簽,但是內(nèi)容由子組件來提供

<div id="app">
  <cpn></cpn>

  <cpn>
    <template slot-scope="aaa">
      <span v-for="item in aaa.ddd">{{item}} - </span>
    </template>
  </cpn>

  <cpn>
    <template slot-scope="aaa">
      <span>{{aaa.ddd.join(' - ')}}</span>
    </template>
  </cpn>
</div>

<template id="cpn">
  <div>
    <slot :ddd="languages">
      <ul>
        <li v-for="m in languages">{{m}}</li>
      </ul>
    </slot>
  </div>
</template>

this.languages.join('-'):用 - 作為字符串間的連接

image
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,363評論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,497評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,305評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,962評論 1 311
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,727評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,193評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,257評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,411評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,945評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,777評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,978評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,519評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,216評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,657評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,960評論 2 373

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