Vue进阶 | 组件交互(父子 兄弟 祖先)

185 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情

根据组件之间不同的关系,数据的传递可以分为以下几类:

  1. 父子组件
  2. 兄弟组件
  3. 祖先后代组件
  4. 任意2个组件之间

1.父子组件

父 -->子

1. props

  • props是父传子的单向数据流,反之不可
  • 当使用驼峰命名法给属性命名的时候,对应的会自动解析成短横线分隔命名形式(HTML中的属性名对大小写不敏感)

语法:

父组件 Parent

<Child my-name="hello!" />

子组件 Child

props: ['myName']

2. ref

  • 获取子组件的dom元素
  • 获取子组件中的data、调用子组件中的方法
  • refv-for 一起使用的时候,子组件获取的是一组数据(数组)
  • 在使用的时候确保dom已经渲染完成,比如在 mounted() 而不是created()中调用
  • ref属性不是响应式的,应避免在计算属性computed,和模板{{}}中使用

语法:

父组件 Parent:

<Child ref="hello" />

mounted(){
   console.log(this.$refs.hello)  // 获取子组件的DOM
},
methods: { 
   sayHello() { 
       this.$nextTick(() => {
           console.log(this.$refs.hello.msg)  // 获取子组件的data中的字段
       })
       this.$refs.hello.print()  // 调用子组中的件方法
   }
}

子组件 Child:

//
data() { 
   return { 
     msg: "子组件对你说了一句hello" 
   } 
}, 
methods: { 
   print() { console.log(msg) } 
}

3. children / parent

  • $children: 父实例访问子组件实例
  • $parent: 子实例访问父组件实例
  • 注:children不保证顺序,不是响应式。使用props 和 events 实现父子组件通信更佳

语法:

--------父组件 Parent--------

data(){
   return{
       name: 'hahaha'
   }
}
console.log('children:',this.$children) // 访问子组件

--------子组件 Child--------

this.$parent.name = 'lalala'  // 访问父组件
  • 子 -->父

自定义事件的交互,子组件发送事件,父组件监听事件

语法:vm.$emit( event, data )

子组件 Child

this.$emit('cancel' , '关闭Dialog')

父组件 Parent

<child @cancel="cancelDialog" />

cancelDialog(msg){
   console.log(msg); // 输出:关闭Dialog
}

2.兄弟组件

找共同的祖辈$parent$root

  • parent访问最近一级父组件中的内容,parent访问最近一级父组件中的内容,parent访问最近一级父组件中的内容,root访问到根组件

1654343313166.jpg

3.祖先后代

祖先-->后代

方法:依赖注入 provide/inject(主要用于组件库的开发)

(允许一个祖先组件向其所有子孙后代注入一个依赖)

4.任意2个组件之间

  • 事件总线Bus 创建一个Bus类来负责事件的派发、监听和回调
//main.js
Vue.prototype.$bus = new Vue();

// 组件1 发射事件
$bus.$emit("onMsg", '来自A页面的消息');

//组件2 监听事件
this.$bus.$on("onMsg",()=>{

})
  • vuex(常用) 获取:this.$store.state.count

在函数中触发变更状态:this.$store.commit('setObj')