vue-组件component

Posted Liane

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue-组件component相关的知识,希望对你有一定的参考价值。

一、组件注册
1、组件名:可以使用kebab-case短横线分隔命名,也可以使用PascalCase驼峰命名。
2、全局注册
使用Vue.component来创建的组件作用域是全局,在任何新创建的Vue根实例(new Vue)的模板中,都可以使用。

<div id="app">
    <my-component title=\'计数器\' text=\'添加\' @clicknow=\'getCount\'>
        <!-- span会被放如到组件中<slot>标签的位置 -->
        <span>我是一个插入到组件末尾的span</span>
    </my-component>
</div>
<script>
Vue.component(\'myComponent\', {
    props:[
        \'title\',
        \'text\'
    ],
    data: function(){
        return {
            count: 0
        }
    },
    methods:{
        add:function(){
            this.count++
            //可以派发一个事件到组件实例,抛出一个值
            //使用$emit(),第一个参数是事件名称,第二个值是传递参数
            this.$emit(\'clicknow\',this.count)
        }
    },
    template: `<div>
        {{title}}
        <div class="btn" @click=\'add\'>{{text}}</div>
        <span>{{count}}</span>
        <!--通过插槽,可以向一个组件传递内容-->
        <slot></slot>
    </div>`
})
let vm = new Vue({
    el: \'#app\',
    data: {},
    methods: {
        getCount:function(e){
            alert(e)
        }
    }
})
</script>

3、局部注册

    <div id="app">
      <div class="btn" @click="showConfirm">删除文件</div>
      <my-confirm v-if="isShow" title="删除文件" @myclick="checkDelete">
        <p>确认删除吗?删除后无法恢复!</p>
      </my-confirm>
    </div>
    <script>
      let vm = new Vue({
        el: \'#app\',
        data: {
          isShow: false
        },
        methods: {
          checkDelete: function (e) {
            e && console.log(\'删除成功\')
            this.isShow = false
          },
          showConfirm: function () {
            this.isShow = true
          }
        },
        components: {
          myConfirm: {
            props: [\'title\'],
            data: function () {
              return {}
            },
            methods: {
              cancel: function () {
                this.$emit(\'myclick\', false)
              },
              confirm: function () {
                this.$emit(\'myclick\', true)
              }
            },
            template: `<div>
                <span>{{title}}</span>
                <slot></slot>
                <button @click=\'cancel\'>取消</button>
                <button @click=\'confirm\'>确认</button>
              </div>`
          }
        }
      })
    </script>

4、单文件注册
使用.vue文件注册
1)、安装npm(安装node.js,内置有npm,不需要单独安装npm)
2)、安装vue-cli

npm install -g @vue/cli

3)、安装webpack

npm install -g webpack

在项目的components文件夹下,创建一个First.vue文件,注册组件如下:

<template>
  <section class="first">
    <h2>{{msg}}</h2>
  </section>
</template>
<script>
export default {
  name: \'First\',
  data:function(){
    return {}
  },
  props:{
    msg:{
      type: String,
      default: \'test\'
    }
  },
  methods:{}
}
</script>

<style scoped>
.first {
  color: red;
}
</style>

在需要组件的地方使用import引入即可

<template>
  <first msg=\'test\'></first>
</template>
<script>
  import First from \'./components/first.vue\'

  export default {
    components: {
      First
    }
  }
</script>

二、Prop
html中大小写不敏感,则在使用组件作为DOM模板时,驼峰命名的Prop名都需要使用kebab-case短横线分割命名

<div id="app"> 
  <!-- 在 HTML 中是 kebab-case 的 -->
  <blog-post post-title="hello!"></blog-post>
</div>
<script>
  Vue.component(\'blog-post\', {
    // 在 javascript 中是 camelCase 的
    //props: [\'postTitle\'],
    
    //prop可以指定任意类型,例如有props如下:[\'postTitle\',\'count\',\'isShow\',\'list\',\'obj\',\'callback\']
    //可以写成对象的形式,注明类型
    pops:{
      PostTitle: String,
      count: Number,
      isShow: Boolean,
      list: Array,
      obj: Object,
      callback: Function
      //...或者任意类型
    }
     
    template: \'<h3>{{ postTitle }}</h3>\'
  })
  let vm = new Vue({
    el: \'\'app,
    components:{
      blog-post
    }
  })
</script>

动态prop
使用v-bind绑定对应的prop名,可以传入动态的值

<my-component :title=\'title\'></my-component>

传入一个对象的所有property
若想将一个对象obj的所有属性作为单个prop传入,可以使用不带参数的v-bind

obj:{
  title: \'My component\',
  list: [1,2,3]
}
<my-component v-bind=\'obj\'></my-component>
<!--等价于-->
<my-component v-bind:title=\'obj.title\'></my-component>
<my-component v-bind:list=\'obj.list\'></my-component>

以上是关于vue-组件component的主要内容,如果未能解决你的问题,请参考以下文章

Vue组件之全局组件与局部组件

vue-个人学习----组件

Vue组件

Vue 组件

Vue.js 组件 component

VueJS 组件:具有 vue-class-component 的单独文件的代码覆盖率