Vue3 介绍

与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。

另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。

声明式渲染

Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统:

1
2
3
<div id="counter">
Counter: {{ counter }}
</div>
1
2
3
4
5
6
7
8
9
const Counter = {
data() {
return {
counter: 0
}
}
}

Vue.createApp(Counter).mount('#counter')

除了文本插值,我们还可以像这样绑定元素的 attribute:

1
2
3
4
5
<div id="bind-attribute">
<span v-bind:title="message">
鼠标悬停几秒钟查看此处动态绑定的提示信息!
</span>
</div>
1
2
3
4
5
6
7
8
9
const AttributeBinding = {
data() {
return {
message: 'You loaded this page on ' + new Date().toLocaleString()
}
}
}

Vue.createApp(AttributeBinding).mount('#bind-attribute')

处理用户输入

可以用 v-on 指令添加一个事件监听器,通过它调用在实例中定义的方法:

1
2
3
4
<div id="event-handling">
<p>{{ message }}</p>
<button v-on:click="reverseMessage">反转 Message</button>
</div>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const EventHandling = {
data() {
return {
message: 'Hello Vue.js!'
}
},
methods: {
reverseMessage() {
this.message = this.message
.split('')
.reverse()
.join('')
}
}
}

Vue.createApp(EventHandling).mount('#event-handling')

所有的 DOM 操作都由 Vue 来处理,你编写的代码只需要关注逻辑层面即可。

Vue 还提供了 v-model 指令,它能轻松实现表单输入和应用状态之间的双向绑定。

1
2
3
4
<div id="two-way-binding">
<p>{{ message }}</p>
<input v-model="message" />
</div>
1
2
3
4
5
6
7
8
9
const TwoWayBinding = {
data() {
return {
message: 'Hello Vue!'
}
}
}

Vue.createApp(TwoWayBinding).mount('#two-way-binding')

条件与循环

控制切换一个元素是否显示

1
2
3
<div id="conditional-rendering">
<span v-if="seen">现在你看到我了</span>
</div>
1
2
3
4
5
6
7
8
9
const ConditionalRendering = {
data() {
return {
seen: true
}
}
}

Vue.createApp(ConditionalRendering).mount('#conditional-rendering')

v-for 指令可以绑定数组的数据来渲染一个项目列表:

1
2
3
4
5
6
7
<div id="list-rendering">
<ol>
<li v-for="todo in todos">
{{ todo.text }}
</li>
</ol>
</div>
1
2
3
4
5
6
7
8
9
10
11
12
13
const ListRendering = {
data() {
return {
todos: [
{ text: 'Learn JavaScript' },
{ text: 'Learn Vue' },
{ text: 'Build something awesome' }
]
}
}
}

Vue.createApp(ListRendering).mount('#list-rendering')

组件化应用构建

Component Tree

在 Vue 中,组件本质上是一个具有预定义选项的实例。在 Vue 中注册组件很简单:如对 app 对象所做的那样创建一个组件对象,并将其定义在父级组件的 components 选项中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const TodoItem = {
template: `<li>This is a todo</li>`
}

// 创建 Vue 应用
const app = Vue.createApp({
components: {
TodoItem // 注册一个新组件
},
... // 组件的其它 property
})

// 挂载 Vue 应用
app.mount(...)
1
2
3
4
<ol>
<!-- 创建一个 todo-item 组件实例 -->
<todo-item></todo-item>
</ol>

我们应该能将数据从父组件传入子组件才对。让我们来修改一下组件的定义,使之能够接受一个 prop

1
2
3
4
const TodoItem = {
props: ['todo'],
template: `<li>{{ todo.text }}</li>`
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<div id="todo-list-app">
<ol>
<!--
现在我们为每个 todo-item 提供 todo 对象
todo 对象是变量,即其内容可以是动态的。
我们也需要为每个组件提供一个“key”,稍后再
作详细解释。
-->
<todo-item
v-for="item in groceryList"
v-bind:todo="item"
v-bind:key="item.id"
></todo-item>
</ol>
</div>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const TodoItem = {
props: ['todo'],
template: `<li>{{ todo.text }}</li>`
}

const TodoList = {
data() {
return {
groceryList: [
{ id: 0, text: 'Vegetables' },
{ id: 1, text: 'Cheese' },
{ id: 2, text: 'Whatever else humans are supposed to eat' }
]
}
},
components: {
TodoItem
}
}

const app = Vue.createApp(TodoList)

app.mount('#todo-list-app')