name:\"沐华\" } }}
// Child.vue// 继续传给孙⼦组件
export default{
props:[\"name\"], // 这⾥可以接收,也可以不接收 mounted(){
// 如果props接收了name 就是 { title:1111 },否则就是{ name:\"沐华\ console.log(this.$attrs) }}
$children / $parent
$children:获取到⼀个包含所有⼦组件(不包含孙⼦组件)的 VueComponent 对象数组,可以直接拿到⼦组件中所有数据和⽅法等
$parent:获取到⼀个⽗节点的 VueComponent 对象,同样包含⽗节点中所有数据和⽅法等// Parent.vueexport default{ mounted(){
this.$children[0].someMethod() // 调⽤第⼀个⼦组件的⽅法 this.$children[0].name // 获取第⼀个⼦组件中的属性 }}
// Child.vueexport default{ mounted(){
this.$parent.someMethod() // 调⽤⽗组件的⽅法 this.$parent.name // 获取⽗组件中的属性 }}
provide / inject
provide / inject 为依赖注⼊,说是不推荐直接⽤于应⽤程序代码中,但是在⼀些插件或组件库⾥却是被常⽤,所以我觉得⽤也没啥,还挺好⽤的
provide:可以让我们指定想要提供给后代组件的数据或⽅法
inject:在任何后代组件中接收想要添加在这个组件上的数据或⽅法,不管组件嵌套多深都可以直接拿来⽤
要注意的是 provide 和 inject 传递的数据不是响应式的,也就是说⽤ inject 接收来数据后,provide ⾥的数据改变了,后代组件中的数据不会改变,除⾮传⼊的就是⼀个可监听的对象所以建议还是传递⼀些常量或者⽅法
// ⽗组件
export default{
// ⽅法⼀ 不能获取 methods 中的⽅法 provide:{
name:\"沐华\
age: this.data中的属性 },
// ⽅法⼆ 不能获取 data 中的属性 provide(){ return {
name:\"沐华\
someMethod:this.someMethod // methods 中的⽅法 } },
methods:{
someMethod(){
console.log(\"这是注⼊的⽅法\") } }}
// 后代组件export default{
inject:[\"name\ mounted(){
console.log(this.name) this.someMethod() }}
EventBus
EventBus 是事件总线,不管是⽗⼦组件,兄弟组件,跨层级组件等都可以使⽤它完成通信操作定义⽅式有三种
// ⽅法⼀
// 抽离成⼀个单独的 js ⽂件 Bus.js ,然后在需要的地⽅引⼊// Bus.js
import Vue from \"vue\"export default new Vue()// ⽅法⼆ 直接挂载到全局// main.js
import Vue from \"vue\"
Vue.prototype.$bus = new Vue()// ⽅法三 注⼊到 Vue 根对象上// main.js
import Vue from \"vue\"new Vue({ el:\"#app\ data:{
Bus: new Vue() }})
使⽤如下,以⽅法⼀按需引⼊为例
// 在需要向外部发送⾃定义事件的组件内
import Bus from \"./Bus.js\"export default{ methods:{
handlerClick(){
// ⾃定义事件名 sendMsg
Bus.$emit(\"sendMsg\这是要向外部发送的数据\") } }}
// 在需要接收外部事件的组件内import Bus from \"./Bus.js\"export default{
mounted(){
// 监听事件的触发
Bus.$on(\"sendMsg\
console.log(\"这是接收到的数据:\ }) },
beforeDestroy(){ // 取消监听
Bus.$off(\"sendMsg\") }}
Vuex
Vuex 是状态管理器,集中式存储管理所有组件的状态。这⼀块内容过长,如果基础不熟的话可以看这个Vuex,然后⼤致⽤法如下⽐如创建这样的⽂件结构index.js ⾥内容如下
import Vue from 'vue'import Vuex from 'vuex'
import getters from './getters'import actions from './actions'
import mutations from './mutations'import state from './state'
import user from './modules/user'Vue.use(Vuex)
const store = new Vuex.Store({ modules: { user},
getters, actions, mutations, state})
export default store然后在 main.js 引⼊import Vue from \"vue\"import store from \"./store\"new Vue({ el:\"#app\ store,
render: h => h(App)})
然后在需要的使⽤组件⾥
import { mapGetters, mapMutations } from \"vuex\"export default{ computed:{
// ⽅式⼀ 然后通过 this.属性名就可以⽤了
...mapGetters([\"引⼊getters.js⾥属性1\属性2\"]) // ⽅式⼆
...mapGetters(\"user\模块⾥的属性1\属性2\"]) },
methods:{
// ⽅式⼀ 然后通过 this.属性名就可以⽤了
...mapMutations([\"引⼊mutations.js⾥的⽅法1\⽅法2\"]) // ⽅式⼆
...mapMutations(\"user\引⼊user模块⾥的⽅法1\⽅法2\"]) }}
// 或者也可以这样获取this.$store.state.xxx
this.$store.state.user.xxx
$root
$root 可以拿到 App.vue ⾥的数据和⽅法
slot
就是把⼦组件的数据通过插槽的⽅式传给⽗组件使⽤,然后再插回来
// Child.vue export default{ data(){ return {
user:{ name:\"张三\" } } }}
// Parent.vue {{ slotProps.user.name }}