vue3.x系列之v-model的使用技巧及面试高频问题

在前面的一篇文章中,我们分析了v-model在v2版中的用法。这次我们分析下在v3中的使用技巧。学习之前,请忘记之前的v2语法,现在的更加简洁易用。

组件上面的v-model

在v3.4版之前的写法如下

  • 子组件Child.vue
js 复制代码
<!-- Child.vue -->
<script setup>
defineProps({
  modelValue: {
    type: Number,
    default: 0
  }
});

const emits = defineEmits(["update"]);
//function update() {
//  emits("update:modelValue", modelValue + 1);
//}
</script>

<template>
  <div>Parent bound v-model is: {{ modelValue }}</div>
  <button @click="$emit('update:modelValue',modelValue + 2)">Increment</button>
</template>
  • 父组件
html 复制代码
<Child v-model="count" />


上面的写法大家应该都很熟悉,应该也会感觉很繁琐。

v3.4版本之后的写法

  • 推荐的实现方式是使用 defineModel() 宏
    修改子组件,父组件保持不变
js 复制代码
<!-- Child.vue -->
<script setup>
const model = defineModel();
function update() {
  model.value++;
}
</script>

<template>
  <div>Parent bound v-model is: {{ model }}</div>
  <button @click="update">Increment</button>
</template>
  • 父组件代码
js 复制代码
<template>
  <div>
    <h1>VModelView</h1>
    <p>parent count: {{ count }}</p>
    <Child v-model="count" />
  </div>
</template>

<script setup>
import Child from "@/components/Child.vue";
import { ref } from "vue";
const count = ref(0);
</script>

可以观察到,实现了一样的效果,代码也简洁了很多。

defineModel() 返回的值是一个 ref。它可以像其他 ref 一样被访问以及修改,不过它能起到在父组件和当前变量之间的双向绑定的作用

  • 在子组件中直接更改了这个model的value值,
  • 父组件中的count与组件中的model.value保持了联动

自定义我们的输入组件

  • 父组件的
js 复制代码
<template>
  <div>
    <h1>VModelView</h1>
    <p>parent count: {{ count }}</p>
    <Child v-model="count" />
    <br />
    <p>parent msg:{{ msg }}</p>
    <MyInput v-model="msg" />
  </div>
</template>

<script setup>
import Child from "@/components/Child.vue";
import MyInput from "@/components/MyInput.vue";
import { ref } from "vue";
const count = ref(0);
const msg = ref("hello world");
</script>
  • 子组件
js 复制代码
<template>
  <p>child msg: {{ inputModel }}</p>
  <input v-model="inputModel" />
</template>

<script setup>
const inputModel = defineModel();
</script>

这样我们就很简洁的封装了一个自定义的单行文本组件,自己加点样式美化即可。

  • v-model传参
html 复制代码
 <MyInput v-model:title="msg" v-model="msg2" />
js 复制代码
const msg = ref("abc");
const msg2 = ref("hello");

子组件中defineModel必须接收这个参数,否则不会显示对应的数据,无参可以不用传。

html 复制代码
<template>
  <p>child msg: {{ inputModel }}</p>
  <input v-model="inputModel" />
  <br />
  <input v-model="inputModel2" />
</template>

<script setup>
const inputModel = defineModel("title");
const inputModel2 = defineModel();
</script>
相关推荐
夏河始溢9 小时前
一八四、Zustand 状态管理详解、与 Redux、MobX 的对比分析
前端·javascript·react.js·状态管理·zustand
Code小翊9 小时前
TypeScript 核心语法速查
前端·javascript·typescript
家里有只小肥猫9 小时前
uniApp下拉渐变头部 拿来即用
前端·javascript·uni-app
一起养小猫9 小时前
Flutter for OpenHarmony 实战:科学计算器完整开发指南
android·前端·flutter·游戏·harmonyos
Jinuss9 小时前
源码分析之React中Scheduler调度器的任务优先级
前端·react.js·前端框架
波波00710 小时前
每日一题:在 .NET 中遍历集合(如 List<T>、数组、字典)的过程中进行增删改查会不会有影响?可能引发哪些问题?实际开发中应如何避免?
前端·list
a11177610 小时前
实验室预约管理系统(开源 FastAPI + Vue )
vue.js·开源·fastapi
念念不忘 必有回响10 小时前
码云流水线前端资源传输至目标服务器
运维·服务器·前端
我是伪码农10 小时前
Vue 2.2
前端·javascript·vue.js
时光追逐者10 小时前
一个基于 .NET + Vue 实现的通用权限管理平台(RBAC模式),前后端分离模式,开箱即用!
前端·vue.js·c#·.net·.net core