2

Vue学习笔记03:模板语法

 1 year ago
source link: https://direct5dom.github.io/2022/07/30/Vue%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B003/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Vue学习笔记03:模板语法

2022-07-302022-08-01Vue学习笔记

文本插值 (双大括号 (Mustache)) ({{msg}})

使用“双大括号 (Mustache)”语法的文本插值:

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

双大括号及其内部的内容将会被替代为对应组件实例中msg property的值。无论何时,绑定的组件实例上msg property发生了改变,插值处的内容都会更新。

通过使用v-once指令,你也能执行一次性地插值,当数据改变时,插值处的内容不会更新。但请留心这会影响到该节点上的其它数据绑定:

<span v-once>这个将不会改变: {{ msg }}</span>

原始HTML (v-html)

Mustache语法会将数据渲染为普通文本,它不能直接渲染HTML代码。

为了输出真正的HTML,你需要使用v-html指令:

<p>Using mustaches: {{ rawHtml }}</p>
<p>Using v-html directive: <span v-html="rawHtml"></span></p>

这个span的内容将会被替换成为rawHtml property的值,忽略解析property值中的数据绑定,直接作为HTML渲染输出。

注意,不能使用v-html来复合局部模板,因为Vue不是基于字符串的模板引擎。反之,对于用户界面 (UI),组件更适合作为可重用和可组合的基本单位。

在你的站点上动态渲染任意的HTML是非常危险的,因为它很容易导致XSS攻击。请只对可信内容使用HTML插值,绝不要将用户提供的内容作为插值。

属性 (Attribute) (v-bind)

Mustache语法不能在HTML attribute中使用,然而,可以使用v-bind指令:

<div v-bind:id="dynamicId"></div>

如果绑定的值是nullundefined,那么该attribute将不会被包含在渲染的元素上。

对于布尔attribute (它们只要存在就意味着值为true),v-bind工作起来略有不同,在这个例子中:

<button v-bind:disabled="isButtonDisabled">按钮</button>

如果isButtonDisabled的值是真值 (truthy),那么disabled attribute将被包含在内。如果该值是一个空字符串,它也会被包括在内,与<button disabled=""> 保持一致。对于其他虚值 (falsy) 的值,该attribute将被省略。

使用JavaScript表达式

对于所有的数据绑定,Vue.js都提供了完全的JavaScript表达式支持。

{{ number + 1 }}

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

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

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

这些表达式会在当前活动实例的数据作用域下作为JavaScript被解析。有个限制就是,每个绑定都只能包含单个表达式,所以下面的例子都不会生效。

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

<!-- 流程控制也不会生效,请使用三元表达式 -->
{{ if (ok) { return message } }}

指令 (Directives) (v-)

指令 (Directives) 是带有v-前缀的特殊attribute。

指令attribute的值预期是单个JavaScript表达式 (v-forv-on是例外情况)。

指令的职责是,当表达式的值改变时,将其产生的连带影响,响应式地作用于DOM。

<p v-if="seen">现在你看到我了</p>

这里,v-if指令将根据表达式seen的值的真假来插入或移除<p>元素。

参数 (:)

部分指令可以接收一个“参数”,在指令名称之后以冒号:表示。

实例,v-bind指令可以用于响应式地更新HTML attribute:

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

在这里href是参数,告知v-bind指令将该元素的href attribute与表达式url的值绑定。

实例,v-on指令,它用于监听DOM事件:

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

在这里参数是监听的事件名。我们也会更详细地讨论事件处理。

动态参数 ([])

也可以在指令参数中使用JavaScript表达式,方法是用方括号[]括起来:

<!--
注意,参数表达式的写法存在一些约束,如之后的“对动态参数表达式的约束”章节所述。
-->
<a v-bind:[attributeName]="url"> ... </a>

这里的attributeName会被作为一个JavaScript表达式进行动态求值,求得的值将会作为最终的参数来使用。

例如,如果组件实例有一个data property attributeName,其值为"href",那么这个绑定将等价于v-bind:href

同样地,可以使用动态参数为一个动态的事件名绑定处理函数:

<a v-on:[eventName]="doSomething"> ... </a>

在这个示例中,当eventName的值为"focus"时,v-on:[eventName]将等价于v-on:focus

修饰符 (modifier) (.)

修饰符 (modifier) 是以半角句号.指明的特殊后缀,用于指出一个指令应该以特殊方式绑定。

例如,.prevent修饰符告诉v-on指令对于触发的事件调用event.preventDefault()

<form v-on:submit.prevent="onSubmit">...</form>

v-前缀用来识别模板中Vue特定的attribute。

然而,对于一些频繁用到的指令来说,v-前缀就会感到使用繁琐。

同时,在构建由Vue管理所有模板的单页面应用程序 (SPA - single page application) 时,v-前缀也变得没那么重要了。

因此,Vue为v-bindv-on这两个最常用的指令,提供了特定简写:

v-bind缩写

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

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

<!-- 动态参数的缩写 -->
<a :[key]="url"> ... </a>

v-on缩写

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

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

<!-- 动态参数的缩写 -->
<a @[event]="doSomething"> ... </a>

它们看起来可能与普通的HTML略有不同,但:@对于attribute名来说都是合法字符,在所有支持Vue的浏览器都能被正确地解析。

对动态参数值约定

动态参数预期会求出一个字符串,null例外。

这个特殊的null值可以用于显式地移除绑定。任何其它非字符串类型的值都将会触发一个警告。

对动态参数表达式约定

动态参数表达式有一些语法约束,因为某些字符,如空格和引号,放在HTML attribute名里是无效的。例如:

<!-- 这会触发一个编译警告 -->
<a v-bind:['foo' + bar]="value"> ... </a>

变通的办法是使用没有空格或引号的表达式,或用计算属性替代这种复杂表达式。

在DOM中使用模板时 (直接在一个HTML文件里撰写模板),还需要避免使用大写字符来命名键名,因为浏览器会把attribute名全部强制转为小写:

<!--
在 DOM 中使用模板时这段代码会被转换为 `v-bind:[someattr]`。
除非在实例中有一个名为“someattr”的 property,否则代码不会工作。
-->
<a v-bind:[someAttr]="value"> ... </a>

JavaScript表达式

模板表达式都被放在沙盒中,只能访问一个受限的全局变量列表,如MathDate。你不应该在模板表达式中试图访问用户定义的全局变量。

truthy不是true,详见MDN的解释。

falsy不是false,详见MDN的解释。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK