Vue 组件

Vue 组件

组件是可复用的Vue实例,可以通过Vue.component(id, definition)创建全局组件。id是组件的名称,defintion是组件的描述对象和创建Vue实例对象一样(除el,el是跟组件挂载元素,组件不需要挂载点,是在父组件、根组件中作为自定义元素使用)。

Vue.component('my-component', {
    data() {
      return {
        b: '我是子组件'
      }
    },
    template: `
	    <div>{{b}}</div>
	  `
  })

  let vm = new Vue({
    el: document.querySelector('#id'),
    data: {
      a: 11
    },
    template: `
	    <div>
	      <my-component></my-component>
	    </div>
	  `
  })

与根组件不同,组件data配置必须是一个函数。否则会抛出错误:

vue.js:5108  [Vue warn]: The "data" option should be a function that returns a per-instance value in component definitions.

因为组件是可以复用的,则要确保每一个组件的data项都是一个新的引用地址。

注册局部组件

通过普通JavaScript对象定义,并且在父组件components中注册

let componentA = ({
  data(){
    return {
      b: '我是局部子组件'
    }
  },
  template: `
  <div>{{b}}</div>
`
})

let vm = new Vue({
  el: document.querySelector('#id'),
  data: {
    a: 11
  },
  template: `
    <div>
      <componentA></componentA>
    </div>
  `,
  components: {
    componentA
  }
})

props传值

可以通过props传值给子组件。父组件使用时传递attribute,子组件通过props配置项接收。props可以是数组写法,也可以是对象写法。对象写法可以配置类型和默认值

let componentA = ({
   data(){
     return {
       b: '我是局部子组件'
     }
   },
   props: {
     title: {
       type: String,
       default: '默认标题'
     }
   },
   template: `
   <div>{{b}}--标题是:{{title}}</div>
 `
 })

 let vm = new Vue({
   el: document.querySelector('#id'),
   data: {
     a: 11
   },
   template: `
     <div>
       <componentA title="我是标题一"></componentA>
     </div>
   `,
   components: {
     componentA
   }
 })

监听子组件事件

可以与父级进行沟通。子组件通过$emit 方法并传入事件名称来触发一个事件,并且可以传递参数。父组件接收该事件

// 子组件
template: `
  <div>
    {{b}}--标题是:{{title}}
    <button v-on:click="$emit('changeA',22)">向父组件沟通</button>
  </div>
`
// 父组件
template: `
	<div>
	   <componentA title="我是标题一" v-on:changeA="changeA"></componentA>
	 </div>
	`,
components: {
 componentA
},
methods: {
 changeA(event) {
   console.log(event)
 }
},

在组件使用v-model

在组件使用v-model会默认使用value为property传递给子组件;input事件为接收事件。

<my-input v-model="message"></my-input>
//相当于
<my-input v-bind:value="message" v-on:input="message = $event">
// 代码
let componentA = ({
  props: {
     value: {
       type: String,
       default: ''
     }
   },
   template: `
     <input v-bind:value="value" v-on:input="$emit('input', $event.target.value)"></input>
   `
 })

 let vm = new Vue({
   el: document.querySelector('#id'),
   data: {
     message: ''
   },
   template: `
     <div>
       <componentA v-model="message"></componentA>
       <div>自定义输入组件输入值为: {{message}}</div>
     </div>
   `,
   components: {
     componentA
   },
 })

如果需要更换property和事件,添加model配置项即可:

 model: {
   prop: 'checked',
   event: 'change'
 },

组件触发原生事件

添加v-on的.native修饰符。需要注意,组件根元素有对应事件才可,否则会静默失败

<base-input @focus.native="onFocus"></base-input>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值