Vue.js每天必学之数据双向绑定


Posted in Javascript onSeptember 05, 2016

Vue.js 的模板是基于 DOM 实现的。这意味着所有的 Vue.js 模板都是可解析的有效的 HTML,且通过一些特殊的特性做了增强。Vue 模板因而从根本上不同于基于字符串的模板,请记住这点。

插值

文本

数据绑定最基础的形式是文本插值,使用 “Mustache” 语法(双大括号):

<span>Message: {{ msg }}</span>

Mustache 标签会被相应数据对象的 msg 属性的值替换。每当这个属性变化时它也会更新。

你也可以只处理单次插值,今后的数据变化就不会再引起插值更新了:

<span>This will never change: {{* msg }}</span>

原始的 HTML

双 Mustache 标签将数据解析为纯文本而不是 HTML。为了输出真的 HTML 字符串,需要用三 Mustache 标签:

<div>{{{ raw_html }}}</div>

内容以 HTML 字符串插入——数据绑定将被忽略。如果需要复用模板片断,应当使用 partials。

在网站上动态渲染任意 HTML 是非常危险的,因为容易导致 [XSS 攻击](https://en.wikipedia.org/wiki/Cross-site_scripting)。记住,只对可信内容使用 HTML 插值,**永不**用于用户提交的内容。

HTML 特性

Mustache 标签也可以用在 HTML 特性 (Attributes) 内:

<div id="item-{{ id }}"></div>

注意在 Vue.js 指令和特殊特性内不能用插值。不必担心,如果 Mustache 标签用错了地方 Vue.js 会给出警告。

绑定表达式

放在 Mustache 标签内的文本称为绑定表达式。在 Vue.js 中,一段绑定表达式由一个简单的 JavaScript 表达式和可选的一个或多个过滤器构成。

JavaScript 表达式

到目前为止,我们的模板只绑定到简单的属性键。不过实际上 Vue.js 在数据绑定内支持全功能的 JavaScript 表达式:

{{ number + 1 }}

{{ ok ? 'YES' : 'NO' }}

{{ message.split('').reverse().join('') }}

这些表达式将在所属的 Vue 实例的作用域内计算。一个限制是每个绑定只能包含单个表达式,因此下面的语句是无效的:

<!-- 这是一个语句,不是一个表达式: -->
{{ var a = 1 }}

<!-- 流程控制也不可以,可改用三元表达式 -->
{{ if (ok) { return message } }}

过滤器

Vue.js 允许在表达式后添加可选的“过滤器 (Filter) ”,以“管道符”指示:

{{ message | capitalize }}

这里我们将表达式 message 的值“管输(pipe)”到内置的 capitalize 过滤器,这个过滤器其实只是一个 JavaScript 函数,返回大写化的值。Vue.js 提供数个内置过滤器,在后面我们会谈到如何开发自己的过滤器。

注意管道语法不是 JavaScript 语法,因此不能在表达式内使用过滤器,只能添加到表达式的后面。

过滤器可以串联:

{{ message | filterA | filterB }}

过滤器也可以接受参数:

{{ message | filterA 'arg1' arg2 }}

过滤器函数始终以表达式的值作为第一个参数。带引号的参数视为字符串,而不带引号的参数按表达式计算。这里,字符串 'arg1' 将传给过滤器作为第二个参数,表达式 arg2 的值在计算出来之后作为第三个参数。

指令

指令 (Directives) 是特殊的带有前缀 v- 的特性。指令的值限定为绑定表达式,因此上面提到的 JavaScript 表达式及过滤器规则在这里也适用。指令的职责就是当其表达式的值改变时把某些特殊的行为应用到 DOM 上。我们来回头看下“概述”里的例子:

<p v-if="greeting">Hello!</p>

这里 v-if 指令将根据表达式 greeting 值的真假删除/插入 <p> 元素。

参数

有些指令可以在其名称后面带一个“参数” (Argument),中间放一个冒号隔开。例如,v-bind 指令用于响应地更新 HTML 特性:

<a v-bind:href="url"></a>

这里 href 是参数,它告诉 v-bind 指令将元素的 href 特性跟表达式 url 的值绑定。可能你已注意到可以用特性插值 {% raw %}href="{{url}}"{% endraw %} 获得同样的结果:这样没错,并且实际上在内部特性插值会转为 v-bind 绑定。

另一个例子是 v-on 指令,它用于监听 DOM 事件:

<a v-on:click="doSomething">

这里参数是被监听的事件的名字。我们也会详细说明事件绑定。

修饰符

修饰符 (Modifiers) 是以半角句号 . 开始的特殊后缀,用于表示指令应当以特殊方式绑定。例如 .literal 修饰符告诉指令将它的值解析为一个字面字符串而不是一个表达式:

<a v-bind:href.literal="/a/b/c"></a>

当然,这似乎没有意义,因为我们只需要使用 href="/a/b/c" 而不必使用一个指令。这个例子只是为了演示语法。后面我们将看到修饰符更多的实践用法。

缩写

v- 前缀是一种标识模板中特定的 Vue 特性的视觉暗示。当你需要在一些现有的 HTML 代码中添加动态行为时,这些前缀可以起到很好的区分效果。但你在使用一些常用指令的时候,你会感觉一直这么写实在是??隆6?以诠菇ǖヒ秤τ茫?PA )时,Vue.js 会管理所有的模板,此时 v- 前缀也没那么重要了。因此Vue.js 为两个最常用的指令 v-bind 和 v-on 提供特别的缩写:

v-bind 缩写

<!-- 完整语法 -->
<a v-bind:href="url"></a>

<!-- 缩写 -->
<a :href="url"></a>

<!-- 完整语法 -->
<button v-bind:disabled="someDynamicCondition">Button</button>

<!-- 缩写 -->
<button :disabled="someDynamicCondition">Button</button>

v-on 缩写

<!-- 完整语法 -->
<a v-on:click="doSomething"></a>

<!-- 缩写 -->
<a @click="doSomething"></a>

它们看起来跟“合法”的 HTML 有点不同,但是它们在所有 Vue.js 支持的浏览器中都能被正确地解析,并且不会出现在最终渲染的标记中。缩写语法完全是可选的,不过随着一步步学习的深入,你会庆幸拥有它们。

本文已被整理到了《Vue.js前端组件学习教程》,欢迎大家学习阅读。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js实现的日期操作类DateTime函数代码
Mar 16 Javascript
JavaScript 以对象为索引的关联数组
May 19 Javascript
javasciprt下jquery函数$.post执行无响应的解决方法
Mar 13 Javascript
drag-and-drop实现图片浏览器预览
Aug 06 Javascript
jquery悬浮提示框完整实例
Jan 13 Javascript
学习javascript文件加载优化
Feb 19 Javascript
js中window.open的参数及注意注意事项
Jul 06 Javascript
JavaScript中函数声明与函数表达式的区别详解
Aug 18 Javascript
原生JS:Date对象全面解析
Sep 06 Javascript
js中获取 table节点各tr及td的内容简单实例
Oct 14 Javascript
微信小程序商品详情页底部弹出框
Nov 22 Javascript
vue 组件间的通信之子组件向父组件传值的方式
Jul 29 Javascript
JS快速实现移动端拼图游戏
Sep 05 #Javascript
jQuery实现的tab标签切换效果示例
Sep 05 #Javascript
Vue.js每天必学之构造器与生命周期
Sep 05 #Javascript
Js查找字符串中出现次数最多的字符及个数实例解析
Sep 05 #Javascript
JS查找字符串中出现次数最多的字符
Sep 05 #Javascript
node网页分段渲染详解
Sep 05 #Javascript
js对象浅拷贝和深拷贝详解
Sep 05 #Javascript
You might like
Smarty模板学习笔记之Smarty简介
2014/05/20 PHP
php生成xml时添加CDATA标签的方法
2014/10/17 PHP
php中smarty模板条件判断用法实例
2015/06/11 PHP
Smarty最简单实现列表奇偶变色的方法
2015/07/01 PHP
WordPress开发中自定义菜单的相关PHP函数使用简介
2016/01/05 PHP
CI框架常用方法小结
2016/05/17 PHP
php外部执行命令函数用法小结
2016/10/11 PHP
解决Yii2邮件发送结果返回成功,但接收不到邮件的问题
2017/05/23 PHP
PHP实现简易图形计算器
2020/08/28 PHP
打开超链需要“确认”对话框的方法
2007/03/08 Javascript
非常不错的功能强大代码简单的管理菜单美化版
2008/07/09 Javascript
JavaScript Object的extend是一个常用的功能
2009/12/02 Javascript
jquery+json实现的搜索加分页效果
2010/03/31 Javascript
javascript内存管理详细解析
2013/11/11 Javascript
jQuery position() 函数详解以及jQuery中position函数的应用
2015/12/14 Javascript
原生JS查找元素的方法(推荐)
2016/11/22 Javascript
bootstrap实现点击删除按钮弹出确认框的实例代码
2018/08/16 Javascript
vue-cli 构建骨架屏的方法示例
2018/11/08 Javascript
原生js添加一个或多个类名的方法分析
2019/07/30 Javascript
vue-router重写push方法,解决相同路径跳转报错问题
2020/08/07 Javascript
OpenLayers3实现测量功能
2020/09/25 Javascript
[01:01:29]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第一场
2018/04/05 DOTA
django轻松使用富文本编辑器CKEditor的方法
2017/03/30 Python
pycharm 将django中多个app放到同个文件夹apps的处理方法
2018/05/30 Python
python修改文件内容的3种方法详解
2019/11/15 Python
python使用python-pptx删除ppt某页实例
2020/02/14 Python
将labelme格式数据转化为标准的coco数据集格式方式
2020/02/17 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
2020/04/23 Python
python wsgiref源码解析
2021/02/06 Python
百思买加拿大:Best Buy Canada
2018/03/20 全球购物
eDreams德国:南欧领先的在线旅游公司
2020/12/07 全球购物
房屋租赁意向书
2014/04/01 职场文书
2014离婚协议书范文
2014/09/10 职场文书
2015年建党94周年演讲稿
2015/03/19 职场文书
解决Springboot PostMapping无法获取数据的问题
2022/05/06 Java/Android
CSS控制继承中的height能变为可继承吗
2022/06/10 HTML / CSS