首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第 7 章 处理用户交互
7.1 事件的监听与处理
7.1.1 事件监听示例
7.1.2 多事件处理
7.1.3 事件修饰符
7.2 Vue中的事件类型
7.2.1 常用的事件类型
7.2.2 按键修饰符
7.3 实战一:随鼠标移动的小球
7.4 实战二:弹球游戏
第 8 章 组件基础
8.1 关于Vue应用与组件
8.1.1 Vue应用的数据配置选项
8.1.2 定义组件
8.2 组件中数据与事件的传递
8.2.1 为组件添加外部属性
8.2.2 处理组件事件
8.2.3 在组件上使用v-model指令
8.3 自定义组件的插槽
8.3.1 组件插槽的基本用法
8.3.2 多具名插槽的用法
8.4 动态组件的简单应用
8.5 实战:开发一款小巧的开关按钮组件
第 9 章 组件进阶
9.1 组件的生命周期与高级配置
9.1.1 生命周期方法
9.1.2 应用的全局配置选项
9.1.3 组件的注册方式
9.2 组件props属性的高级用法
9.2.1 对props属性进行验证
9.2.2 props的只读性质
9.2.3 组件数据注入
9.3 组件Mixin技术
9.3.1 使用Mixin来定义组件
9.3.2 Mixin选项的合并
9.3.3 进行全局Mixin
9.4 使用自定义指令
9.4.1 认识自定义指令
9.4.2 自定义指令的参数
9.5 组件的Teleport功能
第 10 章 Vue响应性编程
10.1 响应性编程原理与在Vue中的应用
10.1.1 手动追踪变量的变化
10.1.2 Vue中的响应性对象
10.1.3 独立的响应性值Ref的应用
10.2 响应式的计算与监听
10.2.1 关于计算变量
10.2.2 监听响应式变量
10.3 组合式API的应用
10.3.1 关于setup方法
10.3.2 在setup方法中定义生命周期行为
10.4 实战:支持搜索和筛选的用户列表示例
10.4.1 常规风格的示例工程开发
10.4.2 使用组合式API重构用户列表页面
当前位置:
首页>>
技术小册>>
TypeScript和Vue从入门到精通(三)
小册名称:TypeScript和Vue从入门到精通(三)
### 8.2.3 在组件上使用`v-model`指令 在Vue.js的开发旅程中,`v-model`指令无疑是一个强大的工具,它简化了表单输入和应用状态之间的双向绑定。然而,Vue.js的灵活性和组件化设计不仅仅局限于原生表单元素。在TypeScript与Vue结合的项目中,将`v-model`用于自定义组件,可以进一步提升开发效率和代码的可维护性。本章节将深入探讨如何在Vue组件中自定义并实现`v-model`,以及如何在TypeScript环境下优化这一过程。 #### 8.2.3.1 理解`v-model`的本质 在Vue中,`v-model`实际上是一个语法糖,它背后是基于`value`属性和`input`事件的组合。默认情况下,`v-model`在表单元素(如`<input>`、`<select>`、`<textarea>`)上工作时,会自动将元素的`value`特性绑定到一个变量上,并在元素的`input`事件被触发时更新这个变量的值。 然而,当我们将`v-model`用于自定义组件时,这一机制需要被显式定义。Vue允许我们通过`model`选项来自定义`v-model`绑定的prop名称和触发更新的事件名称,但如果不设置`model`选项,Vue将默认使用`value`作为prop名称,`input`作为事件名称。 #### 8.2.3.2 在自定义组件中定义`v-model` 要在TypeScript编写的Vue组件中使用`v-model`,我们首先需要了解如何在组件内部接收和发出数据。这通常通过props和自定义事件来实现。 **步骤 1: 定义Props** 首先,在你的组件中,定义一个prop来接收外部传入的值。通常,这个prop的名称是`value`,但你可以通过组件的`model`选项来自定义。 ```typescript // MyCustomInput.vue <script lang="ts"> import { defineComponent, PropType } from 'vue'; export default defineComponent({ name: 'MyCustomInput', props: { value: { type: String as PropType<string>, required: true } }, // 其他选项... }); </script> ``` **步骤 2: 触发事件更新** 接下来,你需要在组件内部适当地触发一个事件来更新父组件中的值。这通常是通过`$emit`方法实现的,事件名默认为`input`,但同样可以通过`model`选项来自定义。 ```typescript // MyCustomInput.vue (续) <template> <div> <input :value="value" @input="$emit('input', $event.target.value)" type="text" /> </div> </template> ``` **步骤 3: (可选)使用`model`选项** 虽然直接使用`value`和`input`是Vue处理`v-model`的默认方式,但你可以通过组件的`model`选项来自定义这些名称,以提高代码的可读性和灵活性。 ```typescript // MyCustomInput.vue (自定义model) export default defineComponent({ name: 'MyCustomInput', model: { prop: 'customValue', // 使用customValue替代默认的value event: 'update:customValue' // 使用update:customValue替代默认的input }, props: { customValue: { type: String as PropType<string>, required: true } }, // 模板中相应地改为使用@update:customValue和:customValue }); ``` #### 8.2.3.3 在父组件中使用自定义`v-model` 一旦你的自定义组件支持了`v-model`,你就可以像使用原生表单元素一样,在父组件中使用它了。 ```typescript // ParentComponent.vue <template> <div> <!-- 使用默认的v-model --> <MyCustomInput v-model="myValue" /> <!-- 使用自定义的model --> <MyCustomInput v-model:customValue="anotherValue" /> </div> </template> <script lang="ts"> import { defineComponent, ref } from 'vue'; import MyCustomInput from './MyCustomInput.vue'; export default defineComponent({ components: { MyCustomInput }, setup() { const myValue = ref(''); const anotherValue = ref(''); return { myValue, anotherValue }; } }); </script> ``` 注意,当使用自定义的model时(如`v-model:customValue`),你需要明确指定绑定的prop名称。 #### 8.2.3.4 TypeScript类型安全 在TypeScript环境下使用Vue时,类型安全是一个重要的考虑因素。确保你的`props`和`$emit`事件都有正确的类型定义,可以帮助你在开发过程中避免许多常见的错误。 对于`props`,Vue 3的`PropType`已经内置了对基本类型的支持,但对于复杂类型(如对象或数组),你可能需要定义更具体的类型。 对于`$emit`,Vue 3没有直接的TypeScript支持来自动推断事件类型,但你可以通过类型断言或在组件内部定义事件类型来增强类型安全。 #### 8.2.3.5 实战案例 假设我们正在开发一个复选框列表组件,每个复选框都绑定到一个布尔值上,我们希望通过`v-model`来控制这个列表的选中状态。 ```typescript // CheckboxGroup.vue <template> <div> <label v-for="(item, index) in options" :key="index"> <input type="checkbox" :value="item.value" :checked="selectedValues.includes(item.value)" @change="updateSelection" /> {{ item.label }} </label> </div> </template> <script lang="ts"> import { defineComponent, PropType, ref, watch } from 'vue'; interface Option { label: string; value: string; } export default defineComponent({ name: 'CheckboxGroup', props: { value: { type: Array as PropType<string[]>, required: true }, options: { type: Array as PropType<Option[]>, required: true } }, setup(props, { emit }) { const selectedValues = ref(props.value.slice()); watch(selectedValues, (newValue) => { emit('update:modelValue', newValue); }, { deep: true }); function updateSelection(event: Event) { const target = event.target as HTMLInputElement; const value = target.value; if (target.checked) { selectedValues.value.push(value); } else { const index = selectedValues.value.indexOf(value); if (index > -1) { selectedValues.value.splice(index, 1); } } } return { selectedValues, updateSelection }; } }); </script> <!-- 注意:在父组件中使用时,应使用v-model:modelValue来绑定 --> ``` 在这个例子中,我们定义了一个`CheckboxGroup`组件,它接受一个`options`数组和一个`value`数组作为props。`value`数组用于存储被选中的复选框的值。由于Vue 3默认将`v-model`的prop名称和事件名称分别设为`modelValue`和`update:modelValue`,我们在父组件中应该使用`v-model:modelValue`来绑定这个组件。 通过以上的讨论和实战案例,你应该已经掌握了在Vue和TypeScript项目中,如何在自定义组件上灵活使用`v-model`指令的方法。这不仅提升了代码的复用性和可维护性,也展示了Vue.js在构建复杂应用时的强大能力。
上一篇:
8.2.2 处理组件事件
下一篇:
8.3 自定义组件的插槽
该分类下的相关小册推荐:
vue项目构建基础入门与实战
Vue源码完全解析
TypeScript和Vue从入门到精通(五)
Vue3技术解密
Vue原理与源码解析
Vue.js从入门到精通(一)
Vue.js从入门到精通(三)
Vue.js从入门到精通(二)
TypeScript和Vue从入门到精通(一)
VUE组件基础与实战
Vue.js从入门到精通(四)
移动端开发指南