VUE03
2018-08-15 本文已影响0人
mbone
Vue组件
组件的创建
组件可以扩展HTML元素,封装可重用的代码。所有的 Vue 组件同时
也都是 Vue 的实例,所以可接受相同的选项对象 (除了一些根级特
有的选项) 并提供相同的生命周期钩子。
组件创建注意事项:
1.模板template只能有一个根节点;
2.创建组件时若采用驼峰命名法,使用的时候必须采用name1-name2的格式
组件的创建方式:
1.使用Vue.extend()和Vue.component()两个方法创建
Vue.extend()返回一个组件构造器,它里面有一个参数,是一个对象,里面是一些配置项
Vue.component()利用Vue.extend()返回的构造器创建一个组件实例,包含两个参数,组件名和组件构造器
```
var Index = Vue.extend({
// 指定组件显示的模板
template: "<div>我是首页</div>"
})
// 创建一个全局组件index-a
Vue.component('indexA', Index)
```
2.直接使用Vue.component()方法创建
```
Vue.component('indexB', {
template: '<div>我是index-b</div>'
})
```
3.通过指定模板创建
```
Vue.component('indexD', {
template: '#itcast'
})
<template id="itcast">
<div>我是index-d</div>
</template>
Vue.component('indexE', {
template: '#heima'
})
<script type="x-template" id="heima">
<div>我是index-e</div>
</script>
```
组件的指令以及事件绑定
全局注册一个组件,组件中的data,methods以及指令等都适用,但data现在必须是个函数,且返回一个新的对象。这样避免组件间都引用同一个对象
<template id="itcast">
<div>我是index-d</div>
</template>
Vue.component('index',{
template:"#itcast",
data(){
return {
name:"zs"
}
},
methods:{
tellMe(){
alert('我是'+this.name)
}
}
})
父子组件创建
Vue.component('parent',{
template:"<div>{{name}}和<son></son>是朋友</div>",
data(){
return {
name:"zs"
}
},
components:{
con:{
template:"<div>{{name}}</div>",
data(){
return {
name:"ls"
}
}
}
}
})
父子组件通信
父组件传值给子组件
Vue.component('parent',{
template:"<div>我给儿子取名叫:{{name}}<son :myName='name'></son>朋友</div>",
data(){
return {
name:"zs"
}
},
components:{
con:{
template:"<div>爸爸给我取名叫:{{myName}}</div>",
props:['myName']
}
}
})
子组件传值给父组件
Vue.component("index",{
template:"<h1>{{msg}}{{myName}}<br><son @exportName='getName'></son></h1>",
data() {
return{
msg:"你好!我是",
myName:"???"
}
},
methods:{
getName(val){
this.myName = val
}
},
components:{
son:{
data(){
return {
Name:"你爸爸"
}
},
template:"<button @click='sayMyName'>点我,我就告诉你我是谁</button>",
methods:{
sayMyName(){
this.$emit("exportName",this.Name)
}
}
},
}
})
兄弟组件的传值
实例一个空的Vue实例作为事件总线
var eventbus = new Vue()
components:{
son:{
data(){
return {
myBro:"???"
}
},
template:`<span>我弟弟告诉我他叫{{myBro}}</span>`,
mounted(){
eventbus.$on('tellBroMyName',data => {
this.myBro = data
})
}
},
brother:{
data(){
return {
myName:"王五"
}
},
template: '<button @click="emitMyName">点击就告
诉哥哥我叫{{myName}}</button>',
methods:{
emitMyName(){
eventbus.$emit('tellBroMyName',this.myName)
}
}
}
}
动态组件
给vue实例data中创建一个空属性abcd
创建组件
Vue.component('index',{
template:`<div>首页</div>`
})
给导航栏各项绑定click事件让空属性abcd等于组件名'index'
@click='abcd="index"'
创建component动态组件标签
<component :is="abcd"></component>