Vue学习系列 -- 组件通信

Posted 躬匠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue学习系列 -- 组件通信相关的知识,希望对你有一定的参考价值。

通过上一章节的学习,我们已经知道父子组件之间可通过props进行通信,但在2.x之后的版本,props就变为单向的了:只能由父组件向子组件传值;但在实际的工作中,存在子组件向父组件传值的业务场景;所以,今天我们就来详细学习一下父子组件之间如何进行双向传值。

一、父组件向子组件传值

上面我们已经提到了子组件可以通过props接受父组件的传值,废话少说,实践一把。

子组件通过props里的message、content字段接收父组件传递过来的数值。可以把message、content理解为槽的意思:父组件向指定槽中放数据,子组件从指定槽中取数据。

下面的demo将message、conent与父组件中的data字段进行了bind。

<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <title>Learning Vue.js</title>
</head>

<body>
<div id="app1">
<div>
    <component-demo :message="message" :content="content">
    </component-demo>
</div>
</div>
</body>

<!--这里是以CDN引入的方式加载的vue.js-->
<script type="text/javascript" src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<script>
    var app = new Vue(
        el : "#app1",
        components : 
            "component-demo" : 
                template: "<div>message<p>content</p></div>",
                props : ["message","content"],
                data : function () 
                    return 
                    
                
            
        ,
        data : 
            content : "this is content",
            message : "this is parents component message"
        
    )
</script>
</html>

页面效果如下:

二、子组件向父组件传值

上面我们已经说了,在2.x之后的版本已经不允许通过props向父组件传值了,新的传值方式是通过自定义事件的方式实现的:子组件触发指定的事件时,父组件也可以监听到这个事件,并作出相应的逻辑处理。

废话少说,直接上代码。

<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <title>Learning Vue.js</title>
</head>

<body>
<div id="app1">
    <p>The num is num</p>
<div>
    <component-demo @parentIncr="getTotalNum" @parentDec="getTotalNum">
    </component-demo>
</div>
</div>
</body>

<!--这里是以CDN引入的方式加载的vue.js-->
<script type="text/javascript" src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<script>
    var app = new Vue(
        el : "#app1",
        components : 
            "component-demo" : 
                template: "<div> " + 
                   " <p @click='Incr'>增加</p>" + 
                   " <p @click='Dec'>减少</p>" + 
                   "</div>",
                data : function () 
                    return 
                        num : 0
                    
                ,
                methods : 
                    Incr : function () 
                        this.num ++ ;
                        this.$emit('parentIncr', this.num);
                    ,
                    Dec : function () 
                        this.num -- ;
                        this.$emit('parentDec', this.num);
                    
                
            
        ,
        data : 
            num : 0
        ,
        methods : 
            getTotalNum : function (num) 
                this.num = num;
            
        
    )
</script>
</html>

父组件中监听了parentIncr、parentDes两个事件,而子组件通过$emit配置了当发生单击事件时如何“广播”数据。当子组件进行增加、减少时事件便会“冒泡”到父组件并被父组件监听到,最后交给父组件内的getTotalNum方法去处理,最终显示在页面上。

三、总结

  • 上面我们只说了父子组件之间的通信,实际场景中还可能有兄弟组件之间的通信,具体如何实现就不在这里阐述了,想要了解的请自行百度;
  • 通过"props down"实现父组件向子组件传值,通过"events up"实现子组件向父组件传值

以上是关于Vue学习系列 -- 组件通信的主要内容,如果未能解决你的问题,请参考以下文章

Vue2.0入门系列——父子组件间通信

Vue.js组件之间的通信

Vue学习笔记入门篇——组件的通讯

vue系列---组件通信refisslot插槽mixin混入脚手架使用animate

VueVue入门--双向绑定,Vue的组件,Axios异步通信,计算属性,插值,自定义事件

VueVue入门--双向绑定,Vue的组件,Axios异步通信,计算属性,插值,自定义事件