学习目标
Vue(发音为 /vju:/,类似 view)最近些年比较流行的前端框架之一,和React、Angular并称为前端三大框架。其中Vue简单易学的特点成为国内主流,很多公司已经把它列为一个前端开发人员必须要掌握的技术点了,目前ES6的学习,为我们学习Vue打下了基础,接下来我们来学习它吧。
1.1 Vue 简介
1.1.1 什么是Vue
Vue是一个用于构建用户界面的JavaScript框架,它主要用于开发Web应用程序。以下是对Vue的详细解释:
一、Vue的定义与特性
- 定义:Vue,发音类似于“view”,是一个渐进式JavaScript框架。它专注于视图层,旨在更好地组织与简化web开发。Vue的核心库只关注视图层,非常容易学习,也非常容易与其他库或已有项目整合。
- 特性:
- 组件化:Vue采用了组件化的方式来构建用户界面,允许开发人员创建可重复使用的组件。
- 响应式:Vue具有响应式编程的特性,当数据发生变化时,Vue会自动重新渲染组件,并更新页面上的内容。
- 渐进式:Vue可以自底向上逐层应用,其核心库只关注视图层,易于上手,同时能够与其他库或项目整合,为复杂的单页应用提供驱动。
二、Vue的核心概念
- MVVM模式:Vue采用了MVVM(Model-View-ViewModel)模式,其中ViewModel作为数据和视图的桥梁,实现了数据的双向绑定。这意味着当数据发生变化时,视图会自动更新;同样,当用户与视图交互时,数据也会相应变化。
- 数据驱动视图:Vue的核心是数据驱动视图,通过组件内特定的方法实现视图和模型的交互。这意味着开发人员可以通过操作数据来控制视图的显示。
三、Vue的应用场景与优势
- 应用场景:Vue适用于构建各种规模的Web应用程序,特别是单页应用(SPA)。它提供了丰富的API和第三方库,使得开发人员可以轻松地构建复杂的应用程序。
- 优势:
- 易于学习:Vue的语法简洁明了,易于上手。
- 高效:Vue采用了虚拟DOM技术,提高了页面的渲染效率。
- 灵活性:Vue可以与多种第三方库和工具集成,提供了丰富的功能。
四、Vue的生态系统
Vue的生态系统非常强大,包括Vuex(状态管理库)、Vue Router(路由管理器)、Vue CLI(脚手架工具)等。这些工具可以帮助开发人员更高效地构建和管理Vue应用程序。
五、Vue的版本与更新
Vue目前有两个主要版本:Vue 2和Vue 3。Vue 3引入了多项新特性和性能改进,包括更好的类型支持、更小的包体积、更快的渲染速度等。开发人员可以根据自己的需求选择合适的版本。
综上所述,Vue是一个功能强大、易于学习和使用的JavaScript框架,适用于构建各种规模的Web应用程序。它的组件化、响应式和渐进式特性使得开发人员可以更加高效地构建和管理应用程序。
1.1.2 MVVM思想
MVVM(Model-View-ViewModel)是一种软件架构设计模式,它结合了MVC(Model-View-Controller)和MVP(Model-View-Presenter)的优点,并特别适用于构建用户界面(UI),尤其是在前端开发中。以下是对MVVM思想的详细解释:
一、MVVM的核心思想
MVVM的核心思想是将界面逻辑与业务逻辑分离,通过数据绑定和事件驱动的方式实现视图(View)和模型(Model)之间的自动同步。具体来说,MVVM模式通过分离视图和模型,使得开发者可以更加专注于各自的领域。视图层负责界面的展示和用户交互,而模型层则处理业务逻辑和数据。
二、MVVM的组成部分
- Model(模型):
- 代表数据模型,可以在Model中定义数据修改和操作的业务逻辑。
- 负责封装应用的业务逻辑和数据。
- View(视图):
- 表示UI组件,负责将数据模型转换为UI展现出来。
- 负责封装UI和UI逻辑,包括数据绑定的声明、指令的声明、事件绑定的声明。
- ViewModel(视图模型):
- 是MVVM模式中的核心部分,它负责连接视图和模型。
- 包含界面的展示逻辑和与视图的交互逻辑,同时它还可以包含一些业务逻辑。
- 作为桥梁,连接视图(View)和模型(Model),能够实现数据变了页面自动更新的功能。
三、MVVM的工作原理
- 数据绑定机制:
- MVVM通过数据绑定机制实现视图和模型之间的自动同步。
- 当模型的数据发生变化时,视图会自动更新以反映这些变化。
- 事件驱动机制:
- 事件驱动机制使得视图可以响应用户的交互操作。
- 当用户与视图交互时,会触发相应的事件,并触发相应的业务逻辑。
四、MVVM的优势
- 分离关注点:
- 通过将视图和模型分离,提高了代码的可读性和可维护性。
- 开发人员可以更加专注于各自的领域,提高了开发效率。
- 数据绑定和事件驱动:
- 实现了视图和模型之间的自动同步和松耦合。
- 简化了界面与数据的交互过程。
- 组件化开发:
- 提高了代码的复用性和灵活性。
- 允许开发人员创建可重复使用的组件,降低了开发成本。
五、MVVM与MVC的区别
- 通信方式:
- MVVM:各部分之间的通信是双向的。视图(View)和视图模型(ViewModel)之间的数据绑定是双向的。
- MVC:通信是单向的。用户请求通常从视图(View)传递到控制器(Controller),然后控制器与模型(Model)交互,并将结果发送回视图。
- 关注点分离:
- MVVM:由于双向数据绑定的存在,开发者可以更专注于业务逻辑的实现,而无需过多关注视图和模型之间的同步问题。
- MVC:虽然也旨在实现关注点分离,但开发者通常需要手动处理视图和模型之间的同步,这可能会增加开发的复杂性。
- 应用场景:
- MVVM:通常用于前端开发,特别是构建复杂的单页应用程序(SPA)。
- MVC:最初主要用于服务器端Web开发,后来也广泛应用于客户端Web开发。
综上所述,MVVM思想通过分离视图和模型、实现数据绑定和事件驱动机制以及提供组件化开发方式等优势,为前端开发者提供了更加高效和可维护的开发方式。随着前端技术的不断发展,MVVM模式逐渐成为主流框架(如Vue、React、Angular等)的核心思想。
1.2 Vue入门
1.2.1 Vue体验
HTML部分:
- 一个带有id="app"的div容器,里面有一个文本输入框和一个h1标签。
- 文本输入框使用v-model指令绑定到Vue实例的youName数据属性上,实现双向数据绑定。
- h1标签使用双花括号{{ }}来显示youName的值。
JavaScript部分: - 第一个
<script type="module" src="/src/main.js"></script>标签尝试以模块的方式导入一个JavaScript文件。这通常用于ES6模块,但在这个简单的示例中可能不是必需的。 - 第二个
<script>标签包含了Vue实例的创建代码。- el: '#app’指定了Vue实例要挂载的DOM元素。
- data: { youName: ‘’ }定义了Vue实例的数据对象,其中包含一个youName属性,初始值为空字符串。

1.2.2 Vue开发步骤梳理
Vue.js 是一个用于构建用户界面的渐进式框架,特别适合单页面应用程序(SPA)。以下是一个使用 Vue.js 开发应用程序的基本步骤梳理,以及每个步骤中可能涉及的代码示例。请注意,这里假设你正在使用 Vue CLI 创建和管理你的项目。
- 安装 Vue CLI
首先,你需要全局安装 Vue CLI。如果你还没有安装,可以通过 npm 来安装:
npm install -g @vue/cli
- 创建一个新项目
使用 Vue CLI 创建一个新的 Vue 项目:
vue create my-vue-app
按照提示选择配置,或者直接使用默认配置。
- 进入项目目录并启动开发服务器
cd my-vue-app
npm run serve
这将启动一个本地开发服务器,并在浏览器中打开你的 Vue 应用。
-
项目结构
Vue CLI 会为你生成一个标准的项目结构。其中,src 目录是开发的主要目录,包含了所有的源代码。 -
编辑组件
在 src/components 目录下,你可以创建或编辑 Vue 组件。例如,创建一个名为 HelloWorld.vue 的组件(通常这个组件已经由 Vue CLI 自动生成):
<template>
<div class="hello">
<h1>{{ msg }}</h1>
<input v-model="name" placeholder="Enter your name">
<p>Hello, {{ name }}</p>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
props: {
msg: String
},
data() {
return {
name: ''
};
}
};
</script>
<style scoped>
h1 {
color: #42b983;
}
</style>
- 使用组件
在 src/App.vue 中,你可以引入并使用这个组件:
<template>
<div id="app">
<HelloWorld msg="Welcome to Your Vue.js App"/>
</div>
</template>
<script>
import HelloWorld from './components/HelloWorld.vue';
export default {
name: 'App',
components: {
HelloWorld
}
};
</script>
<style>
/* 你的全局样式 */
</style>
- 添加路由(可选)
如果你的应用需要多个页面,你可能需要添加 Vue Router。首先,安装 Vue Router:
npm install vue-router
然后,在 src/router/index.js 中配置路由(如果 Vue CLI 没有自动生成这个文件,你可以手动创建):
import Vue from 'vue';
import Router from 'vue-router';
import HelloWorld from '@/components/HelloWorld.vue';
Vue.use(Router);
export default new Router({
routes: [
{
path: '/',
name: 'HelloWorld',
component: HelloWorld
},
// 你可以在这里添加更多的路由配置
]
});
别忘了在 src/main.js 中引入并使用路由:
import Vue from 'vue';
import App from './App.vue';
import router from './router';
Vue.config.productionTip = false;
new Vue({
router,
render: h => h(App)
}).$mount('#app');
- 添加状态管理(可选)
对于复杂的应用,你可能需要使用 Vuex 来管理全局状态。安装 Vuex:
npm install vuex
在 src/store/index.js 中配置 Vuex(如果文件不存在,请手动创建):
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
export default new Vuex.Store({
state: {
// 你的全局状态
},
mutations: {
// 修改状态的方法
},
actions: {
// 异步操作
},
getters: {
// 从state派生状态
}
});
同样,在 src/main.js 中引入并使用 Vuex:
import store from './store';
// ...
new Vue({
router,
store,
render: h => h(App)
}).$mount('#app');
- 构建和部署
当你准备好将应用部署到生产环境时,你可以运行:
npm run build
这将在 dist 目录下生成一个构建好的应用,你可以将其部署到你的服务器上。
以上是使用 Vue.js 开发应用程序的基本步骤和代码示例。根据你的具体需求,你可能需要添加更多的功能、库或插件。
1.3 Vue指令
1.3.1 指令的概念
指令(Directives)是特殊的带有前缀 v- 的特性。指令的值限定为绑定表达式,因此插值表达式这里也是可以适用,只是不需要编写双花括号了。指令的职责就是当其表达式的值改变时把某些特殊的行为应用到DOM上。
1.3.2 常用指令
我们接下来学习Vue常用的指令吧,包括内容输出指令 v-text、v-html,条件渲染指令v-if、v-else、v-show,列表渲染指令v-for,数据绑定指令v-model、v-bind,事件绑定指令v-on等。
当然,以下是一些Vue常用指令的示例代码,这些代码展示了如何在Vue组件或实例中使用这些指令。
数据绑定指令
v-text
<div v-text="message"></div>
<!-- 等同于 -->
<div>{{ message }}</div>
v-html
<div v-html="rawHtml"></div>
v-bind
<a v-bind:href="url">Link</a>
<!-- 简写 -->
<a :href="url">Link</a>
v-model
<input v-model="inputValue" type="text">
<p>You typed: {{ inputValue }}</p>
条件渲染指令
v-if
<p v-if="seen">Now you see me</p>
<p v-else>Now you don't</p>
v-else-if
<div v-if="type === 'A'">A</div>
<div v-else-if="type === 'B'">B</div>
<div v-else>Not A/B</div>
v-show
<p v-show="seen">Hello</p>
列表渲染指令
v-for
<ul>
<li v-for="item in items" :key="item.id">{{ item.text }}</li>
</ul>
其他指令
v-cloak(通常与CSS一起使用以避免加载时的闪烁)
<style>
[v-cloak] {
display: none;
}
</style>
<div v-cloak>{{ message }}</div>
<!-- 当Vue实例加载并解析完模板后,v-cloak属性会被移除,div将显示内容 -->
v-once
<span v-once>This will never change: {{ message }}</span>
v-pre
<span v-pre>{{ This will not be compiled }}</span>
<!-- 显示原始内容,不进行编译 -->
v-on
<button v-on:click="doSomething">Click me</button>
<!-- 简写 -->
<button @click="doSomething">Click me</button>
在Vue组件或实例的JavaScript部分,你需要定义这些模板中使用的数据和方法:
new Vue({
el: '#app',
data: {
message: 'Hello Vue!',
rawHtml: '<strong>Raw HTML</strong>',
url: 'https://vuejs.org',
seen: true,
type: 'A',
inputValue: '',
items: [
{ id: 1, text: 'Item 1' },
{ id: 2, text: 'Item 2' }
]
},
methods: {
doSomething() {
alert('Button clicked!');
}
}
});
请注意:在实际项目中,你可能需要将Vue实例挂载到一个具体的DOM元素上(如上面的el: '#app’所示),并确保你的HTML模板中有一个对应的元素(如
<div id="app">…</div>)。同时,上面的示例代码是为了说明目的而简化的,实际项目中可能需要更复杂的结构和逻辑。
1.4 Vue 计算属性
在Vue中,计算属性(computed properties)是基于它们的依赖进行缓存的响应式属性。只有当相关依赖发生改变时,它们才会重新求值。这对于执行复杂逻辑或避免在模板中编写冗长的表达式非常有用。
1.4.1 什么是计算属性
以下是一个Vue组件中使用计算属性的示例代码:
<div id="app">
<p>Original message: "{{ message }}"</p>
<p>Reversed message: "{{ reversedMessage }}"</p>
</div>
new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
},
computed: {
// 计算属性:reversedMessage
reversedMessage: function () {
// 这里我们返回了 message 的反转字符串
return this.message.split('').reverse().join('');
}
}
});
在这个例子中,我们有一个名为message的数据属性,以及一个名为reversedMessage的计算属性。reversedMessage计算属性依赖于message,并且当message的值改变时,reversedMessage会自动更新为message的反转字符串。
注意几点:
- 声明位置:计算属性在Vue实例的computed选项中声明。
- 方法形式:每个计算属性都是一个方法,当它们被访问时,这些方法会被调用,并且它们的返回值会被缓存起来,直到相关依赖发生变化。
- 缓存:计算属性是基于它们的响应式依赖进行缓存的。如果依赖没有改变,多次访问计算属性会立即返回之前的计算结果,而不会重新执行方法。
- 模板中使用:在模板中,你可以像访问普通数据属性一样访问计算属性。
计算属性非常适合用于任何复杂的逻辑,这些逻辑依赖于其他数据,并且需要在模板中多次使用。它们提供了一种声明式的方式来描述组件的状态,并且使得组件更加易于理解和维护。
1.4.2 计算属性基本用法
在 Vue.js 中,计算属性(computed properties)用于基于组件数据的变化动态计算值。它们类似于方法,但不同的是,计算属性是基于它们的依赖进行缓存的,只有在相关依赖发生变化时才会重新计算。这使得它们在处理复杂逻辑时更高效。
下面是一个简单的例子,展示了 Vue.js 中计算属性的基本用法:
1. HTML 部分
<!DOCTYPE html>
<html>
<head>
<title>Vue.js Computed Properties Example</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
</head>
<body>
<div id="app">
<p>FirstName: {{ firstName }}</p>
<p>LastName: {{ lastName }}</p>
<p>FullName: {{ fullName }}</p>
<input v-model="firstName" placeholder="Enter first name">
<input v-model="lastName" placeholder="Enter last name">
</div>
<script src="app.js"></script>
</body>
</html>
- JavaScript 部分(app.js)
new Vue({
el: '#app',
data: {
firstName: '',
lastName: ''
},
computed: {
fullName: function () {
return this.firstName + ' ' + this.lastName;
}
}
});
解释
HTML 部分:
- 使用 v-model 指令绑定输入框的值到 Vue 实例的 firstName 和 lastName 数据属性。
- 使用插值表达式 {{ }} 显示 firstName、lastName 和计算属性 fullName。
JavaScript 部分:
- 创建一个新的 Vue 实例,并绑定到 #app 元素。
- 在 data 对象中定义 firstName 和 lastName 两个数据属性。
- 在 computed 对象中定义 fullName 计算属性,它返回 firstName 和 lastName 的组合。
工作原理
- 当用户在输入框中输入 firstName 或 lastName 时,v-model 指令会更新 Vue 实例中相应的数据属性。
- 由于 fullName 是一个计算属性,它依赖于 firstName 和 lastName。因此,每当这两个属性之一发生变化时,fullName 会自动重新计算并更新视图。
- 计算属性 fullName 的返回值会被缓存,直到其依赖的 firstName 或 lastName 发生变化。这提高了性能,因为计算属性不会在每个重新渲染时都重新计算。


被折叠的 条评论
为什么被折叠?



