vue v-model

一、为什么使用v-model?

v-model指令可以在表单input、textarea以及select元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。本质上是语法糖,负责监听用户的输入事件来更新数据。

二、什么场景下会使用v-model?

①表单提交。比如用户在检索、创建、更新信息时,需要提交一些数据。

②组件通信。

三、v-model原理

1、v-bind绑定value属性的值。

2、v-on绑定input事件监听到函数中,函数会获取最新的值赋值到绑定的属性中。

  • 在原生元素上使用:

    //模板编译器会对v-model进行更冗长的等价展开
    <input :value="searchText" @input="searchText = $event.target.value">

  • 在组件上使用:

    <CustomInput
    :modelValue="searchText"
    @update:modelValue="newValue => searchText = newValue"
    />
    //注:子组件默认接收和更新modelValue,modelvalue也可以自定义,如

CustomInput.vue组件有两种实现方式,如下:

复制代码
//方式一:<!-- CustomInput.vue -->
<script>
export default {
  props: ['modelValue'],
  emits: ['update:modelValue']
}
</script>
<template>
  <input
    :value="modelValue"
    @input="$emit('update:modelValue', $event.target.value)"
  />
</template>

//方式二:<!-- CustomInput.vue -->
<script>
export default {
  props: ['modelValue'],
  emits: ['update:modelValue'],
  computed: {
    value: {
      get() {
        return this.modelValue
      },
      set(value) {
        this.$emit('update:modelValue', value)
      }
    }
  }
}
</script>

<template>
  <input v-model="value" />
</template>
  • 多个v-model绑定:

    //父组件

    //子组件

四、v-model是双向绑定,是单向数据流

单向数据流:父组件可以向子组件传递数据,并且改变子组件的值,而子组件不能改变父组件传递给它的prop属性,官方推荐的做法是它抛出事件,通知父组件自行改变绑定的值。

单向数据流总结:数据向下,事件向上。

五、v-model修饰符

  1. lazy作用:v-model在进行双向绑定时,绑定的是input事件,那么会在每次内容输入后就将最新的值和绑定的属性进行同步。v-model.lazy会将绑定的事件切换为change事件,只有在提交(比如回车)才会触发。

  2. number作用:v-model绑定的值最终都会转为string类型,及时设置type为number。
    v-model.number非数字以后的字符会被过滤,绑定的value类型隐士转换为number。

  3. trim作用:自动过滤用户输入的守卫空白字符(字符首尾的空格会被过滤)。
    注:修饰符可以串用(v-model.lazy.number.trim = 'value')

  4. 自定义修饰符capitalize:父组件使用v-model.capitalize,子组件的prop(modelModifiers)包含了capitalize且其值为true,默认返回一个空对象。

六、vue3与vue2关于v-model的区别

①vue3默认prop、event为:modelValue和update:modelValue

vue2默认prop、event为:value和input

②vue3直接通过v-model后面参数v-model:msg来指定属性名,并且支持绑定多个v-model

vue2通过子组件的model属性中的prop值和event值来指定属性名和事件名。

相关推荐
程序员老赵16 分钟前
Docker 部署青龙面板:轻松搭建定时任务管理平台
前端·docker·开源
Swot17 分钟前
Asciidoctor 公式数字下标错位问题:原因分析与解决方案
前端
Swot17 分钟前
leo-editor 中将 Markdown 内容转成 asciidoc 格式
前端
狒狒AI30 分钟前
Remotion / GSAP+Three / HyperFrames / Skia 四栈实测:代码渲染知识视频的选栈方法(附开源技能)
前端·人工智能·aigc
修炼的dance31 分钟前
浏览器里导出H.265,8.5秒和55.5秒差在硬件
前端
补码缩写32 分钟前
WebCodecs选编码器,探测之后还要验解码和播放
前端
大文说跨境33 分钟前
亚马逊多账号管理浏览器怎么选?云登/紫鸟/AdsPower 对比
java·前端·自动化
hunter_07635 分钟前
iOS 首页复杂嵌套滚动技术方案:头部固定 + 网格滚动 + Tab 吸顶 + 每 Tab 独立下拉刷新
前端
CoderYanger1 小时前
Java EE 进阶:4.Spring Web MVC 入门(第一弹)
java·开发语言·前端·spring·面试·java-ee·mvc
用户2788607285671 小时前
fallback 会盖掉平台提示词:system、空数组和 systemAppend 的差别
前端·后端