Vue实践之项目积累------组件之间的传值(父子、子父、兄弟及任意)

本文深入探讨Vue框架中组件间的通信机制,包括父组件向子组件传递数据的方法,子组件如何向父组件发送事件,以及兄弟组件间如何通过中间媒介实现通信。通过具体实例,帮助开发者理解并掌握Vue组件间数据流动的技巧。

在实际应用中,vue的传值就像是人每天要吃的饭一样,是一个避无可避的东西。往大了说组件之间的传值就是任意组件之间的通信,往小了说组件之间的传值可分为父传子,子传父,以及兄弟之间。


父传子

父传子从传统意义上父亲把已有的东西留给自己的儿子,儿子这里叫继承。在vue中,父组件首先的有值,也就是说父组件是产生值的地方,其次父组件中要有子组件,所有子组件在父组件中注册,明确父子关系;之后在子组件上注册一个值,用于传递的凭证,也就是传统意义上父亲留给儿子的东西,这个东西所在了。父组件的工作到这里就结束了,接下来就是子组件的接收问题;子组件用于接收的容器是prop,将从父亲那拿到的东西放入prop,这样这个值就可以被子组件运用了,某种意义上来说也就是子组件的东西了。以上语言翻译成计算机语言就是:

子传父

子传父是指儿子将自己的方法或者值传递到父亲处,同样在父亲处进行接收,并处理;儿子是利用$emit这个属性,父亲则是利用$on这个属性

兄弟组件及任意

兄弟组件有两种处理方式:一是先子传父再父传子;二是人为的添加一个梯子,即一个新的Vue对象做介质,在兄弟组件中同时引入这个介质,值或方法产生的地方用$emit这个方法,接收的一方用$on这个方法

### Vue 父子组件 v-model 双向绑定使用方法 在 Vue 中,父子组件可以通过 `v-model` 实现双向绑定。这种绑定机制允许组件组件之间共享数据,并且当任意一方的数据发生变化时,另一方也会同步更新。以下是实现方法的详细说明: #### 1. 组件的实现 组件通过 `v-model` 将一个变量递给组件。默认情况下,`v-model` 的会被解析为组件的 `props` 中的 `value` 属性,并且当组件触发 `input` 事件时,组件会更新该变量。 ```html <template> <div> <!-- 使用 v-model 将 formData.value 绑定到组件 --> <son v-model="formData.value"></son> <button @click="changeVal">点击变化 value</button> </div> </template> <script> import son from "./son.vue"; export default { components: { son }, name: "father", data() { return { formData: {} // 表单对象 }; }, watch: { value(val) { console.log("组件看见的" + val); // 监听的变化 [^1] } }, methods: { changeVal() { this.formData.value = "组件事件改变了"; // 修改 formData.value 的 [^1] } } }; </script> ``` #### 2. 组件的实现 组件需要定义一个 `props` 来接收组件递的(默认为 `value`),并通过 `$emit` 方法将更新后的递回组件。 ```html <template> <div> <input v-model="model.captchaValue" placeholder="请输入验证码" /> <button @click="changeCode">刷新验证码</button> </div> </template> <script> export default { name: "YfCaptcha", props: { value: { type: Object, default: function() { return {}; } } }, data() { return { model: { captchaValue: "", captchaKey: "" } // 定义模型对象 [^2] }; }, created() { this.model = this.value; // 初始化模型对象 [^2] this.changeCode(); }, methods: { changeCode() { this.model.captchaKey = uuid.v4(); // 更新验证码 this.$emit("input", this.model); // 触发 input 事件,通知组件更新 [^2] } } }; </script> ``` #### 3. Vue 3 中的多绑定 在 Vue 3 中,`v-model` 支持自定义修饰符,可以同时绑定多个。例如,可以绑定 `msg` 和 `otherValue` 两个。 ```html <template> <div> <Test v-model="state.msg" v-model:otherValue="state.otherValue"></Test> </div> </template> <script setup lang="ts"> import { reactive, watch } from "vue"; const state = reactive({ msg: "", otherValue: "" }); watch( () => state.msg, () => { console.log(state.msg, "外部数据"); // 监听 msg 的变化 [^3] }, { deep: true } ); watch( () => state.otherValue, () => { console.log(state.otherValue, "其他数据"); // 监听 otherValue 的变化 [^3] }, { deep: true } ); </script> ``` #### 4. 注意事项 -Vue 2 中,默认的 `v-model` 绑定的是 `value` 属性和 `input` 事件。 - 如果需要绑定其他属性或事件,可以在 Vue 3 中使用修饰符(如 `v-model:otherValue`)。 - 确保组件正确地通过 `$emit` 触发 `input` 事件以通知组件更新数据。 --- ### 示例代码总结 以下是一个完整的父子组件双向绑定示例: ```html <!-- 组件 --> <template> <div> <Child v-model="parentData"></Child> <p>组件数据:{{ parentData }}</p> <button @click="updateParentData">更新组件数据</button> </div> </template> <script> import Child from "./Child.vue"; export default { components: { Child }, data() { return { parentData: "初始" }; }, methods: { updateParentData() { this.parentData = "组件直接修改"; } } }; </script> <!-- 组件 --> <template> <div> <input v-model="localValue" @input="updateValue" /> </div> </template> <script> export default { props: { value: { type: String, default: "" } }, data() { return { localValue: this.value }; }, watch: { value(newVal) { this.localValue = newVal; } }, methods: { updateValue() { this.$emit("input", this.localValue); // 触发 input 事件 [^1] } } }; </script> ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值