19~vue祖先组件跨级传值(Provide和Inject)给后代组件

本文介绍了Vue组件如何通过`provide`和`inject`实现跨级传值,包括直接传固定值、组件属性传递以及响应式数据的处理。重点讲解了这两个选项的工作原理和应用场景。
摘要由CSDN通过智能技术生成

vue组件之间跨级传值

无论组件层次结构**有多深**, 祖先组件都可以作为其所有子组件的依赖提供者。 这个特性有两个部分: 祖先组件有一个provide选项来提供数据, 后代组件有一个inject选项来开始使用这些数据。

  • 跨级通信第一步: 祖先组件通过provide配置选项来提供数据
  • 跨级通信第二步: 后代组件通过inject配置选项来接收数据

传固定的值

  • 祖先组件的操作,提供数据
provide:{ // 把`先传一个具体的值, 测试看看`这个信息传递给后代组件
    message:"先传一个具体的值, 测试看看"
    // message:this.msg  访问组件实例的属性, 这样写是错误的,不生效
  },
  • 后代组件的操作, 接收数据
inject:['message']

传组件里面的属性

需要转化为返回对象的函数, 才能进行传递

  • 祖先组件的操作,提供数据
data () {
    return {   
      // 要把msg传递给孙组件  HelloWorld.vue
      msg:'祖先组件信息, 要跨一级直接传递给后代组件',      
    }
  },  
provide(){
    return {
      // 把组件的属性msg传递给后代组件
      message:this.msg     
    }
  },
  • 后代组件的操作, 接收数据
inject:['message']

响应式跨级传递数据

provideinject并不是响应式的, 是一个单项数据流(就是祖先组件改变的数据, 后代组件不改变), 但是我们可以通过传递一个 ref property 或 reactive对象给provide来改变这种行为,变成响应式的。

响应式对象的方式

  • 祖先组件的操作,提供数据
data () {
    return {        
      obj:{
        msg:'祖先组件信息, 要跨一级直接传递给后代组件'
      }   
    }
  }, 
provide(){
    return {    
      obj:this.obj // 响应式对象的方式     
    }
  }, 
  • 后代组件的操作, 接收数据
// 模版展示
<p>祖先组件跨级传过来的值:  {{ obj.msg }} </p>
// 接收对象
inject:['obj']

函数返回响应式数据

  • 祖先组件的操作,提供数据
<script>
import Content from './components/Content.vue'
export default {
  data () {
    return {   
      // 要把msg传递给孙组件  HelloWorld.vue
      msg:'祖先组件信息, 要跨一级直接传递给后代组件'      
    }
  },  
  components:{
    Content, 
  },
  
  provide(){
    return {
      message:()=>this.msg // 函数返回响应式数据
    }
  },
  methods: {
  },
  computed: {
  },
  watch: {
  }
}
</script>

<template>
  <div>     
    <p>祖先信息:  {{ msg }}</p>
    <Content> </Content> 
    <button @click="msg='我是祖先组件msg改变的结果'">改变msg</button>
  </div>
</template>
<style></style>
  • 后代组件的操作, 接收数据
<template>
  <h2>{{ msg }}</h2>
  <p>祖先组件跨级传过来的值:  {{ newMsg }} </p>
</template>
<script>
export default{
  data()
  {
    return {
      msg:'我是后代组件的数据展示'
    }
  },
  /**
   * 跨级通信第二步: 
   * 后代组件通过`inject`配置选项来`接收`数据
   * 
   * inject接收到的函数不要直接显示在模板中, 
   * 转化为计算属性后展示, 后面维护起来更轻松
   */
  inject:['message'],
  computed:{
    newMsg(){
      return this.message()
    }
  }
}
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值