网站首页 > 技术文章 正文
随着 Vue3.4 版本的发布,defineModel 也正式转正了。它可以简化父子组件之间的双向绑定,是目前官方推荐的双向绑定实现方式。
之前在 Vue3.3 中,该方法还是实验性方法,使用 defineModel 需在 vite.config.ts 里面配置 defineModel 为 true,配置如下:
export default defineConfig({
plugins: [
vue({
script: {
defineModel: true,
},
}),
],
});
但 Vue3.4 版本中已经是稳定特性了!!!
正式介绍 defineModel
defineModel 是一个新的 <script setup> 宏,旨在简化支持 v-model 的组件的实现, 这个宏用来声明一个双向绑定 prop,通过父组件的 v-model 来使用。
它之前作为实验性功能在 Vue3.3 中发布,并在 Vue3.4 中升级为稳定状态。现在,它还为 v-model修饰符的使用提供了更好的支持。
defineModel 使用
例举一个最简单的使用场景: 自定义组件中使用 v-model 来进行数据的双向绑定
<!-- 父组件 -->
<template>
<div>
<!-- 自定义子组件 CustomComponent 使用 v-model 指令绑定 userName -->
<CustomComponent v-model="userName" />
</div>
</template>
<script setup>
import { ref } from "vue";
import CustomComponent from "./CustomComponent.vue";
const userName = ref("前端开发爱好者");
</script>
在 Vue3.3 版本之前,我们通常通过 props 接收 modelValue,然后在更新时,我们会将更新后的值传递给 emit 的 update:modelValue 并执行:
<!-- 子组件 CustomComponent -->
<template>
<input
:value="props.modelValue"
@input="emit('update:modelValue', $event.target.value)"
/>
</template>
<script setup>
import { defineProps, defineEmits } from "vue";
const props = defineProps(["modelValue"]);
const emit = defineEmits(["update:modelValue"]);
</script>
Vue3.4 版本之后,我们将使用 defineModel 替代子组件中的 props 和 emit。
<!-- 子组件 CustomComponent -->
<template>
<input type="text" v-model="modelValue" />
</template>
<script setup>
const modelValue = defineModel();
</script>
带参数/定义多个 v-model
组件中可以支持定义多个 defineModel,可以满足绑定多个双向绑定的属性
<!-- 父组件 -->
<template>
<div>
<!-- 自定义子组件 CustomComponent 使用 v-model 指令绑定 userName -->
<CustomComponent
v-model="userName"
v-model:title="title"
v-model:subTitle="subTitle"
/>
</div>
</template>
<script setup>
import { ref } from "vue";
import CustomComponent from "./CustomComponent.vue";
const userName = ref("前端开发爱好者");
const title = ref("前端开发爱好者_title");
const subTitle = ref("前端开发爱好者_subTitle");
</script>
<!-- 子组件 CustomComponent -->
<template>
<input type="text" v-model="modelValue" />
<input type="text" v-model="title" />
<input type="text" v-model="subTitle" />
</template>
<script setup>
const modelValue = defineModel();
const title = defineModel("title");
const subTitle = defineModel("subTitle");
</script>
修饰符和转换器
为了获取 v-model 指令使用的修饰符,我们可以像这样解构 defineModel() 的返回值:
const [modelValue, modelModifiers] = defineModel()
// 对应 v-model.trim
if (modelModifiers.trim) {
// ...
}
当存在修饰符时,我们可能需要在读取或将其同步回父组件时对其值进行转换。我们可以通过使用 get 和 set 转换器选项来实现这一点:
const [modelValue, modelModifiers] = defineModel({
// get() 省略了,因为这里不需要它
set(value) {
// 如果使用了 .trim 修饰符,则返回裁剪过后的值
if (modelModifiers.trim) {
return value.trim()
}
// 否则,原样返回
return value
}
})
结语
defineModel 的引入标志着 Vue 在提升开发者体验方面迈出了重要的一步。现在,开发者可以更加专注于应用的逻辑和用户体验,而不是纠结于数据绑定的细节。让我们一起迎接 Vue 3.4 带来的更多可能性吧!
猜你喜欢
- 2024-10-12 学习Vue的数据绑定语法,实现动态的用户界面(四)
- 2024-10-12 Vue前端框架:绑定单个复选框。 vue复选框默认选中
- 2024-10-12 vue2响应式原理 vue2.0响应式原理
- 2024-10-12 vue数据绑定语法 vue样式绑定语法
- 2024-10-12 【Vue】第5章 Vue数据绑定和计算属性详解
- 2024-10-12 Vue数据及事件绑定、filter过滤器
- 2024-10-12 Vue开发:组件绑定自定义事件及其应用
- 2024-10-12 vue.js实战之表单绑定-单选按钮 vue表格单选
- 2024-10-12 跟神一起学前端-初识vue、数据绑定
- 2024-10-12 vue.js 动态绑定class的几种方式 vue动态绑定类
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)