Vue.js是一个流行的JavaScript前端框架,用于构建用户界面和单页应用。它以易学易用、灵活渐进和高性能著称。本文将全面介绍Vue.js的核心概念和基础知识,帮助你快速入门并掌握这一强大的前端框架。
什么是Vue.js?
Vue.js是一个用于构建用户界面的渐进式JavaScript框架。与其他重量级框架不同,Vue被设计为可以逐步采用。Vue的核心库只关注视图层,易于上手,同时与其他库或已有项目整合。
Vue.js的主要特点
- 易学易用:较低的学习曲线,简洁的API
- 渐进式框架:可以根据需求逐步采用Vue的不同部分
- 响应式数据绑定:数据变化时自动更新DOM
- 组件化开发:构建可复用的UI组件
- 虚拟DOM:高效的DOM更新机制
- 轻量级:压缩后约20KB,运行时性能优秀
1. 安装和引入Vue
有多种方式可以在项目中使用Vue:
方法1:通过CDN直接引入
最简单的方式是通过CDN链接直接在HTML中引入Vue:
<!-- 开发环境版本,包含有用的警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<!-- 或者 -->
<!-- 生产环境版本,优化了尺寸和速度 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
方法2:使用npm安装
如果你使用构建工具(如webpack),可以通过npm安装Vue:
# 安装Vue 2
npm install vue@2
# 安装Vue 3
npm install vue@next
方法3:使用Vue CLI创建项目
Vue CLI是官方提供的项目脚手架工具,可以快速创建一个配置完善的Vue项目:
# 安装Vue CLI
npm install -g @vue/cli
# 创建一个新项目
vue create my-project
# 启动开发服务器
cd my-project
npm run serve
2. Vue实例 - 应用的起点
每个Vue应用都是从创建一个Vue实例开始的:
// Vue 2
const app = new Vue({
el: '#app', // 挂载点(DOM元素)
data: { // 数据
message: '你好,Vue!'
}
});
// Vue 3
const app = Vue.createApp({
data() {
return {
message: '你好,Vue 3!'
}
}
});
app.mount('#app');
Vue实例的主要选项
- el: 指定Vue实例挂载的DOM元素(Vue 2)
- data: 存储应用的数据
- methods: 定义方法
- computed: 计算属性
- watch: 侦听器
- lifecycle hooks: 生命周期钩子函数
- components: 注册组件
3. 模板语法 - 声明式渲染
Vue使用基于HTML的模板语法,允许我们声明式地将DOM绑定到Vue实例的数据。
文本插值
使用双大括号语法(Mustache语法)进行文本插值:
<div id="app">
<p>{{ message }}</p>
</div>
<script>
new Vue({
el: '#app',
data: {
message: '你好,Vue!'
}
});
</script>
当message
数据变化时,页面上的文本也会自动更新。
绑定HTML属性
使用v-bind
指令绑定HTML属性:
<div id="app">
<a v-bind:href="url">点击访问</a>
<!-- 简写形式 -->
<img :src="imageUrl" :alt="imageAlt">
</div>
<script>
new Vue({
el: '#app',
data: {
url: 'https://vuejs.org',
imageUrl: 'logo.png',
imageAlt: 'Vue Logo'
}
});
</script>
条件渲染
使用v-if
、v-else-if
和v-else
指令进行条件渲染:
<div id="app">
<p v-if="seen">现在你看到我了</p>
<p v-else>我被隐藏了</p>
<div v-if="type === 'A'">A</div>
<div v-else-if="type === 'B'">B</div>
<div v-else-if="type === 'C'">C</div>
<div v-else>Not A/B/C</div>
</div>
v-show
指令也可以用于条件显示,但它只是切换元素的CSS display
属性:
<p v-show="seen">使用v-show的元素始终会被渲染,只是切换显示状态</p>
列表渲染
使用v-for
指令基于数组渲染列表:
<div id="app">
<ul>
<li v-for="item in items" :key="item.id">
{{ item.text }}
</li>
</ul>
</div>
<script>
new Vue({
el: '#app',
data: {
items: [
{ id: 1, text: '学习 JavaScript' },
{ id: 2, text: '学习 Vue' },
{ id: 3, text: '创建项目' }
]
}
});
</script>
注意:使用v-for
时,建议提供key
属性以帮助Vue跟踪每个节点的身份,从而重用和重新排序现有元素。
事件处理
使用v-on
指令监听DOM事件:
<div id="app">
<p>{{ message }}</p>
<button v-on:click="reverseMessage">反转消息</button>
<!-- 简写形式 -->
<button @click="reverseMessage">反转消息</button>
</div>
<script>
new Vue({
el: '#app',
data: {
message: '你好,Vue!'
},
methods: {
reverseMessage: function() {
this.message = this.message.split('').reverse().join('');
}
}
});
</script>
事件修饰符:
<!-- 阻止单击事件继续传播 -->
<a @click.stop="doThis"></a>
<!-- 提交事件不再重载页面 -->
<form @submit.prevent="onSubmit"></form>
<!-- 修饰符可以串联 -->
<a @click.stop.prevent="doThat"></a>
<!-- 只有在 event.target 是元素本身时才触发处理函数 -->
<div @click.self="doThat">...</div>
<!-- 点击事件将只会触发一次 -->
<a @click.once="doThis"></a>
表单输入绑定
使用v-model
指令在表单元素上创建双向数据绑定:
<div id="app">
<input v-model="message" placeholder="编辑我...">
<p>消息是: {{ message }}</p>
<textarea v-model="description" placeholder="多行文本..."></textarea>
<input type="checkbox" id="checkbox" v-model="checked">
<label for="checkbox">{{ checked }}</label>
<select v-model="selected">
<option disabled value="">请选择</option>
<option>A</option>
<option>B</option>
<option>C</option>
</select>
<span>选择: {{ selected }}</span>
</div>
4. 计算属性和侦听器
计算属性
计算属性用于处理复杂逻辑,它们会缓存结果,只有在依赖的响应式属性变化时才会重新计算:
const app = new Vue({
el: '#app',
data: {
message: 'Hello'
},
computed: {
// 计算属性的getter
reversedMessage: function() {
// `this` 指向 vm 实例
return this.message.split('').reverse().join('');
},
// 带有getter和setter的计算属性
fullName: {
get: function() {
return this.firstName + ' ' + this.lastName;
},
set: function(newValue) {
const names = newValue.split(' ');
this.firstName = names[0];
this.lastName = names[names.length - 1];
}
}
}
});
侦听器
侦听器用于响应数据的变化并执行异步或开销较大的操作:
const app = new Vue({
el: '#app',
data: {
question: '',
answer: '问题通常包含一个问号。'
},
watch: {
// 如果 question 发生改变,这个函数就会运行
question: function(newQuestion, oldQuestion) {
this.answer = '等待输入停止...';
this.debouncedGetAnswer();
}
},
created: function() {
// _.debounce 是一个通过 lodash 限制操作频率的函数
this.debouncedGetAnswer = _.debounce(this.getAnswer, 500);
},
methods: {
getAnswer: function() {
if (this.question.indexOf('?') === -1) {
this.answer = '问题通常包含一个问号。';
return;
}
this.answer = '思考中...';
const vm = this;
axios.get('https://yesno.wtf/api')
.then(function(response) {
vm.answer = response.data.answer;
})
.catch(function(error) {
vm.answer = '错误!无法访问 API。' + error;
});
}
}
});
5. 组件 - 可复用的Vue实例
组件是Vue的核心功能之一,它们是可复用的Vue实例,带有自定义名称:
全局注册组件
// Vue 2
Vue.component('button-counter', {
data: function() {
return {
count: 0
}
},
template: '<button @click="count++">你点击了 {{ count }} 次</button>'
});
// Vue 3
const app = Vue.createApp({});
app.component('button-counter', {
data() {
return {
count: 0
}
},
template: '<button @click="count++">你点击了 {{ count }} 次</button>'
});
局部注册组件
const ComponentA = {
data() {
return { ... }
},
template: '...'
};
const ComponentB = {
data() {
return { ... }
},
template: '...'
};
const app = new Vue({
el: '#app',
components: {
'component-a': ComponentA,
'component-b': ComponentB
}
});
组件之间的通信
Props(父组件向子组件传递数据)
// 子组件
Vue.component('blog-post', {
props: ['title'],
template: '<h3>{{ title }}</h3>'
});
// 父组件模板
<blog-post title="Vue学习笔记"></blog-post>
<blog-post title="Vue组件详解"></blog-post>
自定义事件(子组件向父组件传递数据)
// 子组件
Vue.component('button-counter', {
template: '<button @click="incrementCounter">{{ counter }}</button>',
data() {
return {
counter: 0
}
},
methods: {
incrementCounter() {
this.counter++;
this.$emit('increment', this.counter); // 触发自定义事件
}
}
});
// 父组件模板
<div id="app">
<p>子组件点击次数:{{ total }}</p>
<button-counter @increment="incrementTotal"></button-counter>
</div>
// 父组件实例
new Vue({
el: '#app',
data: {
total: 0
},
methods: {
incrementTotal(value) {
this.total = value;
}
}
});
6. 生命周期钩子
Vue实例在创建、更新和销毁的过程中会触发一系列生命周期钩子:
new Vue({
data: {
message: '你好,Vue!'
},
beforeCreate() {
console.log('实例初始化之后,数据观测和事件配置之前');
},
created() {
console.log('实例创建完成后。数据观测、属性和方法的运算,watch/event事件回调已完成');
},
beforeMount() {
console.log('挂载开始之前被调用');
},
mounted() {
console.log('实例被挂载后调用。此时可以访问DOM元素');
},
beforeUpdate() {
console.log('数据更新时调用,发生在虚拟DOM重新渲染和打补丁之前');
},
updated() {
console.log('数据更改导致的虚拟DOM重新渲染和打补丁之后');
},
beforeDestroy() {
console.log('实例销毁之前调用');
},
destroyed() {
console.log('实例销毁后调用');
}
});
总结
Vue.js是一个强大而灵活的前端框架,它通过简洁的API和渐进式设计理念,使开发者能够轻松构建交互式Web应用。本文介绍了Vue的核心概念和基础知识,包括:
- Vue实例和基本配置
- 模板语法和数据绑定
- 条件渲染和列表渲染
- 事件处理和表单输入绑定
- 计算属性和侦听器
- 组件系统和组件通信
- 生命周期钩子
掌握这些核心概念后,你可以开始构建自己的Vue应用。随着经验的积累,你可以进一步学习更高级的主题,如Vue Router(路由管理)、Vuex(状态管理)、Vue CLI(项目脚手架)等。