Vue 的 v-model用法实例


Posted in Vue.js onNovember 23, 2020

Vue 框架早已经不是 MVVM(Mode-View-View-Model) 双向绑定了。早在 Vue 1.0 时代,Vue 在刚出世的时候的确是 MVVM 双向绑定。自 Vue 2.0 以来,Vue 就不再是双向绑定了,而是像 React 一样是单向绑定 MV(Model-View)了。但是,在 Vue 中仍保留了双向绑定的接口,v-model 就是。

1. 基本用法

<template>
 <div id="app">
  <input v-model="x">
  {{x}}
 </div>
</template>

<script>
export default {
 data(){
  return {
   x: 'init'
  }
 }
}

在 JS 中修改 x 的值,input 输入框里也会随之改变。同样地,在页面中的 input 输入框内手动输入值,变量 x 的值也会随之改变。对象里的变量改变会影响视图的 input 的改变,视图中 input 的改变会影响对象里变量 x 值的改变。这就是双向绑定(Model-View-View-Model)。

2. v-model

实质上述使用 v-model 的代码等价于如下代码:

<template>
 <div id="app">
  <input :value="x" @input="x = $event.target.value">
  {{x}}
 </div>
</template>

<script>
export default {
 data(){
  return {
   x: 'init'
  }
 }
}
</script>

v-model 帮我们做的事就是,为 input 的 value 值设置一个动态绑定,然后在输入框的 input 事件触发后实时修改动态绑定的 value 的变量值。因此 v-model 实质是上述方式的语法糖。

$event 是原生 DOM 事件里的 event 事件对象。

3. v-model 的修饰符

所有修饰符都是起一个辅助的作用,其实可以在函数里自己判断条件实现。.lazyv-model 默认监听的是输入框的input 事件,原生 DOM 的input 事件就是记录实时的输入变化值。但是,我们有时不需要实时记录结果,只需要记录最终输入的结果值就可以了。

input 的原生 DOM 事件中还有一个change 事件,该事件是在输入框失去焦点时 或 按下回车键时 执行的。v-model 里以.lazy 修饰符的方式切换至该监听模式。

<template>
 <div id="app">
  <input v-model.lazy="x">
  {{x}}
 </div>
</template>等价于:<template>
 <div id="app">
  <input :value="x" @change="x = $event.target.value">
  {{x}}
 </div>
</template>

.number.number修饰符是在输入内容改变后进行变量赋值时,自动使用 parseFloat() 函数将其变成数字。使用该修饰符时变量的初始值必须是数字。

<template>
 <div id="app">
  <input v-model.number="x">
  {{x}}
 </div>
</template>

<script>
export default {
 data(){
  return {
   x: 0
  }
 }
}
</script>
  • .trim

.trim修饰符是将输入的内容改变后进行变量赋值时,自动忽略和去除前后的空格。更为精准地记录输入的字符串内容。

<template>
 <div id="app">
  <input v-model.trim="x">
  {{x}}
 </div>
</template>

<script>
export default {
 data(){
  return {
   x: 'init'
  }
 }
}
</script>

4. 自定义输入框的 v-modelv-model

的基本用法仅仅适用于原生的输入框元素 ,对于用户自己封装的输入框,可以用如下方式使用 v-model。当用在组件上时,v-model 的实质如下:

<custom-input v-model="x"></custom-input>

等价于:

<custom-input :value="x" @input="x = $event"></custom-input>

因此,在自定义表单组件里的写法如下:

<template>
  <div class="wrapper">
    <input :value="value" @input="$emit('input', $event.target.value)">
  </div>
</template>

<script>
export default {
  props: {
    value: {
      type: String
    }
  }
}
</script>

<style scoped>
  .wrapper{
    border: 2px solid blue;
    display: inline-block;
  }
  .wrapper input{
    color: red;
  }
</style>
<template>
 <div id="app">
  <MyInput v-model="x"/>
  {{x}}
 </div>
</template>

<script>
import MyInput from './components/MyInput'
export default {
 data(){
  return {
   x: 0
  }
 },
 components:{
  MyInput
 }
}
</script>

补充:若想在自定义组件里面的原生输入框也使用 v-model,可以根据组件 v-model 的实质,使用计算属性的赋值方式为=使用。

以上就是Vue 的 v-model用法实例的详细内容,更多关于vue v-model的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
一篇超完整的Vue新手入门指导教程
Nov 18 Vue.js
VUE+Element实现增删改查的示例源码
Nov 23 Vue.js
vue实现表格合并功能
Dec 01 Vue.js
vue 基于abstract 路由模式 实现页面内嵌的示例代码
Dec 14 Vue.js
Vue如何跨组件传递Slot的实现
Dec 14 Vue.js
聊聊vue 中的v-on参数问题
Jan 29 Vue.js
如何理解Vue前后端数据交互与显示
May 10 Vue.js
Vue通过懒加载提升页面响应速度
May 10 Vue.js
Vue全家桶入门基础教程
May 14 Vue.js
vue实现列表拖拽排序的示例代码
Apr 08 Vue.js
Vue操作Storage本地化存储
Apr 29 Vue.js
VUE解决跨域问题Access to XMLHttpRequest at
May 06 Vue.js
VUE+Element实现增删改查的示例源码
Nov 23 #Vue.js
Vue实现购物小球抛物线的方法实例
Nov 22 #Vue.js
vue自定义插件封装,实现简易的elementUi的Message和MessageBox的示例
Nov 20 #Vue.js
详解vue 组件注册
Nov 20 #Vue.js
vue-drawer-layout实现手势滑出菜单栏
Nov 19 #Vue.js
Vue 打包的静态文件不能直接运行的原因及解决办法
Nov 19 #Vue.js
如何使用 vue-cli 创建模板项目
Nov 19 #Vue.js
You might like
dedecms 批量提取第一张图片最为缩略图的代码(文章+软件)
2009/10/29 PHP
PHP使用POP3读取邮箱接收邮件的示例代码
2020/07/08 PHP
document节点对象的获取方式示例介绍
2013/12/24 Javascript
简单易用的倒计时js代码
2014/08/04 Javascript
基于jquery实现在线选座订座之影院篇
2015/08/24 Javascript
js实现图片上传并正常显示
2015/12/19 Javascript
利用AJAX实现WordPress中的文章列表及评论的分页功能
2016/05/17 Javascript
全面接触神奇的Bootstrap导航条实战篇
2016/08/01 Javascript
基于Vue.js实现数字拼图游戏
2016/08/02 Javascript
bootstrap suggest下拉框使用详解
2017/04/10 Javascript
JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)
2017/06/09 Javascript
JavaScript中Object值合并方法详解
2017/12/22 Javascript
vue select组件的使用与禁用实现代码
2018/04/10 Javascript
node-red File读取好保存实例讲解
2019/09/11 Javascript
JavaScript实现动态留言板
2020/03/16 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
解决vue中el-tab-pane切换的问题
2020/07/19 Javascript
vue watch监控对象的简单方法示例
2021/01/07 Vue.js
详解JavaScript中的this指向问题
2021/02/05 Javascript
复制粘贴功能的Python程序
2008/04/04 Python
Python中用startswith()函数判断字符串开头的教程
2015/04/07 Python
从头学Python之编写可执行的.py文件
2017/11/28 Python
Python 编码规范(Google Python Style Guide)
2018/05/05 Python
使用Django连接Mysql数据库步骤
2019/01/15 Python
python实现贪吃蛇小游戏
2020/03/21 Python
pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率
2020/01/02 Python
法国娇韵诗官方旗舰店:Clarins是来自法国的天然护肤品牌
2018/06/30 全球购物
美国运动鞋和服装网上商店:YCMC
2018/09/15 全球购物
Linux Interview Questions For software testers
2012/06/02 面试题
面向对象设计的原则是什么
2013/02/13 面试题
旅游项目开发策划书
2014/01/18 职场文书
《鸟的天堂》教学反思
2014/02/27 职场文书
党员干部公开承诺书
2014/03/26 职场文书
赞美老师的演讲稿
2014/05/22 职场文书
相亲大会策划方案
2014/06/05 职场文书
带你学习MySQL执行计划
2021/05/31 MySQL