vue3.4 里面的新特性之v-model实践

vue3.4 里面的新特性

vue 的大版本版本已经升级到 3.4,就在写这篇文章的 30 分钟前,最近新版本是 3.4.20,可见 vue 团队的维护工作一直在持续的进行着...(手动点赞) 那么升级的后的新功能有哪些,这篇文章就来分析下 vue3.4.20 的几个最新功能

v-model

v-model 可以在组件上使用以实现双向绑定。

之前版本的写法

App.vue 组件

html 复制代码
<script setup>
  import Child from "./components/Child.vue";
  import { ref } from "vue";
  const tips = ref(undefined);
</script>

<template>
  <h3>parent:{{ tips }}</h3>
  <Child v-model="tips" />
</template>

<style scoped></style>

Child 组件

html 复制代码
<template>
  <div>
    <h2>{{ msg }}</h2>
    <input v-model="msg" />
  </div>
</template>

<script setup>
  import { ref } from "vue";
  const msg = ref("this is a msg");
</script>
<style scoped></style>

child组件里面的默认值如果要生效,父组件的tips要为undefined,为空null|''会覆盖默认值

  • 正常显示默认值
bash 复制代码
const tips = ref(undefined);
bash 复制代码
const tips = ref("");
  • 不显示默认值

### v3.4 版本的写法

xml 复制代码
从 Vue 3.4 开始,推荐的实现方式是使用 defineModel() 宏:

父组件的没变化,只要是子组件里面有所变化

Child 组件

```html
<template>
  <div>
    <h3>child props:{{ model }}</h3>
    <h3>{{ msg }}</h3>
    <input v-model="msg" />
  </div>
</template>
```

这里需要注意的,父组件的值不能为 null | '',不然子组件的默认值不会显示出来, 赋默认值的方法

bash 复制代码
const model = defineModel({
  default: "this is a default val"
});

此时,我们将 model 赋值给子组件里面的 input 作为响应数据,更新输入框,我们发现父组件的值会同步变化,且控制台没有报错或者警告信息...这样就没有了之前繁琐的 update 更新 emit 事件操作了

组件的多个 v-model

App.vue

html 复制代码
<script setup>
  import Child from "./components/Child.vue";
  import { ref } from "vue";
  const tips = ref(undefined);
  const title = ref("title");
</script>

<template>
  <h3>parent:tips {{ tips }}</h3>
  <h3>parent title:{{ title }}</h3>
  <Child v-model="tips" v-model:title="title" />
</template>

<style scoped></style>

Child.vue

html 复制代码
<template>
  <div>
    <h3>child props:{{ model }}</h3>
    <h3>child props:{{ title }}</h3>
    <h3>{{ title }}</h3>
    <input v-model="title" />
  </div>
</template>

<script setup>
  import { ref } from "vue";

  const msg = ref("this is a msg");
  const model = defineModel({
    default: "this is a default val",
  });

  const title = defineModel("title", { default: "title from parent..." });
</script>
<style lang="less" scoped></style>

经过实战测试,页面正常显示运行,没有显示报错日志

还有更多的特性大家可以自己看官网,对实践其他的新特性

具体参考:cn.vuejs.org/guide/compo...

相关推荐
苦瓜小生8 小时前
【前端】【力扣与手撕】十天带你刷完前端算法与手撕,全是最简单好记的最优解法!day4
前端·数据结构·算法·leetcode·面试
mayaairi8 小时前
Vue2 实战进阶:表单数据收集、指令系统与自定义指令全解析
前端·javascript·vue.js
计算机魔术师8 小时前
实测GPT-6 Astra后,我发现过去十年的专业门槛正在失效
前端
虎头金猫8 小时前
Pic Smaller 本地部署:压缩图片、转换格式,再搭建自己的 Web 工具
运维·前端·开源·aigc·ai编程·ai写作
hunterandroid8 小时前
Android ANR 排查实战:从线上告警到主线程卡点定位
android·前端
图扑软件8 小时前
下篇・换墨|主题/多语言/移动端,一套组件全覆盖
前端·javascript·ui·性能优化·数据可视化
程序员老赵8 小时前
Docker 部署 TeX Live:轻松搭建 LaTeX 论文排版编译平台
前端·docker·latex
计算机毕设定制辅导-无忧学长8 小时前
《基于Spring Boot传承之光非遗陶瓷烧造产品交易平台的设计与实现》
java·vue.js·spring boot·后端·毕业设计
Zhu7588 小时前
部署安全的pg数据库,搭配pgadmin实现web界面管理
前端·数据库·安全
杉氧8 小时前
打破边界(二):在 React Native 中嵌入原生 UI 组件 (Native UI Components)
android·前端·react native