组件间的数据交互

组件间的数据交互

父组件向子组件传值

​ 父组件向子组件传值的方式有两种-父组件通过属性值向子组件传递数据

​ 一种是动态的(可以与父组件的data进行绑定)

​ 另外一种是静态的直接写死在属性中

​ 子组件使用props进行接收,接收的时候注意是以数组的形式进行接收,因为传递的值可能不止一个

<body>
   <div id="app">
     <!-- 父组件向子组件传值 -->
     <!-- 静态的传值 -->
    <component-a title="父组件传过去的-静态"></component-a>
    <!-- 父组件向子组件传值-动态的 -->
    <!-- 注意//;模板中动态的使用data中的数据,加不加this效果一样,一般不加 -->
    <component-a :title1="father"></component-a>
   </div>
   <script>
    //  定义一个子组件
    var children = {
      // 子组件接收父组件传递过来的值
      props:['title','title1'],
      data(){
        return {
          msg:'你好世界'
        }
      },
      template:'<h3>{{msg+"-"+title+"-"+title1}}</h3>'
    }

    // 注册子组件
    new Vue({
      el:'#app',
      data(){
        return{
          father:'父组件传过去的-动态'
        }
      },
      components:{
        'component-a':children
      }
    })
   </script>
  
</body>

输出结果:

​ 你好世界-父组件传过去的-静态-undefined

​ 你好世界-undefined-父组件传过去的-动态

证明了组件的复用的时候组件之间是相互独立的,二者的实例化对象不同

注意:
props中的属性名称有一定的规则

​ 在props中使用驼峰的形式,模板中需要使用短横线的方式

​ 在props中使用的是字符串的形式,则在模板中也可以使用字符串的形式,可以都是用字符串的方式

<component-a title-abc="父组件传过去的-静态"></component-a>


    var children = {
      // 子组件接收父组件传递过来的值,其中模板中使用了短横线的方式,接收的时候使用驼峰
      props:['titleAbc','title1'],
      data(){
        return {
          msg:'你好世界'
        }
      },
      template:'<h3>{{msg+"-"+titleAbc+"-"+title1}}</h3>'
    }
静态的传值

​ 也可以加上冒号,加上冒号表示是原始的数据类型,不加冒号的话会变成字符串类型的

props属性值的类型

​ 字符型String 数组:Number 布尔值:true 数组;Array 对象:Object

子组件向父组件传值

1.子组件通过自定义事件的方式,项父组件传递消息

<button v-on:click="$emit("countSum")">计算</button>

2.父组件监听子组件的事件

<menu-item v-on:countSum="sum+=1"></menu-item>

完整代码如下

<body>
    <div id="app">
        <father></father>
    </div>
    <script>
        Vue.component('father', {
            template: '<div>我的儿子叫{{mySonName}}<son @tellMyFatherMyName="getMySonName"></son></div>',
            data() {
                return {
                    mySonName: ''
                }
            },
            methods: {
                //这里的data就是子组件向父组件传递的过程中携带的参数
                getMySonName(data) {
                    this.mySonName = data;
                }
            },
            components: {
                son: {
                    data() {
                        return {
                            myName: '小强'
                        }
                    },
                    //点击按钮,调用点击事件,点击事件触发子组件向父组件传值的操作
                    template: '<button @click="emitMyName">我叫{{myName}}</button>',
                    methods: {
                        emitMyName() {
                            // 子组件传值给父组件需要用到$emit()方法,这个方法可以传递两个参数,一个是事件名称,一个是需要传递的数据
                            this.$emit('tellMyFatherMyName', this.myName)
                        }
                    }
                }
            }

        })
        var vm = new new Vue({
            el: '#app',
            data: {

            }
        })
    </script>
</body>

兄弟组件之间的传值

兄弟组件之间的传值,通过事件总线完成
<body>
    <div id="app">
        <father></father>
    </div>
    <script>
        // 创建一个空的vue实例,作为事件总线
        var eventbus = new Vue()
        Vue.component('father', {
            template: '<div><son></son><daughter></daughter></div>',
            components: {
                son: {
                    data() {
                        return {
                            mySisterName: ''
                        }
                    },
                    template: '<div>我妹妹叫{{mySisterName}}</div>',
                    mounted() {
                        // 通过eventbus的$on()方法去监听兄弟节点发射过来的事件
                        // $on有两个参数,一个是事件名称,一个是函数,该函数的默认值就是传递过来的数据
                        eventbus.$on('tellBroMyName', data => {
                            this.mySisterName = data
                        })
                    }
                },
                daughter: {
                    data() {
                        return {
                            myName: '小雪'
                        }
                    },
                    template: '<button @click="emitMyName">告诉哥哥我叫{{myName}}</button>',
                    methods: {
                        emitMyName() {
                            // 通过事件总线发射一个事件名称和需要传递的数据
                            eventbus.$emit('tellBroMyName', this.myName)
                        }
                    }
                }
            }
        })
        var vm = new Vue({
            el: '#app',
            data: {

            }
        })
    </script>
</body>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值