Vue自定义组件:
组件:就是一个大的对象:new Vue({})就是一个组件
定义一个组件:
1.全局组件:
var Aaa=Vue.extend({
template:'我是一个标题
'
});
Vue.component('aaa',Aaa);
a)给自定义的组件添加数据:
data必须是函数的形式,函数必须返回一个对象(json)
var Aaa=Vue.extend({
data(){ //data必须是函数
return{ //必须return一个对象
msg:'我是一个标题'
};
},
template:'{ {msg}}
'
});
Vue.component('aaa',Aaa);
b)给自定义的组件绑定事件
var Aaa=Vue.extend({
data(){ //data必须是函数
return{ //必须return一个对象
msg:'我是一个标题'
};
},
methods:{ //给自定义的组件绑定事件
change(){
this.msg="change";
}
},
template:'{ {msg}}
'
});
Vue.component('aaa',Aaa); //component放在外部
2.局部组件(子组件)
把自定义的组件放到某一个组件内部
var Aaa=Vue.extend({
data(){ //data必须是函数
return{ //必须return一个对象
msg:'我是一个标题'
};
},
methods:{ //给自定义的组件添加事件
change(){
this.msg="change";
}
},
template:'{ {msg}}
'
});
var vm = new Vue({
el:'#box',
data:{
bsign:true
},
components:{ //components放在根组件vue内部,为局部组件
'aaa':Aaa
}
});
==============================================
定义组件的另一种编写方式:
1)全局组件:
Vue.component('my-aaa',{
data(){
return{
msg:'标题1111'
}
},
methods:{
toggle(){
this.msg="change"
}
},
template:'{ {msg}}'
});
var vm = new Vue({
el:'#box'
});
2)局部组件:
var vm = new Vue({
el:'#box',
components:{
'my-aaa':{
data(){
return{
msg:'标题2233'
}
},
methods:{
toggle(){
this.msg="change"
}
},
template:'{ {msg}}'
}
}
});
===============================================
配合模板自定义组件:(即template里面的代码)
1.直接放到template里面
template:'{ {msg}}'
2.单独放到某一个地方
a)都放到一个script标签里面
{ {msg}}
Vue.component('my-aaa',{
data(){
return{
msg:'标题1111'
}
},
methods:{
toggle(){
this.msg="change"
}
},
template:'#aaa' //写的是id属性
});
var vm = new Vue({
el:'#box'
});
b)放到template标签里面(*推荐使用)
{ {msg}}
Vue.component('my-aaa',{
data(){
return{
msg:'标题1111',
arr:['apple','banana','orange']
}
},
methods:{
toggle(){
this.msg="change"
}
},
template:'#aaa'
});
var vm = new Vue({
el:'#box'
});
===========================================
定义动态组件:
可实现标签切换:
var vm = new Vue({
el:'#box',
data:{
a:'aaa'
},
components:{
'aaa':{
template:'我是标题aaa
'
},
'bbb':{
template:'我是标题bbb
'
}
}
});
父子组件的定义:
var vm = new Vue({
el:'#box',
data:{
a:'aaa'
},
components:{
'aaa':{
template:'我是标题aaa
components:{
'bbb':{
template:'我是标题bbb
'
}
}
}
}
});
----------------------------------------------------------------------------------
vue在默认情况下,子组件没法访问父组件的数据
组件之间数据的传递(推荐使用)
1.子组件想获取父组件的data,通过props方法
props有两种写法:
1)props:['m','myMsg']
2)props:{
m:String,
myMsg:Number
}
1111111-->{ {msg}}
var vm = new Vue({
el:'#box',
data:{
a:'aaa'
},
components:{
'aaa':{
data(){
return{
msg:'我是父组件的数据',
msg1:111
}
},
template:'#aaa',
components:{
'bbb':{
props:['m','myMsg'],//props绑定自定义属性m,进行组件之间的数据传递,
且这里应该是驼峰式写法
template:'我是标题bbb-->{ {m}}
'
{ {myMsg}}
}
}
}
}
});
2.父组件想获取子组件的data
*子组件把自己的数据发送到父组件
发送方法:vm.$emit(事件名称,发送的数据)
v-on:接收数据-->@事件名称="函数" (函数写到父组件methods里面,这里没有括号)
父组件-->{ {msg}}
子组件-->{ {a}}
var vm = new Vue({
el:'#box',
data:{
},
components:{
'aaa':{
data(){
return{
msg:'我是父组件的数据',
msg1:111222
}
},
template:'#aaa',
methods:{
get(msg){
this.msg=msg;
}
},
components:{
'bbb':{
data(){
return{
a:'我是子组件的数据'
}
},
template:'#bbb',
methods:{
send(){
this.$emit('child-msg',this.a); //数据以名称child-msg发送出去
}
}
}
}
}
}
});
-------------------------------------------------------------------------
其他组件之间数据传递方法:
vm.$dispatch(事件名,数据) -->子组件向父组件发送数据
vm.$broadcast(事件名,数据) -->父级向子级广播数据
这两个需要配合event:{}使用
不推荐使用,因为在vue2.0中已经淘汰了
-------------------------------------------------------------------------
slot的使用:
slot:位置,槽口
作用:占个位置
类似ng里的transclude(指令)
我们在定义一个组建的时候,自己定义的template标签内容会把自定义组件内的内容全部覆盖掉,
如下面aaa组件里的ul列表就不会显示出来,被覆盖掉了,但是我们在实际中是不想被覆盖的,
这时就用到slot,避免被占用。
示例一:没有使用slot,aaa组件里的ul列表不会显示出来
段落
标题1:welcome vue
var vm = new Vue({
el:'#box',
data:{
a:'aaa'
},
components:{
'aaa':{
template:'#aaa'
}
}
});
示例2:使用slot,在template标签里预先占一个位置,此时aaa组件里的ul列表显示在h2与p标签的中间
段落
标题
var vm = new Vue({
el:'#box',
data:{
a:'aaa'
},
components:{
'aaa':{
template:'#aaa'
}
}
});
默认情况下,slot,代表aaa标签里面的所有内容,
有时需要单独代表,
段落
标题
var vm = new Vue({
el:'#box',
data:{
a:'aaa'
},
components:{
'aaa':{
template:'#aaa'
}
}
});