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中音频wavesurfer.js的使用方法
Feb 20 Vue.js
Vue实现指令式动态追加小球动画组件的步骤
Dec 18 Vue.js
vue 导航守卫和axios拦截器有哪些区别
Dec 19 Vue.js
vue中activated的用法
Jan 03 Vue.js
vuex的使用步骤
Jan 06 Vue.js
vue form表单post请求结合Servlet实现文件上传功能
Jan 22 Vue.js
使用vue3重构拼图游戏的实现示例
Jan 25 Vue.js
详解Vue3.0 + TypeScript + Vite初体验
Feb 22 Vue.js
vue实现倒计时功能
Mar 24 Vue.js
解决vue $http的get和post请求跨域问题
Jun 07 Vue.js
详细聊聊vue中组件的props属性
Nov 02 Vue.js
vue3 自定义图片放大器效果的示例代码
Jul 23 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
PHP图像裁剪缩略裁切类源码及使用方法
2016/01/07 PHP
PHP中strpos、strstr和stripos、stristr函数分析
2016/06/11 PHP
php显示页码分页类的封装
2017/06/08 PHP
PHP封装cURL工具类与应用示例
2019/07/01 PHP
会自动逐行上升的文本框
2006/06/30 Javascript
jQuery 表单验证插件formValidation实现个性化错误提示
2009/06/23 Javascript
jquery 简短右键菜单 多浏览器兼容
2010/01/01 Javascript
javascript实现yield的方法
2013/11/06 Javascript
javascript实现随机生成DIV背景色
2016/06/20 Javascript
微信小程序实现自定义加载图标功能
2018/07/19 Javascript
在vue项目中集成graphql(vue-ApolloClient)
2018/09/08 Javascript
使用NestJS开发Node.js应用的方法
2018/12/03 Javascript
Vue+Bootstrap收藏(点赞)功能逻辑与具体实现
2020/10/22 Javascript
解决Antd 里面的select 选择框联动触发的问题
2020/10/24 Javascript
js实现复制粘贴的两种方法
2020/12/04 Javascript
[01:19:35]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第二局
2016/03/05 DOTA
Python中import导入上一级目录模块及循环import问题的解决
2016/06/04 Python
解决已经安装requests,却依然提示No module named requests问题
2018/05/18 Python
基于数据归一化以及Python实现方式
2018/07/11 Python
Pycharm更换python解释器的方法
2018/10/29 Python
python的pstuil模块使用方法总结
2019/07/26 Python
解决Django no such table: django_session的问题
2020/04/07 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
2020/11/17 Python
关于css兼容性问题及一些常见问题汇总
2016/05/03 HTML / CSS
Spartoo西班牙官网:法国时尚购物网站
2018/03/27 全球购物
办公室内勤工作职责
2013/12/11 职场文书
英语自荐信常用语句
2013/12/13 职场文书
写给老婆的检讨书
2014/02/21 职场文书
自愿离婚协议书范本
2014/09/13 职场文书
迁户口计划生育证明
2014/10/19 职场文书
整改报告格式
2014/11/06 职场文书
先进集体申报材料
2014/12/25 职场文书
监察建议书
2015/02/04 职场文书
2015年社区中秋节活动总结
2015/03/23 职场文书
红领巾广播站广播稿
2015/08/19 职场文书
《三国志》赏析
2019/08/27 职场文书