vue变量传值_vue 组件传值

Vue父子组件间变量传值与事件反馈
本文介绍Vue中父子组件间的变量传值及事件反馈。父组件通过在子组件标签上定义并赋值变量传递对象给子组件,子组件用props获取。子组件操作完成后,用$emit定义回调函数并传参给父组件,父组件监听该事件并定义对应函数处理。

我们的场景是在父组件点击按钮弹出子组件,子组件里对数据进行编辑操作以后通知父组件操作完成。弹窗效果是框架自带的,这里只说一下组件之间如何传值。

子组件:dtls.vue

父组件:  Service.vue

首先父组件要调用子组件:import dtls from './dtls.vue'  (注意,两个vue文件在同一个文件夹下则前面路径给 ./ 即可,不在一个文件夹下的自行科普路径问题)

导入以后添加到当前vue的实例里,如图:

父页面调用的时候直接使用名称做的标签即可:

到此可以访问到子组件的html了,但是我需要把父组件的数据给子组件,是个对象:

首先我在父组件里的子组件标签上定义并赋值一个变量:

注意,:editObject是我定义的名称(用于子组件的取值,你可以理解为形参),等号右边的editObject是我父组件里的一个对象,可以理解为实参,就是实际的值,要传递给子组件的值,名称可以不一样。

到这一步父组件的事就完成了,该子组件接收值了:

在子组件的实例里通过props来获取我在父组件传递的editObject对象,这个时候,子组件已经取得了editObject的值。注意,此时不必再在子组件里定义一个editObject对象,传递过来的参数editObject已经是当前子组件的一个对象了,按正常使用即可,比如我要在子组件的页面上显示具体的值:

通过:model就能绑定值,下面访问的时候,v-model即可:

由于label标签无法 v-model赋值,所以通过{{对象.属性}}即可显示具体字段值。

现在父组件调子组件完成传值了,轮到子组件完成某个操作反馈信息给父组件了:

首先我们在子组件的某个操作完成事件里(比如保存方法的最后一行)定义一个函数并携带上一个对象作为参数:this.$emit('Success', "OK"),图示:

Success你可以理解为回调函数名,这个是子组件自定义的一个名称,$emit方法可以理解为定义一个回调函数名称,并传递一个实参,可以是任何字符串、数组、或者对象。我这里只需传个OK字符串。

好了,子组件的事情完成了,剩下的就是父组件对子组件定义的回调函数进行监听。

现在我们回到父组件的页面上,在dtls标签上加上事件绑定:v-on:Success="Success",完整的dtls标签如下:

最后一步,在父组件里定义一个函数,名为Success:

同理,父组件里的函数名可以和子组件不同,等号左边和右边应该是分别对应一个,我这里没必要写成不一样的,就没去尝试了,大家有自己需求的可以试试。

到此整个组件传值就完成了,从父组件调用子组件并传递对象,到子组件完成操作以后定义事件,最后父组件对子组件的事件进行监听。

<think>我们正在讨论Vue组件之间的数据递方式。根据用户的问题,他特别提到了props和事件,但根据引用内容,Vue组件还有其他方式,如事件总线(EventBus)和Vuex。因此,我们需要全面回答Vue组件的几种主要方式。 根据引用: [^1]和[^2]:主要介绍了props(父子)和$emit(子父)。 [^3]:介绍了事件总线(EventBus)和Vuex。 [^4]:再次说明了props和$emit的使用。 因此,我们可以将回答分为以下几个部分: 1. 父组件向子组件(props) 2. 子组件向父组件($emit) 3. 兄弟组件或任意组件之间(事件总线EventBus) 4. 复杂应用的状态管理(Vuex) 注意:用户特别提到props和事件,所以这两部分要详细。但我们也应该简要提及其他方式,以提供完整的信息。 另外,注意引用格式:在回答中,当我们使用引用内容时,在句末添加引用标识,例如[^1]。 下面组织回答:</think>### Vue 组件数据递详解 Vue 组件间数据递主要通过 **props**(父→子)和 **事件**(子→父)实现,同时还有其他补充方式。以下是核心方法: --- #### 一、Props 父子(单向数据流) **原理**:父组件通过属性绑定递数据,子组件通过 `props` 接收 **特点**:数据单向流动(父→子),子组件不能直接修改 props ```html <!-- 父组件 Parent.vue --> <template> <Child :msg="parentMsg" /> <!-- 动态绑定 --> </template> <script> export default { data() { return { parentMsg: "来自父组件的数据" } } } </script> ``` ```html <!-- 子组件 Child.vue --> <template> <div>{{ msg }}</div> <!-- 显示: "来自父组件的数据" --> </template> <script> export default { props: ['msg'] // 声明接收的prop // 或带类型校验: // props: { msg: { type: String, required: true }} } </script> ``` > 注意:静态数据用 `msg="字符串"`,动态数据用 `:msg="变量"`[^2] --- #### 二、$emit 子父(事件通信) **原理**:子组件通过 `$emit` 触发自定义事件,父组件通过 `v-on` 监听 ```html <!-- 子组件 Child.vue --> <template> <button @click="sendData">递数据</button> </template> <script> export default { methods: { sendData() { this.$emit('child-event', { key: '子组件数据' }) // 触发自定义事件 } } } </script> ``` ```html <!-- 父组件 Parent.vue --> <template> <Child @child-event="handleData" /> <!-- 监听子组件事件 --> </template> <script> export default { methods: { handleData(payload) { console.log(payload.key) // 输出: "子组件数据" } } } </script> ``` > 这是 Vue 官方推荐的子父通信方式[^1][^4] --- #### 三、其他通信方式(补充) 1. **事件总线 (Event Bus)** 任意组件间通信,适用于非父子关系 ```javascript // event-bus.js import Vue from 'vue' export const EventBus = new Vue() // 组件A(发送) EventBus.$emit('global-event', data) // 组件B(接收) EventBus.$on('global-event', data => { ... }) ``` > 需注意组件销毁前移除监听:`beforeDestroy() { EventBus.$off() }`[^3] 2. **Vuex 状态管理** 复杂应用的中心化状态管理,适合多组件共享数据 ```javascript // store.js export default new Vuex.Store({ state: { count: 0 }, mutations: { increment(state) { state.count++ } } }) // 组件中使用 this.$store.commit('increment') console.log(this.$store.state.count) ``` 3. **provide/inject** 祖先组件向后代组件跨级递数据 ```javascript // 祖先组件 export default { provide: { theme: 'dark' } } // 后代组件 export default { inject: ['theme'] } ``` --- ### 选择策略 | 场景 | 推荐方式 | 说明 | |--------------------|-----------------|-------------------------------| | 父子组件简单 | props + $emit | Vue 官方标准模式 | | 兄弟组件通信 | 事件总线/Vuex | 避免组件间强耦合 | | 大型应用状态共享 | Vuex | 集中式状态管理 | | 深层嵌套组件 | provide/inject | 替代多级 prop 递 | > 关键原则: > 1. 优先使用 **props/$emit** 保持数据流清晰[^1] > 2. 避免直接修改 prop 数据(用 `$emit` 通知父组件修改) > 3. 跨组件通信慎用事件总线(可能导致事件混乱) --- ### 示例:完整父子组件通信 ```html <!-- 父组件 --> <template> <div> <Child :count="num" @update-count="num = $event" /> <p>父组件收到: {{ num }}</p> </div> </template> <script> export default { data: () => ({ num: 0 }) } </script> ``` ```html <!-- 子组件 --> <template> <button @click="handleClick">增加: {{ count }}</button> </template> <script> export default { props: ['count'], methods: { handleClick() { this.$emit('update-count', this.count + 1) // 建议更新而非直接修改 } } } </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值