数据绑定

简单文本绑定

最简单也是最常用的数据绑定方法,通过使用{{}}标签来绑定数据:

var app = new Vue({el : '#app',data : {name: 'hengyumo'}
})

<span>Hello, this is {{name}}</span> --> Hello, this is hengyumo

通过app.name = 'xiaoli’可以实现数据的更新

使用{{* name }}可以实现单次插值,即数据只在首次赋值中起作用,而后续的更新不会引起变化。

vue2中使用v-once替代了{{* name }}的写法,即<span v-once='name'>{{name}}</span>

{{}}同样可以用在html元素的属性上,例如<h1 id="title-{{id}}">title-{{id}}</h1>
在vue2中用v-bind代替了这种写法:<h1 v-bind:id="'title-' + id">title-{{id}}</h1>
或者简写成<h1 :id="'title-' + id">title-{{id}}</h1>

示例:

<!DOCTYPE html>
<html>
<head><title>test data binding 1</title><script src='http://cdnjs.cloudflare.com/ajax/libs/vue/1.0.26/vue.min.js'></script>
</head>
<body><div id="app"><span>Hello, this is {{name}}</span><span>My name is {{* name }}</span><h1 id="title-{{id}}">title-{{id}}</h1></div>
</body><script type="text/javascript">var app = new Vue({el : '#app',data: {name: 'hengyumo',id: 0} })app.name = 'xiaoli'
</script>
</html>

结果:

f12查看dom:

表达式绑定

放在{{}}之中的除了最基本的数据之外,还可以是js表达式,下面是几个示例:

{{ i + 1 }}
{{ i == 0 ? 'yes': 'no' }}
{{ location.split('-') }}
{{ times.join('-') }}

注意只能是表达式而不能是语句,下面的示例是错误的:

{{ var name = 'xiaoli' }}
{{ if (ok) {return name} }}
过滤器

在表达式后边可以添加过滤器,用’|'来进行分隔,如:

{{ name | uppercase }} //返回字符串的大写值
{{ name | filter_1 | filter_2 }} //使用两个过滤器
{{ name | filter arg_1 arg_2 }} //使用arg_1和arg_2作为filter的参数
{{ name.split('') | limitBy 3 1 }} //返回name.split('')之后的1-4个数组元素

以下是vue1内置的10个过滤器:
① capitalize :字符串首字符转化成大写
② uppercase :字符串转化成大写
③ lowercase :字符串转化成小写
④ currency 参数为{String}[货币符号] ,{Number} [小数位],将数字转化成货币符号, 并且会自动添加数字分节号。例如:
{{ amount | currency ‘¥’ 2 }} // -> 若amount值为10000,则输出¥10,000.00
⑤ pluralize 参数为 {String} single, [double, triple],字符串复数化。如果接收的是一 个参数,那复数形式就是在字符串末尾直接加一个“s”。如果接收多个参数,则会被当成数组 处理,字符串会添加对应数组下标的值。如果字符串的个数多于参数个数,多出部分会都添加 最后一个参数的值。例如:

<p v-for="c in count">{{ c | pluralize 'item' }}  {{ c | pluralize 'st' 'nd' 'rd' 'th' }}</p>

结果:
1item 1st
2items 2nd
3items 3rd
4items 4th
⑥ json 参数为 {Number}[indent] 空格缩进数,与 JSON.stringify() 作用相同,将 json 对象数据输出成符合 json 格式的字符串。
⑦ debounce 传入值必须是函数,参数可选,为 {Number}[wait],即延时时长。作用是 当调用函数 n 毫秒后,才会执行该动作,若在这 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, 即需要匹配的字符串或函数(通过函数返回值为 true 或 false 来判断匹配结果);“in” (可选 分隔符);{String}[…searchKeys],为检索的属性区域。示例 :

names : ['xiaoli', 'xiaowan'],
items : {{ name : 'xiaoli', age : "10" },{ name : 'xiaowan', age : "20" }
}
...
<p v-for="name in names | filterBy 'li'">{{name}}</p> // 检索items数组中 值包含1.0的元素
<p v-for="item in items | filterBy 'wan' in 'name'">{{ item | json}}</p> // 检索items数组中元素属性name值为1.0的元素输出。检索区域也可以为数组,即in [name, age],在多个属性中进行检索

结果:
xiaoli
{“name” : “xiaowan”, “age” : “20” }

<p v-for="item in items | filterBy customFilter">{{ item | json}}</p> // 使用自定义的过滤函数,函数可以在选项methods中定义
methods : { customFilter : function(item) {if(item.name) return true // 检索所有元素中包含name属性的元素}
}

⑩ orderBy 传入值必须是数组,参数为 {String|Array|Function}sortKeys,即指定排序策略。这里可以使用单个键名,也可以传入包含多个排序键名的数组。
也可以像 Array.Sort() 那样传入自己的排序策略函数。第二个参数为可选参数 {String}[order],即选择升序或降序, order>=0 为升序,order<0 为降序。下面以三种不同的参数例子来说明具体的用法:

单个键名:
<p v-for="item in items | orderBy 'name' -1">{{item.name}}</p> // items数组中以键名name进行降序排列
多个键名:
<p v-for="item in items | orderBy [name,age] ">{{item.name}}</p> // 使用items里的两个键名进行排序
自定义排序函数:
<p v-for="item in items | orderBy customOrder">{{item.name}} </p>
methods: {customOrder: function (a, b) {return parseFloat(a.age) > parseFloat(b.age) // 对比item中 age的值的大小进行排序}
}

在vue2中去除了内置的过滤器,但是我们仍可以定义自己的过滤器,也可以使用开源的插件中带的过滤器。

指令

vue.js是用v-加上指令名组成的,通过使用指令可以设置绑定数据和时间的规则:
① 参数绑定

等同于使用v-bind:

在这里v-bind是个命令,而src既是命令的参数
② 修饰符

计算属性中的函数

在使用数据绑定时,我们通常在呈现数据时都需要对数据进行一定的处理,为了避免过重的逻辑放在模板上,我们可以通过使用计算属性中的函数来预处理数据,从而提高可维护性和阅读性:
示例:

<p>{{ date }}</p>
<p>{{ time }}</p>
<p>{{ datetime }}</p>...var app = new Vue({el: '#app',data: {date: '2019-2-18',time: '10:31'},computed: {datetime: function() {return this.date + ' ' + this.time}}
})

更方便的是计算属性中的set和get:

<p>{{ show_num }}</p>...var app = new Vue({el: '#app,data: { num: 100 },computed: {show_num: {set: function(num) {this.num = num}get: function() {return 'num is ' + this.num}}}
}
app.num = 200 // -> num is 200
表单控件

通过使用v-model来进行对表单元素的双向数据绑定,在修改表单元素值时会同时对v-model绑定的数据进行修改:

var app = new Vue({el : '#app',data: {message : '',gender : '',checked : '', multiChecked : [],selected : '',multiSelected : []}
})
  1. Text
<input type="text" v-model="message" />
<span>Your input is : {{ message }}</span>
  1. Radio
<label><input type="radio" value="male" v-model="gender ">男</lable> <label><input type="radio" value="female" v-model="gender ">女</lable>
<p>{{ gender }}</p>
//gender 值即为选中的 radio 元素的 value 值。
  1. CheckBox
    Checkbox 分两种情况:单个勾选框和多个勾选框。 单个勾选框,v-model 即为布尔值,此时 input 的 value 并不影响 v-model 的值。
<input type="checkbox" v-model="checked" />
<span>checked : {{ checked }}</span>

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

<label><input type="checkbox" value="1" v-model=" multiChecked">1</lable> <label><input type="checkbox" value="2" v-model=" multiChecked">2</lable> <label><input type="checkbox" value="3" v-model=" multiChecked">3</lable> <p>MultiChecked: {{ multiChecked.join('|') }}</p>
  1. Select
    同 Checkbox 元素一样,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>
<br>
<span>MultiSelected: {{ multiSelected.join('|') }}</span>
  1. 绑定value
    表单控件的值同样可以绑定在 Vue 实例的动态属性上,用 v-bind 实现。
    示例:
  • Checkbox
<input type="checkbox" v-model="checked" v-bind:true-value="a" v-bind:false-value="b">
选中:app.checked == app.a  // -> true
未选中:app.checked == app.b // -> true
  • Radio
<input type="radio" v-model="checked", v-bind:value="a">
选中 : app.checked == app.a // -> true
  • Select Options
<select v-model="selected">   <!-- 对象字面量 -->   <option v-bind:value="{ number: 123 }">123</option>
</select>
选中:
typeof app.selected // -> 'object'
app.selected.number // -> 123
  1. 参数特性
    Vue.js 为表单控件提供了一些参数,方便处理某些常规操作。
    ① lazy
    默认情况下,v-model 在 input 事件中同步输入框值与数据,加 lazy 属性后从会改到在 change 事件中同步
<input v-model="query" lazy />

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

<input v-model="age" number/>

③ debounce
debounce 为设置的最小延时,单位为 ms,即为单位时间内仅执行一次数据更新。该参 数往往应用在高耗操作上,例如在更新时发出 ajax 请求返回提示信息。

<input v-model="query" debounce="500" />

不过 Vue.js 2.0 中取消了 lazy 和 number 作为参数,用修饰符(modifier)来代替 :

<input v-model.lazy="query" /> <input v-model.numer="age" />

新增了 trim 修饰符,去掉输入值首尾空格 :

<input v-model.trim="name" />

去除了debounce 这个参数,原因是无法监测到输入新数据,但尚未同步到app 实例属性时这个状态。如果仍有需要,官方提供了手动实现的例子https://jsbin.com/zefawu/3/edit?html,output。

样式绑定

通过使用v-bind:class或者v-bind:style就可以进行简单的样式绑定了,但是vue还有一些更高级的使用方法来方便我们。

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

<div class="tab" v-bind:calss="{'active' : active , 'unactive' : !active}"> </div> app实例中需要包含  
data : {active : true}

结果为:

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

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

<div v-bind:class="[classA, classB]"></div> app实例中需要包含  
data : {classA : 'class-a',classB : 'class-b'}

结果为:

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

也可以使用三元表达式切换数组中的 class,<div v-bind:class="[classA, isB ? classB : '']"></div>。如果 app.isB = false, 则渲染结果为

<div v-bind:class="class-a"></div>

2、内联样式绑定
style 属性绑定的数据即为内联样式,同样具有对象和数组两种形式:
① 对象语法:直接绑定符合样式格式的对象。

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

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

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

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

Vue(三)——数据绑定相关推荐

  1. vue 双向数据绑定的实现学习(一)

    前言:本系列学习笔记从以下几个点展开 什么是双向数据绑定 双向数据绑定的好处 怎么实现双向数据绑定 实现双向数据数据绑定需要哪些知识点 数据劫持 发布订阅模式 先看看我们要实现的目标是什么,如下动图: ...

  2. “别具一格”的vue双向数据绑定原理

    背景和一点点看法 见网上许多文章讲vue双向数据绑定一开口就大谈 Object.defineProperty 和 proxy.其实不然.这是vue中响应式的"基石". vue 中有 ...

  3. Vue的数据绑定 事件 键盘 ,以及创建项目改端口号

    一.Vue的数据绑定 1.单向数据绑定:将Model绑定到View上,当通过JavaScript代码改变了Model时,View就会自动刷新.不需要进行额外的DOM 操作就可以实现视图和模型的联动 ​ ...

  4. Vue的数据绑定、Vue的事件绑定、Class和Style的绑定

    一.Vue的数据绑定 1. 单向数据绑定:将Model绑定到View上,当通过JavaScript代码改变了Model时,View就会自动刷新.不需要进行额外的DOM操作就可以实现视图和模型的联动 ​ ...

  5. vue双向数据绑定原理 1

    1. 原理 1.1 vue双向数据绑定原理,又称vue响应式原理,是vue的核心,双向数据绑定是通过数据劫持结合发布订阅模式的方式来实现的,也就是说数据和视图同步,数据发生变化,视图跟着变化,视图变化 ...

  6. Vue 双向数据绑定原理

    原理 1.vue双向数据绑定原理,又称vue响应式原理,是vue的核心,双向数据绑定是通过数据劫持结合发布者订阅者模式的方式来实现的,通过Object.defineProperty()来劫持各个属性的 ...

  7. 理解VUE双向数据绑定原理和实现

    一.原理: 1.vue 双向数据绑定是通过 数据劫持 结合 发布订阅模式的方式来实现的, 也就是说数据和视图同步,数据发生变化,视图跟着变化,视图变化,数据也随之发生改变: 2.核心:关于VUE双向数 ...

  8. 分析Vue双向数据绑定原理以及简单实现MVVM

    前言 随着Vue的火热发展,越来越多的程序员并不满足于对框架的使用,更多地追求其内在的原理,就像不能沉沦于美丽的外表,更应该追求灵魂的高度. 正文 好了,废话不多说,接下来我们将通过俩方面开展我们对外 ...

  9. vue双向数据绑定原理分析--Mr.Ember

    vue双向数据绑定原理分析 摘要 vue常用,但原理常常不理解,下面我们来具体分析下vue的双向数据绑定原理. (1)创建一个vue对象,实现一个数据监听器observer,对所有数据对象属性进行监听 ...

  10. [Vue源码分析]谷歌翻译后,Vue双向数据绑定失效了?

    前言: 最近运营反馈了一个问题:谷歌浏览器打开第三方储值平台,使用谷歌浏览器自带的翻译功能后,选择商品没有计算总额. 首先可以肯定的是这不是bug,这个平台已经兼容了13种语言,只是运营没有通过语言栏 ...

最新文章

  1. java11 是长期支持_这里有你不得不了解的Java 11版本特性说明
  2. python脚本 通过rsa private key 生成 publickey
  3. 2010-11季,关注波士顿凯尔特人的10个理由
  4. SAP Credit Memo Debit Memo
  5. 【Linux】一步一步学Linux——date命令(81)
  6. ArrayList 除重
  7. 前端学习(1655):前端系列实战课程之浏览器类型监测
  8. LeetCode 5843. 作为子字符串出现在单词中的字符串数目
  9. clion开发qt项目QtGui/qcolor.h: In construconstexpr QColor::QColor(int, int, int, int)’:ctor ‘1073741515
  10. 子类能不能继承父类的成员变量
  11. Gallery 3D+倒影 滑动切换图片示例
  12. maplesoft maple 2021 安装教程
  13. NOIP 2015 推销员
  14. 复合调味品,是年轻人新的追逐吗?
  15. 天马杯-NLP赛道(科技新闻分类与摘要)赛后总结
  16. Learning C++ No.14【STL No.4】
  17. NIOS II 内核使用 之 代码保存FLASH(EPCSX芯片)
  18. android联接无线路由器,安卓手机和无线路由器无线连接设置方法
  19. R语言package安装显示(as ‘lib’ is unspecified)并出现未知路径
  20. 教你搭建个人/企业私有云盘-seafile

热门文章

  1. 日本村田制作所计划启动量产固态电池 用于可穿戴设备
  2. 【python办公自动化(15)】python编程实现Word文档内容样式批量调整(会议议程模板的创建)
  3. StarRocks简单使用
  4. 江苏计算机二级试题教材,江苏省计算机二级试题训练
  5. 上海计算机本科学校排名2015,2015上海大学排名大全(一流、二流、三流)
  6. POJ 2987 Firing 最大权闭合图
  7. Win10.去掉任务栏缩略图(just4explorer)
  8. php支持中文字符串分割的函数
  9. 北京联通2013年夏天大规模促销IPTV 与光纤宽带提速同步推进
  10. 2021物联网国赛Lora模块通用库开发——A卷