赞
踩
每个Vue应用都是通过createApp函数创建一个新的 应用实例 :
import { createApp } from 'vue'
const app = createApp({
/* 根组件选项 */
})
// 这段代码一般是放在后台的js代码中。
// 创建app后,挂载到前端HTML的DOM元素上
就和其他的组件or框架一样,createApp就像Vue的开端,它返回的对象是Vue的应用实例,也是Vue的核心。
传入createApp的对象实际上是一个组件,每个应用(app)都需要一个“根组件”,其他组件将作为其子组件。
如果你使用的是单文件组件(就是前文说的.vue文件),我们可以直接从文件中导入根组件。
import { createApp } from 'vue'
// 从一个单文件组件中导入根组件 这句话应该是说 import app from app.vue
import App from './App.vue'
const app = createApp(App)
虽然本文的许多示例只需要一个组件,但大多数真实的应用都是由一棵嵌套的、可重用的组件树组成的。例如,一个代办事项(Todos)应用的组件树可能是这样的:
App (root component)
├─ TodoList
│ └─ TodoItem
│ ├─ TodoDeleteButton
│ └─ TodoEditButton
└─ TodoFooter
├─ TodoClearButton
└─ TodoStatistics
应用实例必须在调用了.mount()方法后才会渲染出来。该方法接收一个“容器”参数,可以是一个实际的DOM元素或是一个CSS选择器字符串:
DOM元素 |
---|
Document Object Model,取首字母缩写为DOM,翻译过来就是文档对象模型。 当创建好一个页面并加载到浏览器时,DOM就出现了(相当于把HTML文档抽象转换为内存中的一个树形的数据结构对象),它会把网页文档转换为一个文档对象,以方便处理网页内容。 在HTML DOM中,每个元素都是一个节点,所有元素呈现出一种层次结构,可以将它称为节点树。 |
<div id="app"></div>
app.mount('#app');
应用根组件的内容将会被渲染在容器元素里面。容器元素自己将不会被视为应用的一部分。
.mount()方法应该始终在整个应用配置和资源注册完成后被调用。同时注意,不同于其他资源注册方法,它的返回值是根组件实例而非应用实例。
当在未采用构建流程的情况下使用Vue时,我们可以在挂载容器中直接书写根组件模板:
<div id="app">
<button @click="count++">{{ count }}</button>
</div>
import { createApp } from 'vue'
const app = createApp({
data() {
return {
count: 0
}
}
})
app.mount('#app')
当根组件没有设置 template 选项时,Vue将自动使用容器的 innerHTML 作为模板(上面的容器是id为app的div)。
innerHTML设置或获取标签所包含的HTML+文本信息(从标签起始位置到终止位置全部内容包括HTML标签,但不包括自身)
上例中,就是下图红框部分,
应用实例会暴露一个 .config 对象允许我们配置一些应用级选项,例如定义一个应用级的错误处理器,它将捕获所有由子组件上抛而未被处理的错误:
app.config.errorHandler = (err) => {
/* 处理错误 */
}
应用实例还提供了一些方法来注册应用范围内可用的资源,例如注册一个组件:
app.component('TodoDeleteButton', TodoDeleteButton)
这使得 TodoDeleteButton 在应用的任何地方都是可用的。
确保在挂载应用实例之前完成所有应用配置!
应用实例并不只限于一个。createApp API允许你在同一个页面中创建多个共存的Vue应用,而且每个应用都拥有自己的用于配置和全局资源的作用域。
const app1 = createApp({
/* ... */
});
app1.mount('#container-1')
const app2 = createApp({
/* ... */
})
app2.mount('#container-2')
如果你正在使用Vue来增强服务器端渲染HTML,并且只想要Vue去控制一个大型页面中特殊的一小部分,应避免将一个单独的Vue应用实例挂载到整个页面上,而是应该创建多个小的应用实例,将它们分别挂载到所需的元素上去。
这点其实就是尽量将页面元素拆分的思想,组件化、模块化。
前期只要将页面划分好区域,然后挂载上Vue应用即可。
Vue使用一种基于HTML的模板语法,使我们能够声明式地将其组件实例的数据绑定到呈现的DOM上。所有的Vue模板都是语法层面合法的HTML,可以被符合规范的浏览器和HTML解析器解析。
在底层机制中,Vue会将模板翻译成高度优化的JavaScript代码。结合响应式系统,当应用状态变更时,Vue能够智能地推导出需要重新渲染的组件的最少数量,并应用最少的DOM操作。
响应式 |
---|
Vue会自动跟踪JavaScript状态并在其发生变化时响应式地更新DOM。(MVVM中的VM同步更新V) 这边的后台逻辑是JS写的,相当于VM。JS中改变属性值,会自动更新到前端的V中。 |
最基本的数据绑定形式是文本插值,它使用的是“Mustache”语法(即双大括号):
<span>Message:{{ msg }}</span>
双大括号标签会被替换为相应组件实例中 msg 属性的值。同时每次 msg 属性更改时它也会同步更新。
双大括号会将数据解释为纯文本,而不是HTML。若想插入HTML,你需要使用 v-html 指令:
<p>Using text interpolation:{{ rawHtmll }}</p>
<p>Using v-html directive: <span v-html="rawHtml"></span></p>
这里我们遇到了一个新的概念。这里看到的 v-html attribute被称为一个 指令 。指令由 v- 作为前缀,表明它们是一些由Vue提供的特殊的attribute,你可能已经猜到了,它们将为渲染DOM应用特殊的响应式行为。这里我们所做的事情简单来说就是:在当前组件实例上,将此元素的innerHTML与rawHtml属性保持同步。
span 的内容将会被替换为 rawHtml 属性的值,插值为纯HTML——数据绑定将会被忽略。注意,你不能使用 v-html 来拼接组合模板,因为Vue不是一个基于字符串的模板引擎。在使用Vue时,应当使用组件作为UI重用和组合的基本单元。
⚠安全警告 |
---|
在网站上动态渲染任意HTML是非常危险的,因为这非常容易造成XSS漏洞。 XSS,Cross Site Scripting,跨站脚本攻击。当用户故意设计了一段代码时,浏览器会将其误认为是插入了HTML标签,当这些HTML标签引入了一段JavaScript脚本时,这些脚本程序就将会在用户浏览器中执行,从而盗取信息。 |
双大括号不能在HTML attributes中使用。想要响应式地绑定一个attribute,应该使用 v-bind 指令:
<div v-bind:id="dynamicId"></div>
v-bind 指令指示Vue将元素的 id attribute与组件的 dynamicId 属性保持一致。如果绑定的值是 null 或者 undefined , 那么该attribute 将会从渲染的元素上移除。
因为 v-bind 非常常用,我们提供了特定的简写语法:
<div :id="dynamicId"></div>
开头为 : 的attribute可能和一般的HTML attribute看起来不太一样,但它的确是合法的attribute名称字符,并且所有支持Vue的浏览器都能正确解析它。此外,他们不会出现在最终渲染的DOM中。简写语法是可选的,但相信你在了解了它更多的用处后,你应该会更喜欢它。
接下来,我们都将在示例中使用简写语法,因为这是实际开发中更常见的用法。
布尔型attribute依据true/false值来决定attribute是否应该存在于该元素上。disabled就是最常见的例子之一。
v-bind 在这种场景下的行为略有不同:
<button :disabled="isButtonDisabled">Button</button>
当 isButtonDisabled 为真值或一个空字符串(即<button disabled=“”>)时,元素会包含这个disabled attribute。而当其为其他假值时 attribute 将被忽略。
如果你有像这样的一个包含多个attribute的JavaScript对象:
data(){
return {
objectOfAttrs:{
id:'container',
class:'wrapper'
}
}
}
通过不带参数的 v-bind,你可以将它们绑定到单个元素上:
<div v-bind="objectOfAttrs"></div>
至此,我们仅在模板中绑定了一些简单的属性名。但是Vue实际上在所有的数据绑定中都支持完整的JavaScript表达式:
{{ number +1 }}
{{ ok ? 'YES' : 'NO' }}
{{ message.split('').reverse().join('') }}
<div :id="'list-${id}'"></div>
这些表达式都会被作为JavaScript,以组件为作用域解析执行。
在Vue模板内,JavaScript表达式可以被使用在如下场景上:
每个绑定仅支持单一表达式,也就是一段能够被求值的JavaScript代码。一个简单的判断方法是是否可以合法地写在 return 后面。
因此,下面的例子都是无效的:
<!--这是一个语句,而非表达式-->
{{ var a = 1 }}
<!--条件控制也不支持,请使用三元表达式-->
{{ if(ok) { return message } }}
可以在绑定的表达式中使用一个组件暴露的方法:
<span :little="toTitleDate(date)">
{{ formatDate(date) }}
</span>
ℹ Tip |
---|
绑定在表达式中的方法在组件每次更新时会被重新调用,因此不应该产生任何副作用,比如改变数据或触发异步操作。 |
模板中的表达式将被沙盒化,仅能够访问到有限的全局对象列表。该列表中会暴露常用的内置全局对象,比如 Math 和 Date。
没有显式包含在列表中的全局对象将不能在模板内表达式中访问,例如用户附加在 window 上的属性。然而,你也可以自行在 app.config.globalProperties 上显式地添加它们,供所有的Vue表达式使用。
指令是带有 v- 前缀的特殊 attribute。Vue提供了许多内置指令,包括上面介绍的 v-bind 和 v-html。
指令attribute的期望值为一个JavaScript表达式(除了少数几个例外,即之后要讨论到的 v-for、v-on和v-slot)。一个指令的任务是在其表达式的值变化时响应式地更新DOM。以v-if为例:
<p v-if="seen">Now you see me</p>
这里,v-if 指令会基于表达式 seen 的值的真假来移除/插入该 <p>元素。
某些指令会需要一个 “参数”,在指令名后通过一个冒号隔开做标识。例如用 v-bind 指令来响应式地更新一个 HTML attribute:
<a v-bind:href="url">...</a>
<!--简写-->
<a :href="url">...</a>
这里的 href 就是一个参数,它告诉 v-bind 指令将表达式 url 的值绑定到元素的 href attribute上。在简写中,参数前的一切(例如 v-bind:)都会被缩略为一个 : 字符。
另一个例子是 v-on 指令,它将监听DOM事件:
<a v-on:click="doSomething">...</a>
<!--简写-->
<a @click="doSomething">...</a>
这里的参数是要监听的事件名称: click。 v-on 有一个相应的缩写,即 @ 字符。
同样在指令参数上也可以使用一个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>
如果你需要传入一个复杂的动态参数,我们推荐使用计算属性替换复杂的表达式,也是Vue最基础的概念之一。
当使用DOM内嵌模板(直接写在HTML文件里的模板)时,我们需要避免在名称中使用大写字母,因为浏览器会强制将其转换为小写:
<a :[someAttr]="value">...</a>
上面的例子将会在DOM内嵌模板中被转换为:[someattr]。如果你的组件拥有"someAttr"属性而非"someattr",这段代码将不会工作。单文件组件内的模板不受此限制。
修饰符是以点开头的特殊后缀,表明指令需要以一些特殊的方式被绑定。例如 .prevent 修饰符会告知 v-on 指令对触发的事件调用 event.preventDefault():
<form @sumbit.prevent="onSubmit">...</form>
完整的指令语法:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。