vue组件数据传递

组件数据传递:


父传子:
利用props:

    Student组件:
        <script>
        export default {
            name:"Student",
            data() {
                return {
                    msg:"一个学生"
                }
            },
            props:['name' , 'sex' ,'age' ]
        }
        </script>

        // 接收同时对类型限制
    props:{
        name:String,
        sex:String,
        age:Number
    }
  最完整的 一般不用
        props:{
        name:{
            type:String,   //限制类型
            required:true   //限制name是必要的
        },
        age:{
            type:Number,
            default:99    //默认值
        },
        sex:{
            type:'string',

        }
    }

    App.vue  组件:  在里面传数据 ,类似于属性
        <template>
          <div>
            <Student  name='张三' sex='男' age=18></Student>
          </div> 
        </template>
         
header组件传递到list组件里面:  添加

兄弟组件之间的数据传递:
    方式一:利用App组件:  初级方法

        app到list
            数据写在   
            App组件里面,通过父传子的方法,props传递到接收数据的那个list组件
            list组件用props方法接收

        子传父 :
            传数据的组件
          父组件先定义一个函数方法1,传给子组件,
          子组件用props得到方法,
          通过这个方法函数,设置函数方法参数,来传递


 props  里面的数据VBUN改变 
 props:[ 里面的东西是不可以修改的]

如果 let obj ={a:1,b:2}
        obj.a = 3    修改了了 但是vue监测不到
        obj = {a:4,b:5}   vue能监测

 


2,全局事件总线:
   
   一种组件间的通信的方式 适用于任意·组件间的通信,


app组件  包含 a,b,c,d 三个组件

   在app外部有一个全局事件  x ,如果a组件想要收到别的组件给的数据,在a组件里面给x绑定自定义事件 命名demo,因为是在x里面绑定的自定义事件,那么demo事件的回调是在a组件里面的, 然后d组件要传数据给a组件,就可以在d组件里面调用x 上面的  demo事件同时也可以传数据,


 x 需要满足条件  
 1,所有组件都能沟通到   
 2  ,能调用$on,$off,$emit  这些api

一个重要的内置关系 :通过这个关系可以让组件实例对象vc访问到vue原型的属性,方法

     VueComponent.prototype.__proto === Vue.prototype

        把x放在vue的原型对象上面,最好。

关于Vuecomponent的:组价件的本质是一个名为VueComponent的构造函数,且不是程序员定义的,是Vue.extend生成的,每次调用Vue.extend,返回的都是一个全新的VueComponent!!!!

在main.js里面

//创建vm
new Vue({
    el:'#app',
    render: h => h(App),
    beforeCreate() {
        Vue.prototype.$bus = this //安装全局事件总线      
    },
})

 
 在,要接收数据的组件绑定 全局事件总线事件,、
     mounted() {
            // console.log('School',this)
            this.$bus.$on('hello',(data)=>{
                console.log('我是School组件,收到了数据',data)
            })
        },
    beforeDestroy() {
        this.$bus.$off('hello“)
    },
 
   在传数据的组件触发事件
        methods: {
            sendStudentName(){
                this.$bus.$emit('hello',this.name)
            }
        },


3,消息的订阅与发布     也是任意组件间通信
    1,订阅消息 :消息名
    2,发布消息 : 消息内容

app组件里面有a,b,c,d 四个组件,其中,c组件在b组件里面,
c组件数据想在a组件里面使用,,a想要数据,c发出数据
那么在a组件订阅消息demo,设为test函数,
在c组件发消息demo,带着数据data,那么在c中发出消息demo,a中的test函数触发调用,data就去,
需要用到第三方库,原生的vue没有


    1,安装第三方库  可以用 npm i pubsub-js
    2, 在组件里面引入:import pubsub from 'pubsub-js'
    3,接收数据,a组件接收数据,就在a组件里面订阅消息,订阅的回调就在a组件里面,
       methods:{
       demo(data){..}
       }
       .....
       mounted(){
       订阅消息
       this.pId = pubsub.subscribe("xxx",this.demo)
       }
       xxx是消息名
     4,提供数据,发布消息,

     pubsub.publish('xxx',数据)
     5,最好取消 一下订阅,在beforedestroy 里面
      beforeDestroy() {
            pubsub.unsubscribe(this.pubId)
         },
用全局事件总线更好,消息订阅要用到第三方库

school组件  ,,要收数据

    mounted() {
            // pubsub是对象,上面有方法,挂载完毕,
            // 订阅消息   
            // 消息取名hello,之后有组件发布hello消息,执行后面的回调
            this.pubId = pubsub.subscribe("hello",( msgName,data)=>{
                console.log('hello消息发布,并执行', msgName,data)
            })
            // 解决this指向不清问题,也可以定义一个方法methods放在vue里面管,在这里调用
        },
         beforeDestroy() {
            pubsub.unsubscribe(this.pubId)
         },
    }
student组件:   要传数据出去
methods: {
            sendStudentName( ){
                // 发布消息hello,带数据666
                // msgName,是消息名,data是参数
             pubsub.publish("hello",666)
            }
        },

posted @ 2023-02-27 15:59  洪茗  阅读(88)  评论(0编辑  收藏  举报