Vue学习笔记——组件化开发

视频资源来自:b站coderwhy王红元老师——最全最新Vue、Vuejs教程,从入门到精通
文件仅为个人观看视频后的学习心得笔记,用于个人查看和记录保存。文中定有疏漏错误之处,恳请指正。

目录:
邂逅Vuejs
Vue基础语法
组件化开发
前端模块化
webpack详解
Vue CLI详解
vue-router
Promise的使用
Vuex详解
网络模块封装
项目实战

组件化开发

认识组件化

组件化是Vue.js中的重要思想,提供了一种抽象,让我们可以开发出一个个独立可复用的小组件来构造我们的应用。

注册组件

组件的使用分成三个步骤:

①创建组件构造器
②注册组件
③使用组件

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.创建组件构造器对象
  const cpnC = Vue.extend({
    template: `
    <div>
      <h2>我是标题</h2>
      <p>我是内容</p>
      <p>内容是我</p>
    </div>
    `
  })

  //2.注册组件
  Vue.component('my-cpn',cpnC)
  

必须放在vue实例中才能实现

组件其它补充

全局组件和局部组件

全局组件:意味着可以在多个Vue的实例下面使用

<script>
  const cpnC = Vue.extend({
    template: `
      <div>
        <h2>我是标题</h2>
        <p>我是内容</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>我是标题1</h2>
        <p>我是内容1</p>
      </div>
    `
  })
  const cpnC2 = Vue.extend({
    template: `
      <div>
        <h2>我是标题2</h2>
        <cpn1></cpn1>
        <p>我是内容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>我是标题1</h2>
      <p>我是内容1</p>
    </div>
  `
})

局部组件:

const app=new Vue({
  el: '#app',
  data: {
    message: '你好啊'
  },
  components: {
    'cpn2': {
      template: `
        <div>
          <h2>我是标题1</h2>
          <p>我是内容1</p>
        </div>
      `
    }
  }
})

组件模板的分离写法

<template id="cpn">
<div>
  <h2>{{title}}</h2>
  <p>我是内容</p>
</div>
</template>

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

组件数据存放

组件中不能直接访问vue实例中的data

<template id="cpn">
  <div>
    <h2>当前计数:{{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数据,而不是顶层vue

组件对象也有data属性,但必须是一个函数。
为什么?

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

<template id="cpn">
  <div>
    <h2>当前计数:{{counter}}</h2>
    <button @click="add">+</button>
    <button @click="sub">-</button>
  </div>
</template>

这个三个cpnc数据不共享,因为data是函数。数据独立

父子组件通信

父传子(props)

properties属性

实际开发中,一般是服务器给大组件数据,小组件不请求(压力大)

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当成字符串了

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

props,数组写法↑

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 ——必传值
还可以传对象(用函数写)、自定义验证函数

image-20210725103708584

props 用驼峰标识 iLoveYou
html 类型属性不区分大小写,- - -命名法。cInfo可以写作c-info

子传父(自定义事件)

子组件 $emit 发射事件
父组件 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: '手机数码'},
          {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>

结合双向绑定案例

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

将数据转成number型

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

父组件传过来的值不可更改,必须用data把父组件数据拷贝一次后才能更改。

若想父组件跟着子组件改,用v-model双向绑定的例子。@input="函数"

watch实现

父子组件的访问

父子组件的访问方式$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,当有好几个子组件的时候,还可以依次访问。但是数组只能用1、2、3来标识,可能会指示不清。可以用$refs

↓在html标签上加上ref="aaa",相当于key,aaa是给这个子组件取的名字。用$refs访问。

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

实际中,$refs用得多

用$parent,子组件与父组件耦合度太高,复用性低

而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>我是标题</h2>
    <p>我是组件</p>
    <slot><button>按钮</button></slot>
  </div>
</template>
image

因为只有一个插槽,如果写得多了,就全部替换

<slot></slot>里的是默认显示

具名插槽

<div id="app">
  <cpn>
    <span slot="center">标题</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>我是标题</h2>
    <p>我是内容</p>
    <button v-show="isShow">按钮</button>
  </div>
</template>

作用域插槽

父组件替换插槽的标签,但是内容由子组件来提供

<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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容