声明:此篇是我学习的时候借鉴别人的然后学习后整合一下。
步骤:
1.子组件之间传参
子组件之间的传参比较简单,具体用到以下几个方法,分别是$emit(),$on()与mounted()。
$emit()方法介绍:此方法是传参方法,具有两个参数,作用分别为声明传递对象与要传递的参数。
$on()方法介绍:此方法是接参方法,具有两个参数,作用分别为$emit()所声明的对象与处理接受到的参数。
mounted()方法介绍:此方法是一个钩子函数。
是不是太啰嗦了? emmm 上干货!
此处我用了三个子组件互相传参。
(1)定义的三个子组件
<template id="vueziA">
<div>
<h4>A组件</h4>
<p>{{a}}</p>
<p>{{c}}</p>
<input type="button" value="把A数据给C" @click="send" />
</div>
</template>
<template id="vueziB">
<div>
<h4>B组件</h4>
<p>{{b}}</p>
<input type="button" value="把B数据给C" @click="send" />
</div>
</template>
<template id="vueziC">
<div>
<h4>我是C组件,我在坐等接收数据</h4>
<p>{{a}}</p>
<p>{{b}}</p>
<input type="button" value="把C数据给A" @click="send" />
</div>
</template>
(2)先生成一个空实例,然后各组件的设置
//准备一个空的实例对象
var Event = new Vue();
var A={
template:'#vueziA',
data(){
return {
a:'我是A里面的数据',
c:'我也坐等C的数据'
}
},
methods:{
send(){ //A发送数据
Event.$emit('a-msg',this.a);
}
},
mounted(){
var _this = this;
Event.$on('c-msg', function(c){
_this.c = c;
})
}
};
var B={
template:'#vueziB',
data(){
return {
b:'我是B里面的数据'
}
},
methods:{
send(){
Event.$emit('b-msg',this.b);
}
}
};
var C={
template:'#vueziC',
data(){
return{
a:'',
b:'',
c:'我是C里面的数据,我过来啦'
}
},
methods:{
send(){
Event.$emit('c-msg',this.c);
}
},
mounted(){ //两种接收的方式
var _this = this;
Event.$on('a-msg',function(a){
_this.a=a;
});
Event.$on('b-msg',function(b){
this.b = b;
}.bind(this))
}
};
(3)在vue实例里面引入组件
new Vue({
el:'#box',
components:{
'com-a':A,
'com-b':B,
'com-c':C
}
})
此时就可以进行子组件之间的传参。
2.父传子
父组件向自组件传参,需要父组件定义参数,子组件通过props属性数组形式传值。
例如:
父组件:<v-zi :name="str1"></v-zi>
子组件:props:["name"]
是不是可懵? 来 看代码
<div id="box">
<!-- 用于父子组件之间传值 -->
<div>
<h2 style="color: red">用于父子组件之间传值</h2>
<v-fu></v-fu>
</div>
</div>
<template id="vuefu">
<div>
<h2>父组件</h2>
<h2>接收子组件值:{{msg}}</h2>
<button @click="fuToZi">父传子</button>
<v-zi :name = 'b'></v-zi>
<hr>
</div>
</template>
<template id="vuezi">
<div>
<h2>子组件</h2>
<h2>接收父组件值:{{name}}</h2>
</div>
</template>
下面是vue实例的设置,通过在父组件定义属性值,在实例的子组件components的props来定义要获取的值。
new Vue({
el:'#box',
components:{
'v-fu':{
template:'#vuefu',
data(){
return {
msg:'我是父组件',
b:'看我变化',
c:'我来子组件这看看'
}
},
methods:{
change(msg){
this.msg = msg;
},
fuToZi(msg){
this.b = this.c
}
},
components:{
'v-zi':{
template:'#vuezi',
props:['name'],
data(){
},
methods:{
}
}
}
}
}
})
此时,父组件向子组件传值已经完成。
3.子传父
原理就是子组件注册触发事件,父组件设置事件响应,emmm,姑且这么解释吧。
父组件:<v-zi @zizujian="change"></v-zi>
子组件: send(){ //A发送数据
this.$emit('zizujian',this.b);
}
上代码。
<div id="box">
<!-- 用于父子组件之间传值 -->
<div>
<h2 style="color: red">用于父子组件之间传值</h2>
<v-fu></v-fu>
</div>
</div>
<template id="vuefu">
<div>
<h2>父组件</h2>
<h2>接收子组件值:{{msg}}</h2>
<v-zi @zizujian="change"></v-zi>
<hr>
</div>
</template>
<template id="vuezi">
<div>
<h2>子组件</h2>
<div>
<input type="button" value="子传父" @click="send" />
</div>
</div>
</template>
new Vue({
el:'#box',
components:{
'v-fu':{
template:'#vuefu',
data(){
return {
msg:'我是父组件'
}
},
methods:{
change(msg){
this.msg = msg;
}
},
components:{
'v-zi':{
template:'#vuezi'
data(){
return {
a:'我是子组件',
b:'我来父组件这看看'
}
},
methods:{
send(){ //A发送数据
this.$emit('zizujian',this.b);
}
}
}
}
}
}
})
以下是全部代码。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>vue组件传参</title>
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
<script type="text/javascript" src="js/vue.min.js"></script>
</head>
<body>
<div id="box">
<!-- 用于父子组件之间传值 -->
<div>
<h2 style="color: red">用于父子组件之间传值</h2>
<v-fu></v-fu>
</div>
<!-- 用于子组件之间传值 -->
<div style="border: 1px solid green; margin-bottom: 10px; width: 300px;">
<h2 style="color: red">用于子组件之间传值</h2>
<com-a></com-a>
<com-b></com-b>
<com-c></com-c>
</div>
</div>
<template id="vuefu">
<div>
<h2>父组件</h2>
<h2>接收子组件值:{{msg}}</h2>
<button @click="fuToZi">父传子</button>
<v-zi :name = 'b' @zizujian="change"></v-zi>
<hr>
</div>
</template>
<template id="vuezi">
<div>
<h2>子组件</h2>
<h2>接收父组件值:{{name}}</h2>
<div>
<input type="button" value="子传父" @click="send" />
</div>
<v-fu @fuzujian="change"></v-fu>
</div>
</template>
<template id="vueziA">
<div>
<h4>A组件</h4>
<p>{{a}}</p>
<p>{{c}}</p>
<input type="button" value="把A数据给C" @click="send" />
</div>
</template>
<template id="vueziB">
<div>
<h4>B组件</h4>
<p>{{b}}</p>
<input type="button" value="把B数据给C" @click="send" />
</div>
</template>
<template id="vueziC">
<div>
<h4>我是C组件,我在坐等接收数据</h4>
<p>{{a}}</p>
<p>{{b}}</p>
<input type="button" value="把C数据给A" @click="send" />
</div>
</template>
<script type="text/javascript">
//准备一个空的实例对象
var Event = new Vue();
var A={
template:'#vueziA',
data(){
return {
a:'我是A里面的数据',
c:'我也坐等C的数据'
}
},
methods:{
send(){ //A发送数据
Event.$emit('a-msg',this.a);
}
},
mounted(){
var _this = this;
Event.$on('c-msg', function(c){
_this.c = c;
})
}
};
var B={
template:'#vueziB',
data(){
return {
b:'我是B里面的数据'
}
},
methods:{
send(){
Event.$emit('b-msg',this.b);
}
}
};
var C={
template:'#vueziC',
data(){
return{
a:'',
b:'',
c:'我是C里面的数据,我过来啦'
}
},
methods:{
send(){
Event.$emit('c-msg',this.c);
}
},
mounted(){ //两种接收的方式
var _this = this;
Event.$on('a-msg',function(a){
_this.a=a;
});
Event.$on('b-msg',function(b){
this.b = b;
}.bind(this))
}
};
new Vue({
el:'#box',
components:{
'v-fu':{
template:'#vuefu',
data(){
return {
msg:'我是父组件',
b:'看我变化',
c:'我来子组件这看看'
}
},
methods:{
change(msg){
this.msg = msg;
},
fuToZi(msg){
this.b = this.c
}
},
components:{
'v-zi':{
template:'#vuezi',
props:['name'],
data(){
return {
a:'我是子组件',
b:'我来父组件这看看'
}
},
methods:{
change(a){
console.log(1)
this.a = a;
},
send(){ //A发送数据
this.$emit('zizujian',this.b);
}
}
}
}
},
'com-a':A,
'com-b':B,
'com-c':C
}
})
</script>
</body>
</html>