从入门到深入:Vue.js 学习全攻略
一、Vue.js 入门基础
(一)Vue.js 简介与环境搭建
Vue.js 是一套用于构建用户界面的渐进式 JavaScript 框架,所谓渐进式,意味着开发者可以根据项目需求,灵活地选择使用 Vue 的功能。它既可以嵌入到简单的 HTML 页面中,为网页添加交互性,也可以用于构建大型单页应用(SPA)。
在开始学习 Vue 之前,需要搭建开发环境。最基础的方式是直接通过<script>
标签引入 Vue.js 的 CDN 链接,将其添加到 HTML 文件中,这种方式适合快速体验和小型项目:
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>Vue入门</title><script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head>
<body><div id="app">{{ message }}</div><script>new Vue({el: '#app',data: {message: 'Hello Vue!'}});</script>
</body>
</html>
上述代码中,通过new Vue()
创建了一个 Vue 实例,el
属性指定了 Vue 实例要控制的 HTML 元素,data
属性定义了数据,在模板中通过{{ message }}
语法可以将数据渲染到页面上。
对于大型项目,推荐使用 Node.js 和 npm(Node Package Manager)来管理项目依赖和构建工具。首先需要安装 Node.js,安装完成后,使用以下命令创建一个基于 Vue 的项目:
npm install -g @vue/cli
vue create my-vue-project
执行上述命令后,会进入一系列交互式的配置选项,根据项目需求选择相应的配置,即可创建一个完整的 Vue 项目,项目中包含了基础的目录结构和配置文件。
(二)Vue 实例与数据绑定
Vue 实例是 Vue 应用的核心,每个 Vue 应用都是通过创建一个 Vue 实例开始的。除了前面提到的el
和data
属性外,Vue 实例还有许多其他重要的属性和方法。
数据绑定是 Vue 的核心特性之一,它允许将数据与视图进行关联,当数据发生变化时,视图会自动更新。Vue 支持两种主要的数据绑定方式:插值表达式({{ }}
)和指令。插值表达式用于在 HTML 元素内容中显示数据,而指令则用于操作 HTML 元素的属性和行为。例如,v-bind
指令用于绑定 HTML 元素的属性:
<div id="app"><img v-bind:src="imageUrl" alt="图片">
</div>
<script>new Vue({el: '#app',data: {imageUrl: 'https://example.com/image.jpg'}});
</script>
上述代码中,v-bind:src
将imageUrl
数据绑定到<img>
标签的src
属性上,当imageUrl
的值改变时,图片的显示也会相应改变。
(三)指令基础
Vue 提供了丰富的指令,用于实现各种功能。除了v-bind
指令外,常见的还有v-on
指令用于绑定事件,v-show
和v-if
指令用于控制元素的显示与隐藏,v-for
指令用于循环渲染数据。
v-on
指令的使用示例:
<div id="app"><button v-on:click="count++">点击计数</button><p>计数:{{ count }}</p>
</div>
<script>new Vue({el: '#app',data: {count: 0}});
</script>
在上述代码中,通过v-on:click
绑定了一个点击事件,当按钮被点击时,count
的值会自增,视图也会随之更新。
v-show
和v-if
虽然都能控制元素的显示与隐藏,但它们的实现原理不同。v-show
是通过 CSS 的display
属性来控制元素的显示,无论初始条件如何,元素都会被渲染到 DOM 中;而v-if
是根据条件动态地创建或销毁元素,只有在条件为真时,元素才会被渲染到 DOM 中。
v-for
指令用于循环渲染数组或对象:
<div id="app"><ul><li v-for="item in items">{{ item }}</li></ul>
</div>
<script>new Vue({el: '#app',data: {items: ['苹果', '香蕉', '橙子']}});
</script>
上述代码中,v-for
指令遍历items
数组,并为每个数组元素渲染一个<li>
标签。
二、Vue.js 核心进阶
(一)组件化开发
组件化是 Vue.js 开发大型应用的关键。组件是可复用的 Vue 实例,每个组件都有自己的模板、数据、方法和生命周期钩子。通过将应用拆分成多个组件,可以提高代码的复用性和可维护性。
在 Vue 中定义组件有两种方式:全局组件和局部组件。全局组件通过Vue.component()
方法注册,在整个 Vue 应用中都可以使用;局部组件则在某个 Vue 实例的components
选项中定义,只能在该实例及其子组件中使用。
全局组件示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>组件示例</title><script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head>
<body><div id="app"><my-component></my-component></div><script>Vue.component('my-component', {template: '<div>这是一个全局组件</div>'});new Vue({el: '#app'});</script>
</body>
</html>
局部组件示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>组件示例</title><script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head>
<body><div id="app"><child-component></child-component></div><script>var childComponent = {template: '<div>这是一个局部组件</div>'};new Vue({el: '#app',components: {'child-component': childComponent}});</script>
</body>
</html>
组件之间还可以通过 props 进行数据传递,props 是父组件向子组件传递数据的方式;通过事件($emit)实现子组件向父组件传递数据,从而实现组件间的通信。
(二)计算属性与侦听器
计算属性是基于响应式依赖进行缓存的,只有相关响应式依赖发生改变时才会重新求值,适用于需要根据其他数据进行复杂计算并显示的场景。例如:
<div id="app"><p>原始数据:{{ num1 }}</p><p>原始数据:{{ num2 }}</p><p>计算结果:{{ sum }}</p>
</div>
<script>new Vue({el: '#app',data: {num1: 1,num2: 2},computed: {sum: function () {return this.num1 + this.num2;}}});
</script>
在上述代码中,sum
是一个计算属性,它依赖于num1
和num2
,当num1
或num2
发生变化时,sum
会自动重新计算并更新视图。
侦听器(watch)则用于监听数据的变化,并在数据变化时执行特定的操作。它可以用于异步操作或比较复杂的逻辑处理:
<div id="app"><input v-model="message">
</div>
<script>new Vue({el: '#app',data: {message: ''},watch: {message: function (newValue, oldValue) {console.log('数据发生变化,旧值:' + oldValue + ',新值:' + newValue);}}});
</script>
上述代码中,当message
的值发生变化时,侦听器函数会被调用,并在控制台输出旧值和新值。
(三)Vue Router 路由
Vue Router 是 Vue.js 官方的路由管理器,用于构建单页应用的路由系统。它允许根据不同的 URL 地址,显示不同的组件内容,实现页面的切换和导航。
在使用 Vue Router 之前,需要先安装它:
npm install vue-router
然后在 Vue 项目中进行配置和使用。首先创建路由组件:
// Home.vue
export default {template: '<div>这是首页</div>'
};
// About.vue
export default {template: '<div>这是关于页面</div>'
};
接着配置路由:
import Vue from 'vue';
import VueRouter from 'vue-router';
import Home from './components/Home.vue';
import About from './components/About.vue';Vue.use(VueRouter);const routes = [{path: '/',name: 'Home',component: Home},{path: '/about',name: 'About',component: About}
];const router = new VueRouter({routes
});export default router;
最后在 Vue 实例中使用路由:
import Vue from 'vue';
import App from './App.vue';
import router from './router';new Vue({router,render: h => h(App)
}).$mount('#app');
在 HTML 模板中,可以通过<router-link>
组件实现导航链接,通过<router-view>
组件显示当前路由对应的组件内容:
<template><div id="app"><router-link to="/">首页</router-link> |<router-link to="/about">关于</router-link><router-view></router-view></div>
</template>
三、Vue.js 深入应用
(一)Vuex 状态管理
Vuex 是 Vue.js 的状态管理模式,用于集中管理 Vue 应用的共享数据,解决组件间数据共享和状态管理的问题。它采用单向数据流的方式,使得数据的变化更加可预测和易于调试。
Vuex 包含以下几个核心概念:
- state:存储应用的状态数据,是响应式的,组件可以通过计算属性来获取状态数据。
- mutations:用于修改 state 中的数据,必须是同步函数。
- actions:可以包含异步操作,通过提交 mutations 来修改 state。
- getters:类似于计算属性,用于对 state 中的数据进行加工和处理,方便组件获取特定格式的数据。
以下是一个简单的 Vuex 示例:
// store.js
import Vue from 'vue';
import Vuex from 'vuex';Vue.use(Vuex);const store = new Vuex.Store({state: {count: 0},mutations: {increment: function (state) {state.count++;}},actions: {incrementAsync: function ({ commit }) {setTimeout(() => {commit('increment');}, 1000);}},getters: {doubleCount: function (state) {return state.count * 2;}}
});export default store;
在 Vue 组件中使用 Vuex:
<template><div><p>计数:{{ count }}</p><p>双倍计数:{{ doubleCount }}</p><button @click="increment">自增</button><button @click="incrementAsync">异步自增</button></div>
</template>
<script>
import { mapState, mapGetters, mapMutations, mapActions } from 'vuex';
export default {computed: {...mapState(['count']),...mapGetters(['doubleCount'])},methods: {...mapMutations(['increment']),...mapActions(['incrementAsync'])}
};
</script>
(二)Vue.js 项目优化
在实际开发中,随着项目规模的增大,需要对 Vue.js 项目进行优化,以提高应用的性能和用户体验。常见的优化方式包括:
- 代码分割:将代码按路由或功能模块进行分割,只在需要时加载相应的代码,减少初始加载的文件大小。可以使用 Webpack 的动态导入(
import()
)来实现代码分割。 - 组件优化:合理使用
v-if
和v-show
,避免不必要的组件重新渲染;使用v-once
指令对不需要响应式更新的元素进行一次性渲染。 - 图片优化:对图片进行压缩处理,使用合适的图片格式(如 WebP),并设置图片的
width
和height
属性,避免图片加载时的重排和重绘。 - 缓存策略:对于一些不经常变化的数据,可以使用浏览器缓存或本地存储进行缓存,减少服务器请求。
(三)Vue.js 与其他技术的整合
Vue.js 可以与许多其他技术进行整合,拓展应用的功能。例如,与后端 API 进行交互,可以使用 Axios 库发送 HTTP 请求;与地图服务整合,可以使用 Vue 与百度地图或高德地图的相关插件;与 WebSocket 结合,可以实现实时通信功能。
以 Axios 为例,安装 Axios 后:
npm install axios
在 Vue 项目中使用 Axios:
import Vue from 'vue';
import axios from 'axios';Vue.prototype.$axios = axios;// 在组件中使用
export default {methods: {async fetchData() {try {const response = await this.$axios.get('https://example.com/api/data');console.log(response.data);} catch (error) {console.error(error);}}}
};
四、学习资源推荐
(一)官方文档
- Vue 2 官方文档:https://cn.vuejs.org/v2/guide/,详细介绍了 Vue 2 的各种特性、用法和 API,是学习 Vue 2 的权威资料。
- Vue 3 官方文档:简介 | Vue.js,全面阐述了 Vue 3 的新特性和变化,对于想要深入学习 Vue 3 的开发者来说是必不可少的参考。
(二)学习网站
- 慕课网:慕课网-程序员的梦工厂,提供了大量的 Vue.js 相关课程,从入门到进阶,涵盖各种实战项目,适合不同阶段的学习者。
- 网易云课堂:网易云课堂 - 悄悄变强大,有丰富的 Vue.js 课程资源,课程内容丰富多样,包含理论讲解和实际案例。
- B 站:哔哩哔哩 (゜-゜)つロ 干杯~-bilibili,许多 UP 主分享了 Vue.js 的学习教程和实战经验,视频形式更加生动直观,便于理解。
(三)书籍推荐
- 《Vue.js 实战》:通过实际案例,详细介绍了 Vue.js 的各种特性和应用场景,适合有一定基础的开发者深入学习和实践。
- 《Vue.js 设计与实现》:深入剖析 Vue.js 的内部原理和实现机制,对于想要深入理解 Vue.js 运行机制、提升技术水平的开发者来说是一本非常有价值的书籍。
相关文章:
从入门到深入:Vue.js 学习全攻略
一、Vue.js 入门基础 (一)Vue.js 简介与环境搭建 Vue.js 是一套用于构建用户界面的渐进式 JavaScript 框架,所谓渐进式,意味着开发者可以根据项目需求,灵活地选择使用 Vue 的功能。它既可以嵌入到简单的 HTML 页面中…...
C++八股--6--mysql 日志与并发控制
这里向大家介绍一下数据库基础:共分为以下章节 10前序.日志系统 这是数据库的核心。我放到首页来介绍,给大家一个前置概念,方便进行更好的学习 日志文件我们用来记录事务对数据库更新操作的文件,分为以记录为单位的文件和数据块…...

DeepSeek实战--手搓实现Agent
1.背景 要学习AI agent,只会用agent 框架,还不够,一旦框架出现问题,没法快速的排查出问题。 学习就应该“知其然,更应该知其所以然” ,今天我们就用编码的方式实现一个简单的agent 。我们模拟一套AI学生评…...
Hutool的`BeanUtil.toBean`方法详解
BeanUtil.toBean是Hutool工具包中一个非常实用的JavaBean转换工具方法,它能够方便地将一个对象(通常是Map或另一个JavaBean)转换为目标类型的JavaBean实例。 方法签名 public static <T> T toBean(Object source, Class<T> tar…...

线性代数——行列式⭐
目录 一、行列式的定义⭐ 1-1、三阶行列式练习 1-2、下面介绍下三角行列式、上三角行列式、对角行列式 编辑 二、行列式的性质 2-1、性质1,2,3,4,5,6 编辑 2-2、性质7 2- 3、拉普拉斯定理、克莱姆法则 三…...

iPhone手机连接WiFi异常解决方法
iPhone手机连接WiFi异常解决方法 一、问题现象二、iPhone连不上可能的原因三、基础排查与快速修复第一步:重启大法第二步:忽略网络,重新认证第三步:关闭“私有无线局域网地址”第四步:修改DNS服务器第五步:还原网络设置四、路由器端排查及设置关闭MAC地址过滤或添加到白名…...
Spark缓存
生活中缓存容量受成本和体积限制(比如 CPU 缓存只有几 MB 到几十 MB),但会通过算法(如 “最近最少使用” 原则)智能决定存什么,确保存的是 “最可能被用到的数据”。 1. 为什么需要缓存? 惰性执…...
计算机视觉与深度学习 | 基于Transformer的低照度图像增强技术
基于Transformer的低照度图像增强技术通过结合Transformer的全局建模能力和传统图像增强理论(如Retinex),在保留颜色信息、抑制噪声和平衡亮度方面展现出显著优势。以下是其核心原理、关键公式及典型代码实现: 一、原理分析 1. 全局依赖建模与局部特征融合 Transformer的核…...

学习设计模式《八》——原型模式
一、基础概念 原型模式的本质是【克隆生成对象】; 原型模式的定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象 。 原型模式的功能: 1、通过克隆来创建新的对象实例; 2、为克隆出来的新对象实例复制…...

疗愈服务预约小程序源码介绍
基于ThinkPHP、FastAdmin和UniApp开发的疗愈服务预约小程序源码,这款小程序在功能设计和用户体验上都表现出色,为疗愈行业提供了一种全新的服务模式。 该小程序源码采用了ThinkPHP作为后端框架,保证了系统的稳定性和高效性。同时,…...
如何通过外网访问内网?对比5个简单的局域网让互联网连接方案
在实际应用中,常常需要从外网访问内网资源,如远程办公访问公司内部服务器、在家访问家庭网络中的设备等。又或者在本地内网搭建的项目应用需要提供互联网服务。以下介绍几种常见的外网访问内网、内网提供公网连接实现方法参考。 一、公网IP路由器端口映…...
Linux 服务器静态 IP 配置初始化指南
✅ 第一步:确认网络管理方式 运行以下命令判断系统使用的网络管理服务: # 检查 NetworkManager 是否活跃 systemctl is-active NetworkManager# 检查 network(旧服务)是否活跃 systemctl is-active network或者检查配置路径&…...

【随笔】Google学术:but your computer or network may be sending automated queries.
文章目录 一、问题复述二、问题原因三、解决 前提:你的xxx是自己做的,你自己可以管理,而不是用的那些劣质✈场。 一、问题复述 🟢如下图所示:可以打开谷歌学术,但是一搜索就是这个界面。 二、问题原因 …...

长事务:数据库中的“隐形炸弹“——金仓数据库运维避坑指南
引言:凌晨三点的告警 "张工!生产库又告警了!"凌晨三点的电话铃声总是格外刺耳。运维团队发现数据库频繁进入单用户模式,排查发现某核心表的年龄值(Age)已突破20亿大关。经过一夜奋战,…...

ubuntu nobel + qt5.15.2 设置qss语法识别正确
问题展示 解决步骤 首选项里面的高亮怎么编辑选择都没用。如果已经有generic-highlighter和css.xml,直接修改css.xml文件最直接! 在generic-highlighter目录下找到css.xml文件,位置是:/opt/Qt/Tools/QtCreator/share/qtcreator/…...
优化01-统计信息
Oracle 的统计信息是数据库优化器生成高效执行计划的核心依据。它记录了数据库对象(如表、索引、列等)的元数据信息,帮助优化器评估查询成本并选择最优执行路径。以下是关于 Oracle 统计信息的详细介绍: 一、统计信息的分类 表统…...

Unity-Socket通信实例详解
今天我们来讲解socket通信。 首先我们需要知道什么是socket通信: Socket本质上就是一个个进程之间网络通信的基础,每一个Socket由IP端口组成,熟悉计网的同学应该知道IP主要是应用于IP协议而端口主要应用于TCP协议,这也证明了Sock…...

MATLAB仿真定点数转浮点数(对比VIVADO定点转浮点)
MATLAB仿真定点数转浮点数 定点数可设置位宽,小数位宽;浮点数是单精度浮点数 对比VIVADO定点转浮点 目录 前言 一、定点数 二、浮点数 三、定点数转浮点数 四、函数代码 总结 前言 在FPGA上实现算法时,相比MATLAB实现往往需要更长的开发…...
配置Jupyter Notebook环境及Token认证(Linux服务器)
配置Jupyter Notebook环境及Token认证(Linux服务器) 背景 在Ubuntu 18.04.6 LTS服务器(IP: 39.105.167.2)上,基于虚拟环境pytorch_env,通过Mac终端(SSH)配置Jupyter Notebook环境&…...

【计算机网络】Cookie、Session、Token之间有什么区别?
大家在日常使用浏览器时可能会遇到:是否清理Cookie?这个问题。 那么什么是Cookie呢?与此相关的还有Session、Token这些。这两个又是什么呢? 本文将对这三个进行讲解区分,如果对小伙伴有帮助的话,也请点赞、…...

SpringCloud服务拆分:Nacos服务注册中心 + LoadBalancer服务负载均衡使用
SpringCloud中Nacos服务注册中心 LoadBalancer服务负载均衡使用 前言Nacos工作流程nacos安装docker安装window安装 运行nacos微服务集成nacos高级特性1.服务集群配置方法效果图模拟服务实例宕机 2.权重配置3.环境隔离 如何启动集群节点本地启动多个节点方法 LoadBalancer集成L…...
Spring AI 集成 DeepSeek V3 模型开发指南
Spring AI 集成 DeepSeek V3 模型开发指南 前言 在人工智能飞速发展的当下,大语言模型不断推陈出新,DeepSeek AI 推出的开源 DeepSeek V3 模型凭借其卓越的推理和问题解决能力备受瞩目。与此同时,Spring AI 作为一个强大的框架,…...

Apache Doris 使用指南:从入门到生产实践
目录 一、Doris 核心概念 1.1 架构组成 1.2 数据模型 二、Doris 部署方式 2.1 单机部署(测试环境) 2.2 集群部署(生产环境) 三、数据操作指南 3.1 数据库与表管理 3.2 数据导入方式 3.2.1 批量导入 3.2.2 实时导入 3.…...

26届秋招收割offer指南
26届暑期实习已经陆续启动,这也意味着对于26届的同学们来说,“找工作”已经提上了日程。为了帮助大家更好地准备暑期实习和秋招,本期主要从时间线、学习路线、核心知识点及投递几方面给大家介绍,希望能为大家提供一些实用的建议和…...

拷贝多个Excel单元格区域为图片并粘贴到Word
Excel工作表Sheet1中有两个报表,相应单元格区域分别定义名称为Report1和Report2,如下图所示。 现在需要将图片拷贝图片粘贴到新建的Word文档中。 示例代码如下。 Sub Demo()Dim oWordApp As ObjectDim ws As Worksheet: Set ws ThisWorkbook.Sheets(&…...
Kafka消息队列之 【消费者分组】 详解
消费者分组(Consumer Group)是 Kafka 提供的一种强大的消息消费机制,它允许多个消费者协同工作,共同消费一个或多个主题的消息,从而实现高吞吐量、可扩展性和容错性。 基本概念 消费者分组:一组消费者实例的集合,这些消费者实例共同订阅一个或多个主题,并通过分组来协调…...

【Bluedroid】蓝牙 SDP(服务发现协议)模块代码解析与流程梳理
本文深入剖析Bluedroid蓝牙协议栈中 SDP(服务发现协议)服务记录的全生命周期管理流程,涵盖初始化、记录创建、服务搜索、记录删除等核心环节。通过解析代码逻辑与数据结构,揭示各模块间的协作机制,包括线程安全设计、回…...

中国自动驾驶研发解决方案,第一!
4月28日,IDC《中国汽车云市场(2024下半年)跟踪》报告发布,2024下半年中国汽车云市场整体规模达到65.1亿元人民币,同比增长27.4%。IDC认为,自动驾驶技术深化与生成式AI的发展将为汽车云打开新的成长天花板,推动云计算在…...

Kubernetes(k8s)学习笔记(四)--入门基本操作
本文通过kubernetes部署tomcat集群,来学习和掌握kubernetes的一些入门基本操作 前提条件 1.各个节点处于Ready状态; 2.配置好docker镜像库(否则会出现ImagePullBackOff等一些问题); 3.网络配置正常(否则即使应用发布没问题,浏…...

【项目篇之统一硬盘操作】仿照RabbitMQ模拟实现消息队列
统一硬盘操作 创建出实例封装交换机的操作封装队列的操作封装绑定的操作封装消息的操作总的完整代码: 我们之前已经使用了数据库去管理交换机,绑定,队列 还使用了数据文件去管理消息 此时我们就搞一个类去把上述两个部分都整合在一起&#…...