组件之间的数据交互

189 阅读1分钟

一 . 父组件向子组件传递数据

操作原理

1.在父组件中给子组件添加自定义属性

2.子组件在内部通过props接收父组件给子组件添加的自定义属性

注意事项

1.先在props内定义我们组件所需要的自定义属性

2.在使用组件时,根据组件要求传递自定义属性

3.自定义属性值可以是数字,字符串,布尔值,数组,对象,函数。

4.传递过来的数据访问的方式与自身data访问方式相同。methods,生命周期函数,计算属性等通过this访问。

5.父组件传递给子组件的数据,子组件只能访问,不能修改。

代码案例

<luhuanyu :title="msg"></luhuanyu>
<script>
Vue.component('luhuanyu', {
   props: ['title'],
   data: function() {
     return {
       msg: ''
     }
   },
   template: '<div>{{title}}</div>'
 });
 var vm = new Vue({
   el: '#app',
   data: {
     msg: '我是父组件' 
   }
 })
 </script>

二 . 子组件向父组件传递数据

操作原理

1.在父组件中给子组件绑定自定义事件

2.子组件在自身内部通过$emit( 自定义事件名称,参数 ) 触发事件

3.当自定义事件触发时,执行对应的函数,传递参数。

注意事项

1.$emit()可以通过handles函数执行,也可以通过生命周期执行,但是前面要加上this

2.父组件给子组件绑定的自定义事件接收参数时,要用$event接收,也可以不写。

代码案例

<div id="app">
        <div>父组件---{{fmsg}}</div>
        <son @trans='handle'></son>
    </div>
    <template id="temp">
        <div>
            <div>子组件---{{Smsg}}</div>
            <button @click='$emit("trans",Smsg)'>传递给父组件</button>
        </div>
    </template>
    <script src="./js/vue.js"></script>
    <script>
        Vue.component('son',{
            data:function(){
                return {
                    Smsg:'我是子组件的数据'
                }
            },
            template:'#temp'
        })
        var vm = new Vue({
            el:'#app',
            data:{
                fmsg:''
            },
            methods:{
                handle:function(val){
                    this.fmsg=val
                }
            }
        })

三 . 兄弟组件之间传递数据

操作原理

1.兄弟组件之间传递数据需要借助于事件中心,通过事件中心传递数据

2.创建事件中心 var hub = new Vue()

3.传递数据方,通过一个事件触发hub.$emit(方法名,传递的的数据)

4.接收数据方,通过mounted(){} 钩子函数中触发hub.$on(方法名,回调函数)

5.销毁事件 通过hub.$off()销毁之后无法进行传递数据

代码示例

      Vue.component('bro1', {
          data: function () {
              return {
                  msg1: '我是大哥的数据',
                  gmsg1: ''
              }
          },
          template: `<div> <div>{{gmsg1}}</div> <div><button @click='add'>点击1</button></div> </div>`,
          methods: {
              add: function () {
                  bus.$emit('bro2-event', this.msg1)
              }
          },
          mounted() {
              bus.$on('bro1-event', (val) => {
                  this.gmsg1 = val
              })
          }
      })
      Vue.component('bro2', {
          data: function () {
              return {
                  msg2: '我是小弟的数据',
                  gmsg2: ''
              }
          },
          template: `<div> <div>{{gmsg2}}</div> <div><button @click='add'>点击2</button></div> </div>`,
          methods: {
              add: function () {
                  bus.$emit('bro1-event', this.msg2)
              }
          },
          mounted() {
              bus.$on('bro2-event', (val) => {
                  this.gmsg2 = val
              })
          }
      })
      var vm = new Vue({
          el: '#app',
          data: {

          },
          methods: {

          }
      })

永不加班,加油

src=http___dingyue.ws.126.net_TChYPPiTy3x76D7hsDrRpMy79VYkSi5j8OgkrTY43EvWA1535552785865.jpg&refer=http___dingyue.ws.126.jpg