李恒道 发表于 2021-12-21 17:55:13

[油猴脚本开发指南]模板语法

# 前文

本文依然根据Vue的官方教程大概抄写

仅有少部分的改动

# 模板与render

我们平时写代码的时候通常使用模板,vue在发现我们使用模板的时候

会将模板转译为render函数

vue会根据render函数来读取出虚拟的dom节点

最后根据虚拟dom节点来渲染出真实dom

因为虚拟dom是一个抽象dom,所以一旦出现改变的时候

交叉对比虚拟dom,来重新修改真实dom,达到减少操作数的目的

注意,这里的减少dom操作数未必是一个最优情况,但是远远高于我们普通人自己来写计算规则

# 插值

## 文本

我们使用大括号来包含我们data内声明的数据,计算属性等等需要改变的数据

一旦触发改变,模板上的显示会跟随数据进行更新



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

```

我们也可以使用v-once指令来进行一次性插值

当数据再次发生改变的时候不会更新该处数据

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

```

## 原始html

如果使用{{}}会将其解释为文本,但是如果我们想渲染html,我们需要使用v-html指令

但我们不能在内使用属性绑定等,因为vue会直接忽略。

注意,不用将用户提供内容作为其显示内容,否则容易导致出现攻击行为

```javascript
<p>Using v-html directive: <span v-html="rawHtml"></span></p>
```

## Attribute

文本的语法不能在html属性中实行,但是我们可以使用v-bind指令

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

```

如果绑定的值为null或undefined,则该属性不会出现在渲染的元素上

对于bool类型的属性v-bind工作有所不同

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

```

如果 `isButtonDisabled` 的值为真,则disabled属性包含在内,如果该值为一个字符串,同样也会包括在捏

与disabled=""一致,对于其他为假的值,该值会被忽略

## 表达式

在括号里我们可以使用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 } }}
```

## 指令

指令为带有v-前缀的属性,通常为单个js表达式,指令的职责是当表达式的值改变的时候会出现对应的行为

并响应到dom元素上

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

```

如根据seen的真假会或移除dom元素

## 参数

我们可以以响应式的去更新一些属性,如

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

这里href是参数,v-bind告诉将href与url变量绑定,一旦url改变,href内容也会相应改变

另一个例子是v-on指令

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

这里我们监听了click点击事件

## 动态参数

我们也可以在指令参数上使用js表达式,但需要用方括号括起来

```javascript
<!--
注意,参数表达式的写法存在一些约束.
-->
<a v-bind:="url"> ... </a>
```

这里的attributeName会作为一个js表达式动态获取结果,作为最终绑定的参数来使用

如果attributeName为href,则最终为v-bind:href="url"

我们也可以使用动态参数为一个动态事件名绑定处理函数,如

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

当eventName的值为focus时,则为v-on:focue=“doSomeThing”

## 修饰符

相当于对于事件处理的语法糖,使用.后跟随一些文本,告诉一个指令应该对于触发的事件调用进行怎样的处理。

如.prevent告诉v-on对于触发事件调用使用`event.preventDefault()`

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

## 缩写

我们可以把v-bind:写为: 把v-on:写为@,如

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

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

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

```

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

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

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

看起来与传统的html不同,但:与@属于合法字符,在支持vue的浏览器上可以正确的被解析出来

同时不会出现在最终渲染中。

# 注意事项

#### 对动态参数值约定

动态参数预期会求出一个字符串,异常情况下值为 `null`。这个特殊的 `null` 值可以被显性地用于移除绑定。任何其它非字符串类型的值都将会触发一个警告。

#### 对动态参数表达式约定

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

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

变通的办法是使用没有空格或引号的表达式,或用[计算属性](https://v3.cn.vuejs.org/guide/computed.html)替代这种复杂表达式。

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

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

#### JavaScript 表达式

模板表达式都被放在沙盒中,只能访问一个[受限的全局变量列表](https://github.com/vuejs/vue-next/blob/master/packages/shared/src/globalsWhitelist.ts#L3)

[ ](https://github.com/vuejs/vue-next/blob/master/packages/shared/src/globalsWhitelist.ts#L3),如 `Math` 和 `Date`。你不应该在模板表达式中试图访问用户定义的全局变量。

王一之 发表于 2021-12-21 20:09:46

已经完全和油猴无关了吧

李恒道 发表于 2021-12-21 20:47:04

王一之 发表于 2021-12-21 20:09
已经完全和油猴无关了吧
是,vue大概讲完就转到webpack部分了
不然感觉断层太多了

水凛子 发表于 2021-12-22 08:20:33

李恒道 发表于 2021-12-21 20:47
是,vue大概讲完就转到webpack部分了
不然感觉断层太多了

hhhhhhhh
页: [1]
查看完整版本: [油猴脚本开发指南]模板语法