介绍
介绍
Vue.js 是什么
Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。
声明式渲染
Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统:
<template>
<div>
<p>Counter: {{ counter }}</p>
<button @click="stop">Stop</button>
</div>
</template>
<script>
export default {
data() {
return {
counter: 0,
flag: null,
}
},
mounted() {
this.flag = setInterval(() => {
this.counter++
}, 1000)
},
methods: {
stop() {
clearInterval(this.flag);
}
}
}
</script>
<style>
</style>
除了文本插值,我们还可以像这样绑定元素的 attribute:
<template>
<div>
<span v-bind:title="message">
鼠标悬停几秒钟查看此处动态绑定的提示信息!
</span>
</div>
</template>
<script>
export default {
data() {
return {
message: 'You loaded this page on ' + new Date().toLocaleString()
}
},
mounted() {
},
methods: {
}
}
</script>
<style>
</style>
你看到的 v-bind attribute 被称为指令。指令带有前缀 v-,以表示它们是 Vue 提供的特殊 attribute。它们会在渲染的 DOM 上应用特殊的响应式行为。在这里,该指令的意思是:“将这个元素节点的 title attribute 和当前活跃实例的 message property 保持一致”。
处理用户输入
为了让用户和应用进行交互,我们可以用 v-on 指令添加一个事件监听器,通过它调用在实例中定义的方法:
<template>
<div>
<p>{{ message }}</p>
<button v-on:click="reverseMessage">反转 Message</button>
</div>
</template>
<script>
export default {
data() {
return {
message: 'Hello Vue.js!'
}
},
mounted() {
},
methods: {
reverseMessage() {
this.message = this.message
.split('')
.reverse()
.join('')
}
}
}
</script>
<style>
</style>
注意在这个方法中,我们更新了应用的状态,但没有触碰 DOM——所有的 DOM 操作都由 Vue 来处理,你编写的代码只需要关注逻辑层面即可。
Vue 还提供了 v-model 指令,它能轻松实现表单输入和应用状态之间的双向绑定。
<template>
<div>
<p>{{ message }}</p>
<input v-model="message" />
</div>
</template>
<script>
export default {
data() {
return {
message: 'Hello Vue!'
}
}
}
</script>
<style>
</style>
条件与循环
<template>
<div>
<span v-if="seen">现在你看到我了</span>
</div>
</template>
<script>
export default {
data(){
return {
seen: true
}
},
}
</script>
<style>
</style>
这个例子演示了我们不仅可以把数据绑定到 DOM 文本或 attribute,还可以绑定到 DOM 的结构。
还有其它很多指令,每个都有特殊的功能。例如,v-for 指令可以绑定数组的数据来渲染一个项目列表:
<template>
<div>
<ol>
<li v-for="todo in todos">
{{ todo.text }}
</li>
</ol>
</div>
</template>
<script>
export default {
data(){
return {
todos: [
{ text: 'Learn JavaScript' },
{ text: 'Learn Vue' },
{ text: 'Build something awesome' }
]
}
},
}
</script>
<style>
</style>
组件化应用构建
组件系统是 Vue 的另一个重要概念,因为它是一种抽象,允许我们使用小型、独立和通常可复用的组件构建大型应用。仔细想想,几乎任意类型的应用界面都可以抽象为一个组件树:
在 Vue 中,组件本质上是一个具有预定义选项的实例。在 Vue 中注册组件很简单:如对 app 对象所做的那样创建一个组件对象,并将其定义在父级组件的 components 选项中:
const TodoItem = {
template: `<li>This is a todo</li>`
}
// 创建 Vue 应用
const app = Vue.createApp({
components: {
TodoItem // 注册一个新组件
},
... // 组件的其它 property
})
// 挂载 Vue 应用
app.mount(...)
现在,你可以将其放到另一个组件的模板中:
<ol>
<!-- 创建一个 todo-item 组件实例 -->
<todo-item></todo-item>
</ol>
但是这样会为每个待办项渲染同样的文本,这看起来并不炫酷。我们应该能将数据从父组件传入子组件才对。让我们来修改一下组件的定义,使之能够接受一个 prop:
const TodoItem = {
props: ['todo'],
template: `<li>{{ todo.text }}</li>`
}
现在,我们可以使用 v-bind 指令将待办项传到循环输出的每个组件中:
<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>
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')
在一个大型应用中,有必要将整个应用程序划分为多个组件,以使开发更易管理。
<div id="app">
<app-nav></app-nav>
<app-view>
<app-sidebar></app-sidebar>
<app-content></app-content>
</app-view>
</div>