vue.js数据绑定操作详解


Posted in Javascript onApril 23, 2018

本文实例讲述了vue.js数据绑定操作。分享给大家供大家参考,具体如下:

数据绑定

响应式的数据绑定系统。建立绑定之后,DOM将和数据保持同步,无须手动维护DOM。使代码能够更加简洁易懂、提升效率。

数据绑定语法

1.文本插值

{{ }}Mustache标签

<span>Hello {{ name }}</span>
data:{
    name: 'vue'
}
== > Hello vue

单次插值

首次赋值后再更改vm实例属性值不会引起DOM的变化

<span v-once="name">{{ name }}</span>

2.HTML属性

Mustache标签{{ }}

<div v-bind:id="'id-'+id"></div>

简写:

<div :id="'id-'+id"></div>

3.绑定表达式

放在Mustache标签内的文本内容。除了直接输出属性值之外,一段绑定表达式可以由一个简单的JavaScript表达式和可选的一个或多个过滤器构成(不支持正则表达式,若需要复杂的转换,则使用过滤器或者计算属性来进行处理)。

{{ index + 1}}
{{ index == 0 ? 'a' : 'b' }}
{{name.split('').join('|') }}
{{ var a = 1 }} //无效

4.过滤器

vue.js允许在表达式后添加可选的过滤器,以管道符"|"指示。

{{ name | uppercase }} // Vue.js将name的值传入给uppercase这个内置的过滤器中(本质是一个函数),返回字符串的大写值。
{{ name | filterA | filterB }}  //多个过滤器链式使用
{{ name | filterA arg1 arg2 }} //传入多个参数

此时,filterA将name的值做为第一个参数,arg1,arg2做为第二、第三个参数传入过滤器函数中。

最终函数的返回值即为输出结果。arg1,arg2可以使用表达式,也可以加上单引号,直接传入字符串。

例如:

{{ name.split('') | limitBy 3 1 }} // ->u,e

过滤器limitBy可以接受两个参数,第一个参数是设置显示个数,第二个参数为可选,指从开始元素的数组下标。

vue.js内置的10个过滤器(Vue.js2.0中去除)

capitalize:字符串首字符转化为大写。
uppercase:字符串转化为大写。
lowercase:字符串转化为小写。
currency:参数为{String}[货币符号],{Number}[小数位],将数字转化成货币符号,并且会自动添加数字分节号。

{{ amount | currency '¥' 2 }} //若amount值为1000,则输出为¥1,000.00

pluralize:参数为{String}single,[double,triple],字符串复数化。

<p v-for="c in count">{{ c | pluralize 'item' }} {{ c | pliralize 'st' 'nd' 'rd' 'th' }} </p>
//输出结果:
1item 1st
2items 2nd
3items 3rd
4items 4th

json:参数为{Number}[indent]空格缩进数,将json对象数据输出成符合json格式的字符串。

debounce:传入值必须是函数,参数可选,为{Number}[wait],即延时时长。作用是当调用函数n毫秒后,才会执行该动作。

<input v-on:keyup="onKeyup | debounce 500"> //input元素上监听了keyup事件,并且延迟500ms触发

limitBy:传入值必须是数组,参数为{Number}limit{Number}[offset],limit为显示个数,offset为开始显示数组下标。

<div v-for="item in items | limitBy 10"></div> //items为数组,且只显示数组中的前十个元素

filterBy:传入值必须是数组,参数为{String | Function}targetStringOrFunction,即需要匹配的字符串或函数;"in"可选分隔符。{String}[...searchKeys],为检索的属性区域。

<p v-for="name in names | filterBy '1.0'">{{ name }}</p> //检索names数组中值包含1.0的元素

<p v-for="item in items | filterBy '1.0' in 'name'">{{ item | json }}</p> //检索items中元素属性name值为1.0的元素输出。检索区域也可以为数组,即in [name,version],在多个属性中进行检索。
//输出结果
vue1.0
{"name":"vue1.0","version":"1.0"}

使用自定义的过滤函数,函数可以在选项methods中定义

<p v-for="item in items | filterBy customFilter"
  methods:{
    cuestomFilter:function(item){
      if(item.name) return true;  //检索所有元素中包含name属性的元素
    }
  }

orderBy:传入值必须是数组,参数为{String|Array|Function}sortKeys,即指定排序的策略。

单个键名:

<p v-for="item in items | orderBy 'name' -1">{{ item.name}}</p> //items数组中以键名name进行降序排列

多个键名:

<p v-for="item in items | orderBy [name,version]">{{item.name}}</p> //使用items里的两个键名进行排序

自定义排序函数:

<p v-for="item in items | orderBy customOrder">{{item.name}}</p>
methods:{
  customOrder: function(a,b){
    return parseFloat(a.version) > parseFloat(b.version) //对比item中version的值的大小进行排序
  }
}

5.指令

指令的值限定为绑定表达式,即当表达式的值发生改变时,会有些特殊行为作用到绑定的DOM上。

参数:src为参数

<img v-bind:src="avatar" /> <==>  <img src="{{avatar}}" />

修饰符:以半角句号.开始的特殊后缀,用于表示指令应该以特殊方式绑定。

<button v-on:click.stop="doClick"></button> //stop:停止冒泡。相当于调用了e.stopPropagagation().

计算属性

避免在模板中加入过重的业务逻辑,保证模版的结构清晰和可维护性。

1.基础例子

var vm = new Vue({
    el: '#app',
    data: {
      firstName:'Gavin',
      lastName:'CLY'
    },
    computed: {
      fullName:function(){
        //this指向vm实例
        return this.firstName + ' ' + this.lastName;
      }
    }
})
<p>{{ firstName }}</p>  //Gavin
<p>{{ lastName }}</p>  //CLY
<p>{{ fullName }}</p>  //Gavin CLY

注:此时对vm.firstNamevm.lastName进行修改,始终会影响vm.fullName

2.Setter

更新属性时带来便利

var vm = new Vue({
    el:'#el',
    data:{
      cents:100
    },
    computed:{
      price:{
        set:function(newValue) {
          this.cents = newValue * 100;
        },
        get:function(){
          return (this.cents / 100).toFixed(2);
        }
      }
    }
})

表单控件

v-model:对表单元素进行双向数据绑定,在修改表单元素值时,实例vm中对应的属性值也同时更新,反之亦然。

var vm = new Vue({
    el:'#app',
    data: {
      message: '',
      gender: '',
      cheched: '',
      multiChecked: '',
      a: 'checked',
      b: 'checked'
    }
})

1. Text

输入框示例,用户输入的内容和vm.message直接绑定:

<input type="text" v-model="message" />
<span>Your input is : {{ message }} </span>

2. Radio

单选框示例:

<label><input type="radio" value="male" v-model="gender">男</lable>
<label><input type="radio" value="famale" v-model="gender">女</lable>
<p>{{ gender }}</p> //显示的是value值

3.Checkbox

单个勾选框,v-model即为布尔值,此时Input的value并不影响v-model的值。

<input type="checkbox" v-model="checked" />
<span>checked: {{ checked }} </span> //显示的是true/false

多个勾选框,v-model使用相同的属性名称,且属性为数组。

<label><input type="checkbox" value="1" v-model="multiChecked">1</label>
<label><input type="checkbox" value="1" v-model="multiChecked">2</label>
<label><input type="checkbox" value="1" v-model="multiChecked">3</label>
<p>MultiChecked:{{ multiChecked.join{'|'} }}</p> //multiChecked:1|2

4.Select

单选

<select v-model="selected">
  <option selected>A</option>
  <option>B</option>
  <option>C</option>
</select>
<span>Selected: {{ selected }}</span>

多选

<select v-model="multiSelected" multiple>
  <option selected>A</option>
  <option>B</option>
  <option>C</option>
</select>
<span>MultiSelected: {{ multiSelected.join('|') }}</span>

5.绑定value

通过v-bind实现,表单控件的值绑定到Vue市里的动态属性上。

Checkbox

<input type="checkbox" v-model="checked" v-bind:true-value="a" v-bind:false-value="b" />

选中:

vm.checked == vm.a  //=> true

未选中:

vm.checked == vm.b //=>true

Radio

<input type="radio" v-model="checked" v-bind:value="a" >

选中:

vm.checked == vm.a //=> true

3.Select Options

<select v-model="selected">
    <!-- 对象字面量 -->
    <option v-bind:value="{ number:123}">123</option>
</select>

选中:

typeof vm.selected //=> object
vm.selected.number //=> 123

6.参数特性

.lazy:默认情况下,v-model在input事件中同步输入框与数据,加lazy属性后会在change事件中同步。

<!-- 在 "change" 而不是 "input" 事件中更新 -->
<input v-model.lazy="msg" >

.number:自动将用户输入转为Number类型,如果原值转换结果为NaN,则返回原值。

<input v-model.number="age" type="number">

.trim:如果要自动过滤用户输入的首尾空格,可以添加 trim 修饰符到 v-model 上过滤输入

<input v-model.trim="msg">

Class与Style绑定

1.Class绑定

对象语法:v-bind:class接受参数是一个对象,而且可以与普通的class属性共存。

<div class="tab" v-bind:class="{'active':active,'unactive':!active}"></div>

vm实例中需要包含:

data:{
  active:true
}

渲染结果为:

<div class="tab active"></div>

数组语法:v-bind:class也接受数组作为参数。

<div v-bind:class="[classA,classB]"></div>

vm实例中需要包括:

data:{
  classA:"class-a",
  classB:"class-b"
}

渲染结果为:

<div class="class-a class-b"></div>

使用三元表达式切换数组中的class

<div v-bind:class="[classA,isB?classB:""]"></div>

vm.isB = false

则渲染结果为

<div class="class-a"></div>

2.内联样式绑定(style属性绑定)

对象语法:直接绑定符合样式格式的对象。

<div v-bind:style="alertStyle"></div>

vm实例中包含:

data:{
  alertStyle:{
    color: 'red',
    fontSize: '2px'
  }
}
<div v-bind:style="{fontSize:alertStyle.fontSize,color:'red'}"></div>

数组语法:v-bind:style允许将多个样式对象绑定到同一元素上。

<div v-bind:style="[ styleObjectA,styleObjectB]" .></div>

3.自动添加前缀

在使用transform这类属性时,v-bind:style会根据需要自动添加厂商前缀。:style在运行时进行前缀探测,如果浏览器版本本省就不支持不加前缀的css属性,那就不会添加。

希望本文所述对大家vue.js程序设计有所帮助。

Javascript 相关文章推荐
JavaScript中valueOf函数与toString方法深入理解
Dec 02 Javascript
js阻止事件追加的具体实现
Oct 15 Javascript
原生js实现tab选项卡切换
Mar 23 Javascript
基于jQuery实现顶部导航栏功能
Dec 27 Javascript
Bootstrap常用组件学习(整理)
Mar 24 Javascript
详解JavaScript中return的用法
May 08 Javascript
javascript 封装Date日期类实例详解
May 28 Javascript
从vue基础开始创建一个简单的增删改查的实例代码(推荐)
Feb 11 Javascript
Vue监听数据渲染DOM完以后执行某个函数详解
Sep 11 Javascript
解决IOS端微信H5页面软键盘弹起后页面下方留白的问题
Jun 05 Javascript
vue下使用nginx刷新页面404的问题解决
Aug 02 Javascript
bootstrap table实现iview固定列的效果实例代码详解
Sep 30 Javascript
jQuery+ajax实现动态添加表格tr td功能示例
Apr 23 #jQuery
再谈Angular4 脏值检测(性能优化)
Apr 23 #Javascript
微信小程序之swiper轮播图中的图片自适应高度的方法
Apr 23 #Javascript
vue.js中实现登录控制的方法示例
Apr 23 #Javascript
JS中获取 DOM 元素的绝对位置实例详解
Apr 23 #Javascript
Vue前端开发规范整理(推荐)
Apr 23 #Javascript
Vue 中mixin 的用法详解
Apr 23 #Javascript
You might like
PHP 中的批处理的实现
2007/06/14 PHP
PHP IN_ARRAY 函数使用注意事项
2010/07/24 PHP
PHP实现的分页类定义与用法示例
2017/07/05 PHP
PHP获取访问设备信息的方法示例
2019/02/20 PHP
控制打印时页眉角的代码
2007/02/08 Javascript
几款极品的javascript压缩混淆工具
2007/05/16 Javascript
Jquery中&quot;$(document).ready(function(){ })&quot;函数的使用详解
2013/12/30 Javascript
JavaScript使用指针操作实现约瑟夫问题实例
2015/04/07 Javascript
老司机带你解读jQuery插件开发流程
2016/05/16 Javascript
jstree的简单实例
2016/12/01 Javascript
Bootstrap基本组件学习笔记之按钮组(8)
2016/12/07 Javascript
JS轮播图中缓动函数的封装
2020/11/25 Javascript
webpack之引入图片的实现及问题
2018/10/08 Javascript
详解@Vue/Cli 3 Invalid Host header 错误解决办法
2019/01/02 Javascript
详解JS取出两个数组中的不同或相同元素
2019/03/20 Javascript
JavaScript JSON数据处理全集(小结)
2019/08/15 Javascript
python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)
2014/02/24 Python
Python实现简单的多任务mysql转xml的方法
2017/02/08 Python
python3实现公众号每日定时发送日报和图片
2018/02/24 Python
python MySQLdb使用教程详解
2018/03/20 Python
python实现排序算法解析
2018/09/08 Python
python实现顺序表的简单代码
2018/09/28 Python
Django高级编程之自定义Field实现多语言
2019/07/02 Python
踩坑:pytorch中eval模式下结果远差于train模式介绍
2020/06/23 Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
2020/10/15 Python
为世界各地的女性设计和生产时尚服装:ROMWE
2016/09/17 全球购物
美国女士时尚珠宝及配饰购物网站:Icing
2018/07/02 全球购物
医药专业推荐信
2013/11/15 职场文书
学生自我鉴定模板
2013/12/30 职场文书
2014年应届大学生自我评价
2014/01/09 职场文书
信访工作者先进事迹
2014/01/17 职场文书
远程培训的心得体会
2014/09/01 职场文书
英语邀请函范文
2015/02/02 职场文书
党员自我评价范文2015
2015/03/03 职场文书
如何书写授权委托书?
2019/06/25 职场文书
适合毕业生创业的项目怎么找?
2019/08/08 职场文书