Vue ​v-model相关知识总结


Posted in Vue.js onJanuary 28, 2021

​v-model是Vue的一个指令,它提供了input和form数据之间或两个组件之间的双向数据绑定。

这在Vue开发中是一个简单的概念,但是v-model的真正威力需要一些时间才能理解。

到本教程结束时,你将了解v-model的所有不同用例,并学习如何在自己的项目中使用它。

准备好了吗?

我也是。让我们编写代码。

什么是v-model?

正如我们刚才讨论的,v-model是一个我们可以在模板代码中使用的指令。指令是一个模板令牌,它告诉Vue我们想要如何处理DOM。

v-model告诉Vue我们想要在模板中的值和数据属性中的值之间创建一个双向数据绑定。

使用v-model的一个常见用例是在设计form和input时。我们可以使用它使DOM input元素能够修改Vue实例中的数据。

让我们看一个在文本输入上使用v-model的简单示例。

<template>
 <div>
  <input 
   type='text'
   v-model='value'
  />
  <p> Value: {{ value }} </p>
 </div>
</template>

<script>
export default {
 data() {
  return {
   value: 'Hello World' 
  }
 }
}
</script>

当我们在文本输入中输入时,我们会看到我们的data属性发生了变化。

v-model和v-bind的区别?

v-bind指令通常会与v-model切换。

两者的区别在于v-model提供了双向数据绑定。

在我们的例子中,这意味着如果我们的数据改变了,我们的输入也会改变,如果我们的输入改变了,我们的数据也会改变。

然而,v-bind只以一种方式绑定数据。

当你在你的应用中创建一个清晰的单向数据流时,这是非常有用的。但是,在v-model和v-bind之间选择时必须小心。

v-model的修饰符

Vue提供了两个修饰符,允许我们更改v-model的功能。

每一个都可以像这样加起来,甚至可以连接在一起。

<input 
 type='text'
 v-model.trim.lazy='value'
/>

.lazy

默认情况下,v-model在每个输入事件上与Vue实例(数据属性)的状态同步。这包括得到,失去焦点等等。

lazy修饰符修改了我们的v-model,所以它只在更改事件之后同步。

这减少了v-model试图与Vue实例同步的次数——在某些情况下,还可以提高性能。

.number

通常,我们的输入将自动将输入转为字符串—即使我们将输入是数字。

确保将值作为数字处理的一种方法是使用. number修饰符。

根据Vue文档,如果输入发生变化,并且parseFloat()无法解析新值,那么将返回输入的最后一个有效值。

<input 
 type='number'
 v-model.number='value'
/>

.trim

与大多数编程语言中的trim方法类似,.trim修饰符在返回值之前删除开头或结尾的空白。

在自定义组件中使用v-model

好了,现在我们已经了解了form/input内部的v-model的基本知识,让我们看看v-model的一个有趣用法——在组件之间创建双向数据绑定。

在Vue中,数据绑定有两个主要步骤:

从父节点传递数据

从子组件发出事件以更新父组件

在自定义组件上使用v-model可以让我们传递一个prop,用一个指令来处理一个事件。

<custom-text-input v-model="value" />
<!-- IS THE SAME AS -->
<custom-text-input 
  :modelValue="value"
  @update:modelValue="value = $event"
/>

好吧,这到底是什么意思?

让我们继续使用v-model表单的例子,并使用名为CustomTextInput.vue的自定义文本输入。

使用v-model传递的值的默认名称是modelValue——我们将在示例中使用这个名称。

但是,我们可以像这样传递一个定制的模型名称。

<custom-text-input v-model:name="value" />

注意:当我们使用自定义模型名称时,所发出方法的名称将被更新:name

下面是来自Vue文档的一张图来总结它。

Vue ​v-model相关知识总结

使用自定义组件中的v-model

我们已经设置好了父组件,所以让我们从子组件访问它。

在CustomTextInput.vue中,我们必须做两件事:

  • 接受我们的v-model值作为prop
  • 当我们的输入发生变化时,触发一个更新事件

好的——让我们首先在脚本中声明它是prop。

export default {
 props: {
  modelValue: String,
 }
}

接下来,让我们创建我们的模板,将值设置为modelValue prop,只要有输入事件,我们就通过update:modelValue发出新值。

<template>
 <div>
  <label> First Name </label>
  <input 
   type='text'
   placeholder='Input'
   :value='modelValue'
   @input='$emit("update:modelValue", $event.target.value)'
  />
 </div>
</template>

使用v-model

好吧!

我们已经介绍了一个使用v-model在两个组件之间绑定数据的基本示例。

让我们看一些使用v-model指令的更高级的方法。

对一个组件多次使用v-model

v-model并不局限于每个组件只能使用一次。

要多次使用v-model,我们只需要确保为每个prop唯一命名,并在子组件中正确访问它。

让我们在lastName中添加第二个v-model。

在我们的父组件中:

<template>
 <div>
  <custom-text-input 
   v-model='value' 
   v-model:lastName='lastName'
  />
  <p> Value: {{ value }} </p>
  <p> Last Name: {{ lastName }} </p>
 </div>
</template>

<script>
import CustomTextInput from './CustomTextInput.vue'

export default {
 components: {
  CustomTextInput,
 },
 data() {
  return {
   value: 'Matt',
   lastName: 'Maribojoc'
  }
 }
}
</script>

然后,在子组件内部:

<template>
 <div>
  <label> First Name </label>
  <input 
   type='text'
   :value='modelValue'
   placeholder='Input'
   @input='$emit("update:modelValue", $event.target.value)'
  />
  <label> Last Name </label>
  <input 
   type='text'
   :value='lastName'
   placeholder='Input'
   @input='$emit("update:lastName", $event.target.value)'
  />
 </div>
</template>

<script>
export default {
 props: {
  lastName: String,
  modelValue: String,
 }
}
</script>

V-model的自定义修饰符

正如我们所讨论的,Vue中内置了一些修饰符。但总有一天,我们会想要添加我们自己的。

假设我们想要创建一个修饰符来删除输入中的所有空格。我们称之为无空格。

<custom-text-input 
 v-model.no-whitespace='value' 
 v-model:lastName='lastName'
/>

在我们的输入组件中,我们可以使用prop来捕获修饰符。自定义修饰符的名称是nameModifiers。

props: {
 lastName: String,
 modelValue: String,
 modelModifiers: {
  default: () => ({})
 }
}

好的,我们要做的第一件事是改变@input处理器来使用一个自定义方法。我们可以称它为emitValue,它将接受正在编辑的属性和事件对象的名称。

<label> First Name </label>
<input 
   type='text'
   :value='modelValue'
   placeholder='Input'
   @input='emitValue("modelValue", $event)'
/>

在emitValue方法中,在调用$emit之前,我们要检查修饰符。如果no-whitespace修饰符为true,则可以在将其发送给父对象之前修改该值。

emitValue(propName, evt) {
 let val = evt.target.value
 if (this.modelModifiers['no-whitespace']) {
  val = val.replace(/\s/g, '')
 }
 this.$emit(`update:${propName}`, val)
}

结论

希望你知道了一些有关v-model的新知识。

在它的基本用例(如表单和输入数据)中,v-model是一个非常简单的概念。然而,当我们开始创建自定义组件并处理更复杂的数据时,我们可以真正了解v-model。

以上就是Vue ​v-model相关知识总结的详细内容,更多关于Vue ​v-model的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
使用vue编写h5公众号跳转小程序的实现代码
Nov 27 Vue.js
对vue生命周期的深入理解
Dec 03 Vue.js
SpringBoot+Vue 前后端合并部署的配置方法
Dec 30 Vue.js
vue3自定义dialog、modal组件的方法
Jan 04 Vue.js
基于vuex实现购物车功能
Jan 10 Vue.js
vue-resource 拦截器interceptors使用详解
Jan 18 Vue.js
详解Vue3.0 + TypeScript + Vite初体验
Feb 22 Vue.js
详解vite+ts快速搭建vue3项目以及介绍相关特性
Feb 25 Vue.js
解决vue $http的get和post请求跨域问题
Jun 07 Vue.js
一篇文章学会Vue中间件管道
Jun 20 Vue.js
深入讲解Vue中父子组件通信与事件触发
Mar 22 Vue.js
vue打包时去掉所有的console.log
Apr 10 Vue.js
Vue 数据响应式相关总结
Jan 28 #Vue.js
vue.js实现点击图标放大离开时缩小的代码
Jan 27 #Vue.js
vscode自定义vue模板的实现
Jan 27 #Vue.js
vue+echarts实现中国地图流动效果(步骤详解)
Jan 27 #Vue.js
vue3 watch和watchEffect的使用以及有哪些区别
Jan 26 #Vue.js
vue实现轮播图帧率播放
Jan 26 #Vue.js
vue 组件基础知识总结
Jan 26 #Vue.js
You might like
PHP中的日期处理方法集锦
2007/01/02 PHP
攻克CakePHP系列三 表单数据增删改
2008/10/22 PHP
php操作excel文件 基于phpexcel
2010/07/02 PHP
php数组相加 array(“a”)+array(“b”)结果还是array(“a”)
2012/09/19 PHP
解析php中获取系统信息的方法
2013/06/25 PHP
PHP提示Warning:phpinfo() has been disabled函数禁用的解决方法
2014/12/17 PHP
在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的运行环境
2016/04/04 PHP
php array_map使用自定义的函数处理数组中的每个值
2016/10/26 PHP
php上传excel表格并获取数据
2017/04/27 PHP
解决Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]
2020/04/06 PHP
写出更好的JavaScript程序之undefined篇(中)
2009/11/23 Javascript
jQuery让控件左右移动的三种实现方法
2013/09/08 Javascript
jquery性能优化高级技巧
2015/08/24 Javascript
JavaScript对象参数的引用传递
2016/01/14 Javascript
seajs学习之模块的依赖加载及模块API的导出
2016/10/20 Javascript
javascript阻止事件冒泡和浏览器的默认行为
2017/01/21 Javascript
求js数组的最大值和最小值的四种方法
2017/03/03 Javascript
json2.js 入门教程之使用方法与实例分析
2017/09/14 Javascript
JavaScript的setter与getter方法
2017/11/29 Javascript
vue-resource post数据时碰到Django csrf问题的解决
2020/03/13 Javascript
[03:02]生活中的Dendi之野外度假篇
2016/08/09 DOTA
[02:46]解说DC:感谢430陪伴我们的DOTA2国际邀请赛岁月
2016/06/29 DOTA
在Python中用split()方法分割字符串的使用介绍
2015/05/20 Python
python 转换 Javascript %u 字符串为python unicode的代码
2016/09/06 Python
Python生成密码库功能示例
2017/05/23 Python
python面向对象_详谈类的继承与方法的重载
2017/06/07 Python
django 按时间范围查询数据库实例代码
2018/02/11 Python
python数值基础知识浅析
2019/11/19 Python
Biblibili视频投稿接口分析并以Python实现自动投稿功能
2021/02/05 Python
英国天然有机美容护肤品:Neal’s Yard Remedies
2018/05/05 全球购物
如何在存储过程中使用Loop
2016/01/05 面试题
毕业自我鉴定总结
2014/03/24 职场文书
人力资源管理毕业求职信
2014/08/05 职场文书
领导班子整改措施
2014/10/24 职场文书
考试没考好检讨书(精选篇)
2014/11/16 职场文书
雄兵连:第三季先行图公开,天使恶魔联合,银河之力的新力量
2021/06/11 国漫