( 只是总结,不适合没有vue基础的看,自己整理笔记总结的,如果有问题欢迎指出 )
可以通过在父组件中,给子组件标签加上 ref 属性,即可拿到子组件实例对象,再watch监听子组件实例对象的值即可实现传值
通过组件自定义事件,在父组件中用 this.$refs.xxx.$on = 回调函数 或 @自定义事件名 = “回调函数” 为子组件绑定自定义事件,然后在子组件中用this.$emit(‘自定义时间名’, 参数1, 参数2…) 触发,数据即可作为参数传递给父组件
在父组件中,给子组件标签加上 :属性名 = “传递的数据”,再在子组件中 props 接受一下即可
传过去一个指向父组件中函数的指针,然后子组件调用,并把数据当作参数传递,这样父组件便接收到了数据
② 中是通过 ref 在同一个组件中用 $on 和 $emit ,所以限制了只能父子间。可以借助 Vue原型 是 组件实例对象的原型的原型,这样通过原型链,就所有 vm 和组件实例对象都能看到了,我们可以在上面放组件实例对象,这样我们可以借助它的 $on 和 $emit 来传递数据
因为如果这样我们不便于调用,直接 this.$on 或 this.$emit 调用的是组件自身的,不会向上找,但如过例在Vue原型上添加一个 $bus 存放组件实例对象,我们直接 this.$bus.$on,即可通过原型链找到,且更语义化,方便理解
其实这个中间件不一定要放在 Vue原型上,只要所有组件都能看到就行了,例如放在 Window 上都行
利用第三方库,例 pubsub-js ,通过subscribe 接受数据,publish 提供数据,unsubscribe 取消订阅,具体操作和 全局事件总线 相似,可以自行了解,但是有缺点,由于是第三方库,所以不支持 Vue 开发者工具( 全局事件总线支持 )
使用插槽时,可能父组件定义的模板需要用到子组件的值,可以在子组件中 slot标签 中,:属性名 = "传递的数据"来传递数据,再在父组件中,用 scope = ‘对象名’ 来接受所有传递的数据,通过 对象名.属性名 即可拿到数据
相当于在一个独立的地方,存放共享的值,其他组件可以从中读取或修改数据,组件身上会多一个$store属性,可以通过 this.$store.dispatch() 或 this.$store.commit() 来修改数据,通过this.$store.state.xxx 来读取数据
其后代组件不管层次结构多深,都可以接收到,组件用 provide(‘变量名’,数据) 传递数据,后代组件用 inject(‘变量名’) 接受数据