Vue3中的祖孙传值

        当我们遇到一个父组件,里面有子组件、有孙组件,有很多后代组件时,需要共享父组件的数据,我们可以用到  ----依赖注入----

     核心就是使用provide方法,传递数据,使用inject接收数据

1、父组件(爷爷组件)向子、孙组件传值

父向子孙传数据:使用provide方法,将数据传出

父组件代码:

<template>
  <div>
    <div>父子组件的交互</div>
    <button @click='money=200'>修改</button>
    <hr>
    <Child :money='money' @send-money='getMoney' />
  </div>
</template>

<script>
import Child from './Child.vue'
import { ref, provide } from 'vue'

export default {
  name: 'App',
  components: { Child },
  setup () {
   // 直接把数据传递出去
    provide('moneyInfo', 1000)
    const money = ref(100)
    const getMoney = (value) => {
      // value就是子组件传递回来的钱
      money.value = money.value - value
    }
    return { money, getMoney }
  }
}
</script>

孙子组件通过inject方法接收父组件传过来的数据

孙子组件代码:

<template>
  <div>
    孙子组件:{{moneyInfo}}
  </div>
</template>
<script>
 import { inject } from 'vue'

export default {
  name: 'GrandSon',
  setup () {
  const moneyInfo = inject('moneyInfo')
    return { moneyInfo }
  }
}
</script>

当然子组件也可以接收到父组件向孙子组件出传递的数据,同样使用inject方法

子组件代码

<template>
  <div>
    子组件 {{money}} --- {{moneyInfo}}
  </div>
  <GrandSon />
</template>
<script>
import GrandSon from '@/GrandSon'
import { inject } from 'vue'
export default {
  name: 'Child',
  components: { GrandSon },
  setup (props, context) {
    const moneyInfo = inject('moneyInfo')
   
   return {  moneyInfo }
  }
}
</script>

2、孙子组件向父组件传值,通过provide函数实现

<template>
  <div>
    <div>父子组件的交互</div>
    <button @click='money=200'>修改</button>
    <hr>
    <Child :money='money' @send-money='getMoney' />
  </div>
</template>

<script>
import Child from './Child.vue'
import { ref, provide } from 'vue'

export default {
  name: 'App',
  components: { Child },
  setup () {
    // 直接把数据传递出去
    provide('moneyInfo', 1000)
    // 把一个函数传递给孙子
    const handleMoney = (value) => {
     console.log('孙子传递的数据:', value)
    }
    provide('handleMoney', handleMoney)
    const money = ref(100)
    const getMoney = (value) => {
      // value就是子组件传递回来的钱
      money.value = money.value - value
    }
    return { money, getMoney }
  }
}
</script>

2、孙子组件获取到这个函数并且调用该函数然后传递数据,

<template>
  <div>
    孙子组件:{{moneyInfo}}
  </div>
  <button @click='handleSend'>点击给爷爷数据</button>
</template>
<script>
import { inject } from 'vue'

export default {
  name: 'GrandSon',
  setup () {
    const moneyInfo = inject('moneyInfo')
// 接收爷爷组件传递过来的函数
    const handleMoney = inject('handleMoney')
    const handleSend = () => {
      // 调用爷爷传递函数,并把孙子组件中的值传递给爷爷组件
     handleMoney(200)
    }
    return { moneyInfo, handleSend }
  }
}
</script>

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue 3,可以使用Props和Events来实现祖孙组件之间的传值。 1. Props:父组件可以通过props将数据传递给子组件。在子组件,可以通过props选项接收这些数据。具体步骤如下: 父组件: ```vue <template> <div> <ChildComponent :message="message" /> </div> </template> <script> import ChildComponent from './ChildComponent' export default { components: { ChildComponent }, data() { return { message: 'Hello from parent component' } } } </script> ``` 子组件: ```vue <template> <div> <p>{{ message }}</p> </div> </template> <script> export default { props: ['message'] } </script> ``` 在父组件,使用冒号(:)绑定属性,并将数据传递给子组件。子组件通过props选项接收这个属性。 2. Events:子组件可以通过事件将数据传递给父组件。在子组件,可以使用$emit方法触发一个自定义事件,并传递数据给父组件。具体步骤如下: 父组件: ```vue <template> <div> <ChildComponent @update-message="updateMessage" /> <p>{{ message }}</p> </div> </template> <script> import ChildComponent from './ChildComponent' export default { components: { ChildComponent }, data() { return { message: '' } }, methods: { updateMessage(newMessage) { this.message = newMessage } } } </script> ``` 子组件: ```vue <template> <div> <button @click="sendMessage">Send Message</button> </div> </template> <script> export default { methods: { sendMessage() { this.$emit('update-message', 'Hello from child component') } } } </script> ``` 在子组件,使用@click绑定一个点击事件,并在事件处理程序使用this.$emit方法触发自定义事件。父组件通过@update-message监听这个事件,并在对应的事件处理函数更新父组件的数据。 这样就实现了祖孙组件之间的传值。父组件通过props将数据传递给子组件,子组件通过事件将数据传递给父组件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值