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. iostat (转https://www.cnblogs.com/ftl1012/p/iostat.html)

    iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视.它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况.iostat也有一个弱 ...

  2. python爬虫的入门问题

    第一张图是代码,爬的是亚马逊的一个商品网页,能爬出来内容,但是内容之间有很多空白换行,这是什么原因?要怎么解决?

  3. spring cloud 快速搭建

    1.首先新建一个普通maven工程 项目名自定义都可以 2.然后在maven工程下新建一个基于spring boot 的module 为注册中心,勾选Eureka的配置,在启动类上面加注解@Enabl ...

  4. MySQL 配置参数优化

    MySQL 配置参数优化 1.修改back_log参数值:由默认的50修改为500 back_log=500back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中 ...

  5. [转帖]Oracle数据库lob大对象数据类型字段总结,值得收藏

    Oracle数据库lob大对象数据类型字段总结,值得收藏 原创 波波说运维 2019-07-11 00:02:00 https://www.toutiao.com/i67108943269703357 ...

  6. [转帖]postgres csv日志和查看用户权限

    postgres csv日志和查看用户权限 最近在使用postgres 时遇到的2个问题,顺便记录一下查到的比较好的资料. 怀疑postgres在执行SQL时报错,程序日志中有无明确异常信息.通过查看 ...

  7. fiddler手机抓包1

    1.手机抓包配置教程:https://www.jianshu.com/p/724097741bdf 2.

  8. LC 33. Search in Rotated Sorted Array

    问题描述 Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. ...

  9. Scrapy各部分运行机制?Xpath为None?多层Response如何编写?搞定Scrapy的坑

    前言 Scrapy那么多模块都是怎么结合的啊?明明在chrome上的xpath helper插件写好了xpath,为什么到程序就读取的是None?Scrapy可以直接写多层response么?难道必须 ...

  10. 20191011-构建我们公司自己的自动化接口测试框架-Util的TestDataHandler模块

    TestDataHandler模块主要是做测试数据的处理,包括转换数据格式和变量参数处理转换数据格式函数: data是数据,data以$()的方式识别变量,如果请求的数据有变量,则将变量用global ...