组件传值(父传子)

本文介绍了如何使用Vue.js进行父子组件间的数据传递。通过Vue.component创建子组件,并利用props注册及传递父组件的值到子组件,实现父组件值变化时子组件实时更新。示例代码详细展示了这一过程,同时提供了Vue.js的CDN链接以供运行验证。
<div id="app">
    <p>这是父组件{{parentData}}</p>
     // 3.吧祖册过的子组件放到页面上 parentval名字自定义parentData这是父组件的值吧他赋值给子组件
    <child :parentval="parentData"></child>
</div>
  //1.通过Vue.component去创建子组件, child名字随意
Vue.component("child",{
  //2.通过props注册子组件
props:["parentval"], 
  //4.吧上面传值的parentval拿过来 实现父传子 
  //ps:子组件的值会随着父组件的值更改而更改
template:"<div>我是子组件:{{parentval}}</div>"

})

new Vue({
    el:"#app",
    data:{
    //这里parentData是父组件的值
        parentData:"父组件的值"
    }
})

效果如如下
在这里插入图片描述

可以拿过去运行一下 如果运行不出来的话可以引入这个cdn就可以看到效果了

<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.1/vue.js"></script>

下一个文档讲子组件的传值 有啥不懂得留言

<think> 我们正在讨论Vue中子组件组件的方法。根据引用[2],在Vue3中,子组件组件主要使用自定义事件(emit)。引用中展示了两种方式:使用setup语法糖和不使用setup语法糖。这里我们重点讲解使用setup语法糖的方式,因为这是Vue3的推荐写法。 ### 步骤说明 1. **子组件定义事件**:在子组件中使用`defineEmits`函数定义可以触发的事件。 2. **子组件触发事件**:在需要的时候,通过`emit`函数触发事件,并递数据。 3. **组件监听事件**:组件在模板中引用子组件时,使用`v-on`(或简写`@`)监听子组件定义的事件,并指定一个方法来接收数据。 ### 代码示例 #### 子组件(ChildComponent.vue) ```vue <script setup> import { defineEmits, ref } from 'vue'; // 定义可触发的事件,这里定义了一个名为"returnResults"的事件 const emit = defineEmits(["returnResults"]); // 示例数据 const select = ref("1"); const content = ref(""); const users = ref([]); function search() { // ... 执行一些操作,比如根据条件获取数据 // 假设我们获取到了users数据 // 触发事件,将数据递给组件 emit("returnResults", users.value); } </script> <template> <!-- 子组件的模板内容 --> <input v-model="content" /> <button @click="search">搜索</button> </template> ``` #### 组件(ParentComponent.vue) ```vue <script setup> import { ref } from 'vue'; import ChildComponent from './ChildComponent.vue'; // 用于接收子组件递过来的数据 const results = ref([]); // 定义处理事件的方法,当子组件触发returnResults事件时,这个方法会被调用 function handleResults(data) { results.value = data; console.log('接收到子组件的数据:', data); } </script> <template> <div> <!-- 在组件中使用子组件,并监听子组件的returnResults事件 --> <ChildComponent @returnResults="handleResults" /> <!-- 显示从子组件接收到的数据 --> <div v-for="(item, index) in results" :key="index"> {{ item }} </div> </div> </template> ``` ### 解释 - **子组件**:使用`defineEmits`定义了`returnResults`事件,然后在`search`函数中通过`emit('returnResults', users.value)`触发该事件,并将`users.value`作为参数递。 - **组件**:在使用子组件时,通过`@returnResults="handleResults"`监听子组件的事件。当子组件触发事件时,组件的`handleResults`方法会被调用,参数就是子组件递过来的数据。 ### 注意事项 1. **事件命名**:自定义事件名建议使用kebab-case(短横线分隔命名),例如`return-results`,因为HTML属性是不区分大小写的。但在Vue3中,使用`defineEmits`定义时可以使用camelCase(驼峰命名),在模板中监听时使用kebab-case。不过,在引用[2]中使用了camelCase,实际上在Vue3中,如果在`<script setup>`中使用camelCase定义事件名,在组件模板中既可以写camelCase也可以写kebab-case(Vue会自动转换)。但为了规范,建议在模板中始终使用kebab-case。 2. **参数递**:子组件可以递任意多个参数,组件的方法按顺序接收这些参数。 3. **类型声明**(TypeScript):如果使用TypeScript,可以为`defineEmits`提供更详细的类型声明,例如: ```typescript const emit = defineEmits<{ (e: 'returnResults', data: any[]): void }>(); ``` ### 相关问题 1. 除了`emit`,还有哪些子组件组件的方法? 2. 在Vue3的选项式API中如何实现子组件组件? 3. 如何通过`v-model`实现组件的双向数据绑定? 4. 使用事件总线(Event Bus)进行跨组件通信有哪些优缺点? 5. 在Vue3中,`defineEmits`和`emit`的使用与Vue2有什么不同? [^2]: 引用来源。 </think> ### Vue 中子组件组件的方法(使用自定义事件) 在 Vue 中,子组件组件主要通过 **自定义事件** 实现,核心流程如下: 1. **子组件触发事件** 使用 `defineEmits` 声明事件类型,通过 `emit()` 触发事件并递数据: ```vue <script setup> import { defineEmits } from 'vue' // 声明自定义事件类型 const emit = defineEmits(['childEvent']) function sendData() { const data = { value: "子组件数据" } emit('childEvent', data) // 触发事件并 } </script> ``` 2. **组件监听事件** 在组件模板中通过 `@事件名` 监听并接收数据: ```vue <template> <ChildComponent @childEvent="handleData" /> </template> <script setup> function handleData(receivedData) { console.log("接收到子组件数据:", receivedData) // 执行组件逻辑 } </script> ``` --- ### 完整代码示例 #### 子组件 (Child.vue) ```vue <template> <button @click="sendMessage">递数据到组件</button> </template> <script setup> import { defineEmits } from 'vue' const emit = defineEmits(['messageSent']) function sendMessage() { const message = "Hello from Child!" emit('messageSent', message) // 触发自定义事件 } </script> ``` #### 组件 (Parent.vue) ```vue <template> <Child @messageSent="receiveMessage" /> <p>接收到的消息:{{ childMessage }}</p> </template> <script setup> import { ref } from 'vue' import Child from './Child.vue' const childMessage = ref('') function receiveMessage(msg) { childMessage.value = msg // 接收子组件来的 } </script> ``` --- ### 关键机制说明 1. **`defineEmits`** - 用于声明子组件可触发的事件类型 - 事件名建议使用 camelCase(如 `messageSent`) - 支持声明多个事件:`defineEmits(['eventA', 'eventB'])` 2. **`emit()` 方法** - 第一个参数:事件名称(必须匹配声明的事件) - 后续参数:要递的数据(类型/数量不限) - 例:`emit('update', { id: 1, name: "test" })` 3. **事件监听** - 组件使用 `@事件名="回调函数"` 监听 - Vue 自动将子组件递的数据作为回调函数参数 - 支持递多个参数:`emit('event', arg1, arg2)` → `@event="(a,b) => ..."` --- ### 替代方法(不推荐) | 方法 | 问题 | 适用场景 | |-----------------------|--------------------------|-----------------| | `v-model` + `emit` | 需要额外处理 update 事件 | 表单双向绑定 | | 状态管理(Pinia/Vuex) | 增加复杂度 | 跨层级组件通信 | | Props 回调函数 | 违反单向数据流原则 | 特殊交互场景 | > 💡 **最佳实践**:优先使用自定义事件实现直接子通信,复杂场景再用状态管理[^2] --- ### 相关问题 1. Vue 2 和 Vue 3 在事件递机制上有何区别? 2. 如何实现跨层级组件间通信(祖孙组件)? 3. 使用 TypeScript 时如何为自定义事件添加类型声明? 4. `defineEmits` 和 Vue 2 的 `this.$emit` 有哪些核心差异? 5. 事件总线(Event Bus)Vue 3 中是否仍适用?为什么? [^2]: Vue 3 自定义事件官方文档参考 [^1]: 组件模式对比分析 [^3]: 复杂状态管理方案比较
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值