Vue之父子组件与子组件之间的传参

声明:此篇是我学习的时候借鉴别人的然后学习后整合一下。

步骤:

    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>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bug菌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值