vue3 祖孙组件传值及父子双向绑定

本文介绍了Vue中组件间的通信方式,包括祖孙组件使用provide/inject进行值传递,父子组件通过props和v-model实现双向绑定,以及子组件调用父组件方法和父组件向子组件传递数据的实例。详细阐述了各种通信方法的使用场景和步骤。
1.祖孙组件传值(provide、inject )
祖组件
import { ref, provide} from "vue";

const navName = ref('瞌睡的博客主页') //导航标签名称
const sendGrandson = function (value) { //执行孙子件方法赋值
  navName.value = value //接收
}
provide('sendHandle', sendGrandson)//执行孙子件方法赋值
孙组件
import { ref,inject } from 'vue';
const sendGrandson = inject('sendHandle'); //注入祖件方法

const getNavName = function (params) {
  sendGrandson(params) //执行祖件方法
}
2.父子组件双向绑定
子组件
import { ref,reactive, watch,defineEmits} from 'vue';
let str = ref()
const emit = defineEmits(['update:getValue'])
emit('update:getValue',str.value);

父组件
<NavLabel v-model:getValue="getValue"></NavLabel>
const getValue = ref()
watch(getValue,(val)=>{
  console.log(getValue.value,'获取到的值');
})

在这里插入图片描述

3.父子组件传值
父组件
 <NavLabel  :foo="getValue"></NavLabel>
const getValue = ref('321')
子组件
const props = defineProps(['foo'])
console.log(props.foo)

4.子组件执行父组件方法
父组件
 <NavLabel  @getValue="getValue"></NavLabel>
const getValue = function(data){
console.log(data,'子组件执行父组件方法');
}
子组件
import {  defineProps,defineEmits ,inject } from 'vue';
const emit = defineEmits(['getValue'])
const getNavName = function (params) {//子组件页面点击的方法
  emit('getValue',321)
}

### 实现 Vue 3 组件间通信的方式 #### 使用 Props 和 Events 进行父子组件间的Vue 3 中,父组件可以通过 `props` 向子组件递数据,在子组件中接收并处理这些属性。当需要更新父组件的数据时,则可以利用 `$emit()` 函数触发自定义事件来通知父级。 ```html <!-- ParentComponent.vue --> <template> <child-component :message="parentMsg" @change-message="handleChange"></child-component> </template> <script> import ChildComponent from &#39;./ChildComponent.vue&#39;; export default { components: { ChildComponent }, data() { return { parentMsg: &#39;Hello from Parent&#39; }; }, methods: { handleChange(newVal) { this.parentMsg = newVal; } } }; </script> ``` ```html <!-- ChildComponent.vue --> <template> <p>{{ message }}</p> <button @click="sendMessageToParent">Change Message</button> </template> <script> export default { props: [&#39;message&#39;], emits: [&#39;change-message&#39;], // 明确声明预期接收到的事件名称 methods: { sendMessageToParent() { this.$emit(&#39;change-message&#39;, &#39;New message from child&#39;); } } } </script> ``` 此方法适用于简单的单向或双向绑定场景[^1]。 #### 利用 Provide/Inject API 构建祖孙关系链路中的依赖注入模式 对于多层嵌套结构下的跨层级通讯需求,Vue 提供了 provide/inject 特性用于简化这种情况下状态管理逻辑: ```javascript // App.vue export default { setup() { const themeColor = ref(&#39;#ff0&#39;); provide(&#39;theme-color&#39;, computed(() => themeColor.value)); function toggleTheme() { themeColor.value = themeColor.value === &#39;#fff&#39; ? &#39;#000&#39; : &#39;#fff&#39;; } return { toggleTheme }; } } // SomeGrandChildComponent.vue setup(props, context) { let color = inject(&#39;theme-color&#39;); console.log(color); // 获取祖先提供的主题颜色 watchEffect(() => { document.body.style.backgroundColor = color; }); } ``` 这种方式使得深层后代可以直接访问高层级的状态而无需逐层透参数。 #### EventBus 或者 Vuex Store 解决非父子组件之间的消息广播机制 针对完全无关联甚至平行存在的两个及以上视图模块间的信息交换难题,官方建议采用全局事件总线(Event Bus)或者更复杂的集中式存储库(Vuex store),前者适合小型项目快速开发阶段使用;后者则更适合大型应用长期维护考虑。 以下是基于简单 Event Bus 的例子[^2]: ```javascript // main.js 初始化创建一个空实例作为中介桥梁 const bus = new Vue(); new Vue({ el: &#39;#app&#39;, ... }); // Sender.vue 发送端发送特定类型的信号携带有效载荷给监听器们 bus.$emit(&#39;some-event-name&#39;, payload); // Receiver.vue 接收端订阅感兴趣的消息类型等待回调执行业务操作 bus.$on(&#39;some-event-name&#39;, handler); ``` 以上三种方案覆盖了大部分日常遇到的实际应用场景,开发者可以根据具体项目的规模和技术栈特点选取最合适的一种或组合运用它们完成高效优雅的组件化编程工作[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值