【Vue】玩转v-model

v-model修饰符

.lazy

  • 默认 v-model 是输入框内容每次改变都会更新数据
  • 加了 .lazy 后,只有在输入框失去焦点时才会更新数据
  • 例如输入用户名,只有离开输入框时才保存用户名
ini 复制代码
// 输入的时候不会立即加载,等失去焦点时会加载
<input v-model.lazy="msg" />

.number

  • 默认输入框输入的都是字符串
  • 加了 .number 后,输入的值会自动转成数字类型
  • 例如输入年龄,得到的直接是数字而不是字符串
lua 复制代码
<input type="number" v-model.number="xxx"> </input>

我们一输入数字在输入框中默认就变成字符串数字了,v-model.number就是vue默认给我们进行转换,输入的是纯数字~

.trim

  • 默认输入框输入的值会包含空格
  • 加了 .trim 后,输入值前后空格会自动删除
  • 例如输入姓名,张三 和 张三结果是一样的(前后空格自动删除拉)
ini 复制代码
<input v-model.number="age" />

过滤器

filters过滤器已从Vue 3.0中删除,不再支持了,这里可以作为了解进行学习

vue3要精简代码,过滤器能够实现的用methods和computed也能够实现

什么是过滤器?

过滤器可以对绑定的数据进行格式化后再展示,它本质上是一个可以接收数据、进行处理并返回结果的函数我们可以在插值表达式或 v-bind 绑定中使用过滤器对显示的数据进行格式化

使用过滤器需要注意的几点:

  • 过滤器函数要以value或其他参数来接收数据
  • 在模板中使用{{ data | filter }}格式调用或者使用v-bind绑定data | filter过滤器
  • 过滤器可以链式调用{{ data | filterA | filterB }}
  • 过滤器要在filters属性中定义,不要与methods混淆
  • 过滤器适用于简单的逻辑,它能做的用methods、computed也能够做到

下面的例子会把message作为参数传给filterName,得到返回值后替换整个插值表达式

  • filterName不写括号也会把message作为参数传进去!
js 复制代码
{{ message | filterName }}
// 绑定一个var变量,同时通过formatId过滤器进行格式化
<div :id="rawId | formatId"></div>
javascript 复制代码
// 比如rawId是下面的这个时间戳
rawId = 1564984456888 

formatId(value) {
  return 'id-' + value
}

// div的id属性将被设置为 'id-1564984456888'

uppercase 把文本转换为全uppercase

js 复制代码
{{ 'hello' | uppercase }} // 输出 'HELLO'

number 格式化数字

js 复制代码
{{ 123456 | number }} // 输出 123,456

自定义过滤器举例:

js 复制代码
// 在组件中定义
filters: {
  formatDate(value) {
    // 格式化日期
    return value.toLocaleString()
  }
}

// 使用
<p>今天是 {{date | formatDate}},今天也要开心呀</p>

过滤器可以串联使用:

message传给filterA,结果返回再传给filterB

复制代码
{{ message | filterA | filterB }}

过滤器函数也可以接收额外参数:

scss 复制代码
{{ value | filter(arg1, arg2) }}

拓展

js 复制代码
filters:{
        fmtTime(){
          return this.time+1
        }
      }

A:这样写有问题吗?

Q:当然有问题了!

我们可能会说,啥都没给怎么判断有没有问题?

实际上当我们看到this的时候就证明错了!

过滤器函数中是没有this指向的,应该通过第一个参数来访问要过滤的数据

js 复制代码
fmtTime(value){
  return value + 1  
}

结果:66

为什么使用var1呢?我们不能用类似 var、function、for等JS 原生关键字作为变量名,以免产生歧义或报错问题

不信我们试试,我就是忘了,报错后才改回来的~

结合ES6语法使用

javascript 复制代码
// 在组件的filters中定义过滤器
filters: {
  formatDate(value, format='YYYY-MM-DD') {
    // format有默认值 
    
    // 根据format格式化日期
  }
}

<p>
  {{ date | formatDate }} 
   // 输出 '2023-08-25' (默认格式)
  
  {{ date | formatDate('YYYY/MM/DD') }}
  // 输出 '2023/08/25' (传入覆盖默认值)
</p>

这里我们在格式化日期的过滤器函数中,利用ES6的默认参数为format设置了一个默认值'YYYY-MM-DD'

在使用过滤器时,如果不传递参数,会使用这个默认的格式;如果传递了参数,则参数值会覆盖默认值

ES6语法拓展

这里拓展下ES6语法,在ES6中,我们可直接在函数参数后面指定默认值,简化函数的调用比如:

javascript 复制代码
function hello(x = 'hello', y = 'world') {
  console.log(x, y);
}

hello(); // 输出 'hello world'

hello('hi'); // 输出 'hi world'

hello(undefined, 'everyone'); // 输出 'hello everyone'

hello('hey', '小索奇'); // 输出 'hey 小索奇'

// 传递超过两个参数,额外的参数会被忽略
hello('hi', 'everyone', 'extra', 'parameters'); // 输出 'hi everyone'

只有没有传值的参数才会使用默认值,如果调用hello时没有传入参数,或者传入了undefined,x会自动获取默认值'default value'

这样就省去了对参数是否为undefined的检查~

参数默认值可以简化 undefined 的判断:

javascript 复制代码
// 之前的写法
function hello(x) {
  x = x || 'hello'; 
}

// ES6默认值写法
function hello(x = 'hello') {

}

还可以结合解构使用默认值:

javascript 复制代码
function hello({x = 1, y = 2} = {}) {
  // ...
}
  • 另外要注意,参数默认值不是传值,而是每次都重新计算默认值表达式的值

  • 参数默认值的位置要在解构赋值默认值的后面,否则会报语法错误

相关推荐
崔庆才丨静觅44 分钟前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60612 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了2 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅2 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅2 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅2 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment3 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅3 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊3 小时前
jwt介绍
前端
爱敲代码的小鱼3 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax