input change事件
时间: 2025-05-25 08:34:12 浏览: 21
### 使用 `defineModel` 结合 Input/Change 事件实现父组件向子组件传值
在 Vue 3 中,`defineModel` 提供了一种简洁的方式来处理基于 `v-model` 的父子组件通信。当涉及输入框或其他表单控件时,通常会结合 `input` 或 `change` 事件完成交互逻辑。
以下是详细的实现过程:
---
#### 父组件部分
父组件通过 `v-model` 将数据传递给子组件,并监听其变化。代码示例如下:
```vue
<template>
<ChildComponent v-model="parentInput" />
</template>
<script setup>
import ChildComponent from './ChildComponent.vue';
import { ref } from 'vue';
const parentInput = ref('默认值'); // 初始化父组件的值
</script>
```
在这里,`parentInput` 是一个响应式变量,用于存储当前输入框的内容[^1]。
---
#### 子组件部分
子组件使用 `defineModel` 接收父组件的数据,并通过 `@input` 或 `@change` 事件更新父组件的状态。具体代码如下:
```vue
<template>
<div>
<!-- 输入框绑定 -->
<input :value="model" @input="onInputChange" placeholder="请输入..." />
<p>当前值:{{ model }}</p>
</div>
</template>
<script setup>
// 定义模型,默认会自动映射到 props 和 emits
const model = defineModel();
function onInputChange(event) {
const newValue = event.target.value;
model.value = newValue; // 更新父组件中的值
}
</script>
```
在这段代码中:
- `defineModel()` 返回的对象可以直接用来访问和修改父组件传递的值。
- 当用户在输入框中键入新内容时,触发 `@input` 事件,调用 `onInputChange` 函数更新 `model.value`[^2]。
---
#### 工作流程解析
1. **初始化阶段**
父组件将 `parentInput` 值通过 `v-model` 传递给子组件。此时,子组件内的 `model` 属性与父组件的 `parentInput` 形成双向绑定关系[^3]。
2. **用户交互阶段**
用户在子组件的 `<input>` 上输入内容时,触发 `@input` 事件。子组件捕获新的输入值并通过 `model.value = newValue` 发送回父组件。
3. **同步更新**
父组件检测到 `parentInput` 的变化后,重新渲染视图;与此同时,子组件也实时反映最新的值[^4]。
---
#### 扩展至 Change 事件
如果希望仅在用户结束编辑后再通知父组件(而非每次按键都触发),可以改用 `@change` 替代 `@input`。调整后的子组件代码如下:
```vue
<template>
<div>
<input :value="model" @change="onChangeHandler" placeholder="请输入..." />
<p>当前值:{{ model }}</p>
</div>
</template>
<script setup>
const model = defineModel();
function onChangeHandler(event) {
const updatedValue = event.target.value;
model.value = updatedValue; // 在 change 事件中更新父组件值
}
</script>
```
这种方式适用于某些特定场景,比如批量提交表单字段或减少频繁的 DOM 更新开销[^5]。
---
### 总结
无论是采用 `@input` 还是 `@change`,核心思路都是利用 `defineModel` 构建起父子组件间高效、清晰的双向绑定通道。开发者可以根据实际需求灵活选择适合的事件类型。
---
阅读全文
相关推荐


















