1.语法:Vue.component("组件名字",{data,template}),代码如下:
  a. data: 必须是一个函数,有一个返回值。和vue里面的使用方法一样
  b. template: 用来标示这个组件的渲染后的具体的代码

<div id='app'>
  <button-count></button-count>
  <button-count></button-count>
  <button-count></button-count>
</div>
<script>
  Vue.component("button-count",{
    template:"<button @click='count+=1'>点击了{{count}}</button>",
    data:function(){
      return{
        count:0
      }
    }
  })
  new Vue({
      el:'#app',
      data:{
        }
  })
</script>

2.组件的属性是通过props定义的,可以是一个数组,直接写属性名字。也可以是一个对象,可以给每个属性定义约束,比如:type,required,default。组件中只能有一个根元素。代码如下:

<div id='app'>
  <blog-list :blogs="blogs"></blog-list>
</div>
<script>
  Vue.component("blog-list",{
  //props:['blogs']
    props:{
    blogs:{
      type:Array,
      required:true
    }
    },
  template:`
    <table>
      <thead>
        <tr>
          <th>序号</th>
          <th>标题</th>
        </tr>
      </thead>
    <tbody>
      <tr v-for="(blog,index) in blogs">
        <td>{{index+1}}</td>
        <td>{{blog.title}}</td>
      </tr>
      </tbody>
    </table>
`
  })
new Vue({
  el:'#app',
  data:{
    blogs:[{
      title:"坏蛋是怎样练成的",
      content:"xxx"
    },{
      title:"python基础",
      content:"ooo"
    }]
    }
  })
</script>

3.自定义组件添加事件:代码如下:
a.在需要触发事件的时候,调用this.$emit(事件名称,参数...)
b.在使用这个组件的时候,绑定事件,语法同html比如:@check-chenged

<div id='app'>
  <blog-itme v-for="blog in blogs" :blog=blog @check-changed="checkChanged"></blog-itme>
  <h1>选中的是:</h1>
  <div v-for="blog in selected_blogs">
    {{blog.title}}
  </div>
</div>
<script>
  Vue.component("blog-itme",{
    props:["blog"],
    template:`
      <div>
        <span>{{blog.title}}</span>
        <input type="checkbox" @click="onCheck">
      </div>
    `,
  methods:{
    onCheck(){
      this.$emit("check-changed",this.blog)
      }
    }
  })
new Vue({
  el:'#app',
    data:{
      blogs:[{
        title:"坏蛋是怎样练成的",
        id:"1"
      },{
        title:"python基础",
        id:"2"
      }],
      selected_blogs:[]
    },
  methods:{
    checkChanged(blog){
    // console.log(blog);
    //indexOf:获取某个元素在数组中的位置,如果返回非负数说明存在就是下标,反之不存在
      let index = this.selected_blogs.indexOf(blog)
        if(index>=0){
          this.selected_blogs.splice(index,1)
        }else{
          this.selected_blogs.push(blog)
        }
      }
    }
  })
</script>

4.自定义组件v-model:计步器-->在配置中需要两个属性进行配置
a.event:代表什么情况下触发这个v-model行为
b.prop:代表传给v-model的那个变量,要绑定到那个属性上
c.调用this.$emit(model.event,计算后的结果)就可以了,代码如下:

<div id='app'>
  <Stepper v-model="goods_count"></Stepper>
</div>
<script>
//计步器
  Vue.component("Stepper",{
    props:['count'],
      model:{
        event:"count-changed",
        prop:"count"
      },
  template:`
    <div>
      <button @click="sub">-</button>
      <span>{{count}}</span>
      <button @click="add">+</button>
    </div>
    `,
  methods:{
    sub(){
      this.$emit("count-changed",this.count-1)
    },
    add(){
      this.$emit("count-changed",this.count+1)
    }
    }
  })
  new Vue({
    el:'#app',
    data:{
      goods_count:0
    }
  })
</script>

5.自定义组件--插槽
a.插槽的用法是在组件的模板代码汇总,在指定的位置使用slot,以后在使用这个组件的时候,在组件中添加的内容都在slot的位置
b.作用区域:插槽中只能使用组件中的数据,只能从父组件中读取数据
c.默认值,可以填写一个默认值,使用的时候可以用默认值,也可以自己写值 代码如下:

<div id='app'>
  <chacao url="https://www.baidu.com/">百度</chacao>
<div>
  <moren>哈哈</moren>
  <moren></moren>
</div>
</div>
<script>
  Vue.component("chacao",{
    props:['url'],
    template:`
  <div>
    <a :href="url">谷歌</a>
    <slot></slot>
  </div>
  `
  })
  Vue.component("moren",{
  template:`
    <button>
    <slot>确定</slot>
    </button>`
  })
  new Vue({
    el:'#app',
    data:{
  }
  })
</script>

6.自定义名称插槽:如果想要在自定义组件中定义多个插槽,就需要给插槽取个名字。
a.定义: <slot name="名称"></slot>
b.使用: <template v-slot:名称>XXX</template>
代码如下:

<div id='app'>
  <container>
  <template v-slot:header>这个是header</template>
  <template v-slot:body>这个是body</template>
  <template v-slot:footer>这个是footer</template>
  </container>
</div>
<script>
  Vue.component('container',{
    template:`
    <div class="container">
      <div>
        <slot name="header"></slot>
      </div>
    <div>
      <slot name="body"></slot>
    </div>
    <div>
      <slot name="footer"></slot>
    </div>
    </div>
  `
  })
  new Vue({
    el:'#app',
    data:{
      }
  })
</script>

7.自定义插槽作用域:
a.把不要给差插槽的变量绑定到slot上
b.在使用插槽的时候指定名称后,加上一个名称,绑定到slot上所有的属性可以通过这个名称获得 代码如下:

<div id='app'>
  <container>
  <template v-slot:header="headerprops">
  {{headerprops.navs}}
  </template>
  <template v-slot:footer="footerprops">
  {{footerprops.address}}/ {{footerprops.aboutus}}
  </template>
  </container>
</div>
<script>
  Vue.component("container",{
    template:`
      <div>
      <div class="header">
      <slot name="header" :navs="navs"></slot>
      </div>
      <div class="footer">
        <slot name="footer" :address="address" :aboutus="aboutus"></slot>
      </div>
      </div>
  `,
  data:function(){
    return {
    "address":"公司地址",
    "aboutus":"关于我们",
    navs:['网络设置','我的谁']
  }
  }
  })
    new Vue({
      el:'#app',
      data:{
        }
  })
</script>

四、vue基础--自定义组件的更多相关文章

  1. vue基础----自定义组件directive ,bind,update,insert

    <div id="app"> <input type="text" v-limit.3="msg" v-focus> ...

  2. vue中自定义组件(插件)

    vue中自定义组件(插件) 原创 2017年01月04日 22:46:43 标签: 插件 在vue项目中,可以自定义组件像vue-resource一样使用Vue.use()方法来使用,具体实现方法: ...

  3. 【VUE】自定义组件

    [VUE]自定义组件 转载: ============================================ ======================================== ...

  4. Vue基础-自定义事件的表单输入组件、自定义组件的 v-model

    Vue 测试版本:Vue.js v2.5.13 学习 Vue 的自定义事件的表单输入组件,觉得文档讲的不太细致,所以这里再细化一下: 如果不用 v-model,代码应该是这样: <myinput ...

  5. vue的自定义组件和组件传值

    <div id="app"> <div>{{pmessage}}</div> //父组件 <child :message="pm ...

  6. vue之自定义组件

    除了核心功能默认内置的指令外,vue也允许用户注册自定义指令.虽然在vue2.0中,代码复用和抽象的主要形式是组件,但是有些情况下,我们仍需要对普通DOM元素进行底层操作,这个时候就需要用到自定义指令 ...

  7. vue 相邻自定义组件渲染错误正确的打开方式

    话不多说看问题: 当封装自定义组件时例如(自定义下拉列表)两个相同的组件在多次v-if变化时偶尔会发生渲染错误,明明赋值正确但是组建中的ajax方法可能返回的数据乱掉,或者其他神逻辑错误. 经过查询发 ...

  8. 编程小白入门分享五:Vue的自定义组件

    前言 上篇博客简单介绍了vue,本篇博客要在对vue有一定了解后,才可以比较容易理解自定义组件.想要封装好一个组件,一定要熟练掌握这三个技能,父组件 -> 子组件传值(props).子组件 -& ...

  9. vue发布自定义组件到npm

    一.使用 vue create currentdatetime创建项目(可查考https://cli.vuejs.org/zh/guide/creating-a-project.html),创建成功后 ...

随机推荐

  1. laydate年份选择,关闭底框,点击指定年份就选择然后关闭控件,翻页不选择也不关闭控件

    如下图,翻页不选择也不关闭.点击指定年份时再选择和关闭控件 代码如下 // 默认没有选择,把判断赋值当前时间 var iYearCode = parseInt(new Date().getFullYe ...

  2. layer弹出层,结合art-template实现弹出编辑

    模板 <!-- 模板 --> <script id="render-tpl" type="text/html"> <div cla ...

  3. [转帖]如何保护你的 Python 代码 (一)—— 现有加密方案

    如何保护你的 Python 代码 (一)—— 现有加密方案 Prodesire Python猫 1周前

  4. kubernetes 部署ingress

    kubernetes Ingess 是有2部分组成,Ingress Controller 和Ingress服务组成,常用的Ingress Controller 是ingress-nginx,工作的原理 ...

  5. Windows10下安装numpy

    1.https://bootstrap.pypa.io/get-pip.py 下载get-pip.py(右键另存为即可) 2.命令行下在get-pip.py所在文件夹下运行get-pip.py 3.命 ...

  6. Kafka集群安装及prometheus监控

    前提 zookeeper安装参考:https://www.cnblogs.com/JustinLau/p/11372782.html 其他安装参考:https://www.cnblogs.com/lu ...

  7. LOJ2557 CTSC2018组合数问题(提交答案)

    直接利用simulator退火应该可以得到大量分数. op=1:1,4,5,6,10 即构造序列{ai},最小化Σti,ai+rai,aj. 1:暴搜/退火. 4:观察到图大致成一条链(注意其中有两个 ...

  8. Codeforces 666E Forensic Examination(广义后缀自动机+线段树合并)

    将所有串(包括S)放一块建SAM.对于询问,倍增定位出该子串所在节点,然后要查询的就是该子串在区间内的哪个字符串出现最多.可以线段树合并求出该节点在每个字符串中的出现次数. #include<b ...

  9. 日志(log4j2)

    日志测试java代码如下: package com.learn.test; import org.apache.logging.log4j.LogManager; import org.apache. ...

  10. D盘Program Files 文件夹里文件不显示,没隐藏。怎么才能显示出来?

    D盘里有两个一模一样的Program Files 文件夹,文件夹里文件不显示,没隐藏.怎么才能显示出来?新买不久的电脑,win8.1系统 点击开始---运行---输入“cmd”(没有引号)---在弹出 ...