5

Vue学习笔记02:模板语法

 1 year ago
source link: https://direct5dom.github.io/2022/08/09/Vue%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B002/
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.

指令 Directives (v-)

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

指令 attribute 的期望值为一个 JavaScript 表达式 (除了少数几个例外,即之后要讨论到的 v-forv-onv-slot)。一个指令的任务是在其表达式的值变化时响应式地更新 DOM。以 v-if 为例:

<p v-if="seen">Now you see me</p>

这里,v-if指令会基于表达式seen的值的真假来移除/插入该<p>元素。

参数 Arguments (:)

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

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

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

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

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

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

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

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

这里的参数是要监听的事件名称:click

动态参数 ([])

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

<!--
注意,参数表达式有一些约束,
参见下面“动态参数值的限制”与“动态参数语法的限制”章节的解释
-->
<a v-bind:[attributeName]="url"> ... </a>

<!-- 简写 -->
<a :[attributeName]="url"> ... </a>

这里的attributeName会作为一个JavaScript表达式被动态执行,计算得到的值会被用作最终的参数。

如果组件实例有一个数据属性attributeName,其值为"href",那么这个绑定就等价于v-bind:href

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

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

<!-- 简写 -->
<a @[eventName]="doSomething">

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

动态参数值的限制

动态参数中表达式的值应当是一个字符串,或者是null。特殊值null意为显式移除该绑定。其他非字符串的值会触发警告。

动态参数语法的限制

动态参数表达式因为某些字符的缘故有一些语法限制,比如空格和引号,在HTML attribute名称中都是不合法的。例如下面的示例:

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

如果需要传入一个复杂的动态参数,推荐使用计算属性替换复杂的表达式。

当使用DOM内嵌模板 (直接写在HTML文件里的模板) 时,需要避免在名称中使用大写字母,因为浏览器会强制将其转换为小写:

<a :[someAttr]="value"> ... </a>

上面的例子将会在DOM内嵌模板中被转换为 :[someattr]。如果你的组件拥有“someAttr”属性而非“someattr”,这段代码将不会工作。单文件组件内的模板受此限制。

修饰符 Modifiers (.)

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

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

<form @submit.prevent="onSubmit">...</form>

完整的指令语法:

文本插值 ({{msg}})

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

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

双大括号标签会被替换为相应组件实例中 msg 属性的值。同时每次 msg 属性更改时它也会同步更新。

原始HTML (v-html)

双大括号会将数据渲染为普通文本,它不能直接渲染HTML代码。

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

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

span的内容将会被替换为rawHtml属性的值,插值为纯HTML——数据绑定将会被忽略。

注意,不能使用v-html来拼接组合模板,因为Vue不是一个基于字符串的模板引擎。在使用Vue时,应当使用组件作为UI重用和组合的基本单元。

在网站上动态渲染任意 HTML 是非常危险的,因为这非常容易造成XSS漏洞。请仅在内容安全可信时再使用v-html,并且永远不要使用用户提供的HTML内容。

Attribute 绑定 (v-bind)

双大括号不能在HTML attribute中使用,然而,可以使用v-bind指令:

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

v-bind指令指示Vue将元素的id attribute与组件的dynamicId属性保持一致。

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

v-bind指令作为一个常用指令,Vue提供了特定的简写语法::

<div :id="dynamicId"></div>

布尔型 Attribute

布尔型Attribute依据true / false值来决定attribute是否应该存在于该元素上。

v-bind在这种场景下的行为略有不同:

<button :disabled="isButtonDisabled">Button</button>

isButtonDisabled为真值 (truthy) 或一个空字符串 (即 <button disabled="">) 时,元素会包含这个disabled attribute。

而当其为其他虚值 (falsy) 的值,该attribute将被忽略。

动态绑定多个值

如果有像这样的一个包含多个attribute的JavaScript对象:

data() {
return {
objectOfAttrs: {
id: 'container',
class: 'wrapper'
}
}
}

通过不带参数的v-bind,可以将它们绑定到单个元素上:

<div v-bind="objectOfAttrs"></div>

使用JavaScript表达式

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

{{ number + 1 }}

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

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

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

这些表达式都会被作为JavaScript ,以组件为作用域解析执行。

在Vue模板内,JavaScript表达式可以被使用在如下场景上:

  • 在文本插值中 (双大括号)
  • 在任何Vue指令 (以v-开头的特殊attribute) attribute的值中

仅支持表达式

每个绑定仅支持单一表达式,也就是一段能够被求值的JavaScript代码。一个简单的判断方法是是否可以合法地写在return后面。

因此,下面的例子都是无效的:

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

<!-- 条件控制也不支持,请使用三元表达式 -->
{{ if (ok) { return message } }}

可以在绑定的表达式中使用一个组件暴露的方法:

<span :title="toTitleDate(date)">
{{ formatDate(date) }}
</span>

绑定在表达式中的方法在组件每次更新时都会被重新调用,因此应该产生任何副作用,比如改变数据或触发异步操作。

受限的全局访问

模板中的表达式将被沙盒化,仅能够访问到有限的全局对象列表。该列表中会暴露常用的内置全局对象,比如MathDate

没有显式包含在列表中的全局对象将不能在模板内表达式中访问,例如用户附加在window上的属性。也可以自行在app.config.globalProperties上显式地添加它们,供所有的Vue表达式使用。

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK