Vue.JS
在 Web 的世界中从来就没有可以适配所有场景、解决所有问题的银弹。正因如此,Vue 被设计成一个灵活的、可以渐进式集成的框架。根据使用场景的不同需要,相应地有多种不同的方式来使用 Vue,以此在技术栈复杂度、开发体验和性能表现间取得最佳平衡。
Vue 不仅控制整个页面,还负责处理抓取新数据,并在无需重新加载的前提下处理页面切换。这种类型的应用通常称为单页应用 (Single-Page application,缩写为 SPA)。
参考:
掘金-Jervis_cen:浅谈Vite 原理与 Webpack比较
了解Vue
- 虚拟DOM:没有真实的DOM操作,也叫虚拟DOM。
- 双向数据绑定:使开发者不用再操作DOM对象。
- 生态丰富:市场大量成熟vue.js的ui框架、常用组件,以实现快速开发。
- 应用场景广泛:web、移动、跨平台应用开发。
- 入门容易。
Vue Cli初始化Vue项目
Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统,Vue CLI 致力于将 Vue 生态中的工具基础标准化。它确保了各种构建工具能够基于智能的默认配置即可平稳衔接,这样你可以专注在撰写应用上,而不必花好几天去纠结配置的问题。与此同时,它也为每个工具提供了调整配置的灵活性,无需 eject。
Vue CLI 现已处于维护模式!
现在官方推荐使用 create-vue 来创建基于 Vite 的新项目。另外请参考 Vue 3 工具链指南 以了解最新的工具推荐。
参考:
51CTO博客-徐同保的博客:error The engine “node“ is incompatible with this module.
vue cli 版本
至于为什么打vue出现 vue cli 其实vue作为前端框架,是一个nodeJS下的一个包,即一个vue项目整体的前端工程化项目,而vue cil作为脚手架工具,仅仅只是做了一个整合各种技术栈的工具,整合了vue全家桶等依赖,这些依赖装在一个项目跟目录下的node_modules/
下,具体详见:博客园-金色海洋工作室:一篇文章说清 webpack、vite、vue-cli、create-vue 的区别
1 | ~/ vue --version |
创建一个Vue项目模板
1 | vue create hello-world #执行创建一个项目模板 |
提示选择包管理器,我选择的是yarn(可能是因为我有多个包管理器的原因)
但报了个erro
1 | error @achrinza/node-ipc@9.2.2: The engine "node" is incompatible with this module. Expected version "8 || 10 || 12 || 14 || 16 || 17". Got "18.11.0" |
直接执行
1 | yarn config set ignore-engines true |
成功创建Vue项目模板,cd
到项目目录下执行:
1 | yarn serve |
浏览器访问:
模式和环境变量
Vue2 & Vue3 都适应以下,放置于项目根目录的例如:
.env.development
、.env.production
等…参考;
模式是 Vue CLI 项目中一个重要的概念。默认情况下,一个 Vue CLI 项目有三个模式:
development
模式用于vue-cli-service serve
test
模式用于vue-cli-service test:unit
production
模式用于vue-cli-service build
和vue-cli-service test:e2e
注意:
- 一个模式可以包含多个环境变量
- 每个模式都会将环境变量中 NODE_ENV 的值设置为模式的名称
可以通过为 .env 文件增加后缀来设置某个模式下特有的环境变量 - 为一个特定模式准备的环境文件 (例如 .env.production) 将会比一般的环境文件 (例如 .env) 拥有更高的优先级
- 此外,Vue CLI 启动时已经存在的环境变量拥有最高优先级,并不会被 .env 文件覆写
NODE_ENV
(模式)设置为:
test
Vue CLI 会创建一个优化过后的,并且旨在用于单元测试的 webpack 配置,它并不会处理图片以及一些对单元测试非必需的其他资源。development
创建一个 webpack 配置,该配置启用热更新,不会对资源进行 hash 也不会打出 vendor bundles,目的是为了在开发的时候能够快速重新构建。production
当你运行vue-cli-service build
命令时,无论你要部署到哪个环境,应该始终把NODE_ENV
设置为"production"
来获取可用于部署的应用程序。
设置项目环境变量
你可以在你的项目根目录中放置下列文件来指定环境变量:
1 | .env # 在所有的环境中被载入 |
一个环境文件只包含环境变量的“键=值”对:
1 | FOO=bar |
请注意,只有 NODE_ENV
,BASE_URL
和以 VUE_APP_
开头的变量将通过 webpack.DefinePlugin
静态地嵌入到客户端侧的代码中。这是为了避免意外公开机器上可能具有相同名称的私钥。
环境文件加载优先级
为一个特定模式准备的环境文件 (例如 .env.production
) 将会比一般的环境文件 (例如 .env
) 拥有更高的优先级。
此外,Vue CLI 启动时已经存在的环境变量拥有最高优先级,并不会被 .env
文件覆写。
.env
环境文件是通过运行 vue-cli-service
命令载入的,因此环境文件发生变化,你需要重启服务。
在客户端侧代码中使用环境变量
只有以 VUE_APP_ 开头的变量会被 webpack.DefinePlugin 静态嵌入到客户端侧的包中。你可以在应用的代码中这样访问它们:
1 | console.log(process.env.VUE_APP_SECRET) |
在构建过程中,process.env.VUE_APP_SECRET 将会被相应的值所取代。在 VUE_APP_SECRET=secret 的情况下,它会被替换为 “secret”。
除了 VUE_APP_* 变量之外,在你的应用代码中始终可用的还有两个特殊的变量:
NODE_ENV - 会是 “development”、”production” 或 “test” 中的一个。具体的值取决于应用运行的模式。
BASE_URL - 会和 vue.config.js 中的 publicPath 选项相符,即你的应用会部署到的基础路径。
所有解析出来的环境变量都可以在 public/index.html
中以 HTML 插值中介绍的方式使用。
示例
请参考:CSDN-写代码的lorre:vue cli4-环境变量和模式
生命周期
参考:
代码示例
1 | Vue.component("demo1",{ |
加载逻辑
beforeCreate
在组件实例初始化完成之后立即调用created
在组件实例处理完所有与状态相关的选项后调用、模板渲染成html
前调用,即通常初始化某些属性值,然后再渲染成视图
渲染DOM
beforeMount
在组件被挂载之前调用,但还没有创建 DOM 节点。它即将首次执行 DOM 渲染过程mounted
在组件被挂载之后调用、模板渲染成html
后调用,通常是初始化页面完成后,再对html
的dom
节点进行一些操作。
更新DOM
beforeUpdate
组件即将因为一个响应式状态变更而更新其 DOM 树之前调用。updated
在组件因为一个响应式状态变更而更新其 DOM 树之后调用
卸载组件
beforeUnmount
在一个组件实例被卸载之前调用unmounted
在一个组件实例被卸载之后调用
通常created
使用的次数多,而mounted
是在一些插件或组件的使用中进行操作。
export & import
ECMAScript模块(ESM)是在ECMAScript 6标准中引入的一种模块系统,它使用import和export等关键字来实现模块的导入和导出。尽管ESM在浏览器环境中已经得到了广泛的支持,但在Node.js中,直到最近的版本中才开始支持ESM语法。这种转变是为了使Node.js更加符合JavaScript的标准化发展,并且与浏览器环境更加一致。
vue 中的一个文件可以被了理解为一个模块。
export
(导出),import
(导入),即ECMAScript (浏览器)模块语法,都能导出模块里的常量、函数、文件、模块等…如果是Node.js 默认使用的是 CommonJS 模块系统,即使用
module.exports
和require
来导出和导入模块参考:
CSDN-疆~:vue中常用的几种import(模块、文件)引入方式,export,export default,全部/部分文件的导出/导入
ES模块语法
export
/import
default
只能在一个模块中出现一次,在另一个模块 import
就不需要加{}
1 | // 在某个js文件中使用export default导出变量 |
在其他文件中导入这个默认导出的变量:
1 | javascriptCopy code// 正确的导入方式 |
使用export default
时,只能将整个默认导出的对象引入,并使用指定的变量名(在这里是person
)来访问对象的属性。
export
/import
变量
1 | // @/utils/tabbar.js |
在这个模块中,有一个tabInfo
的常量和一个otherVar
的常量。如果你只想导入tabInfo
,那么你可以使用解构导入的方式:
1 | import { tabInfo } from '@/utils/tabbar'; |
使用解构导入时,你只需要指定你感兴趣的变量名(在这里是tabInfo
),而不需要导入整个模块。这样可以提高代码的可读性,并只导入需要的内容,避免了不必要的资源加载和冗余代码。
函数
导出
1 | export function getDefTime(dayNum) { |
1 | function setDefTime(dayNum) { |
导入
1 | // 大括号内可包含多个 |
导入css
1 | import 'iview/dist/styles/iview.css'; |
如果是在.vue文件中那么在外面套个style
1 | <style> |
单文件组件
它被称为单文件组件 (也被称为
*.vue
文件,英文 Single-File Components,缩写为 SFC)。顾名思义,Vue 的单文件组件会将一个组件的逻辑 (JavaScript),模板 (HTML) 和样式 (CSS) 封装在同一个文件里。
常用知识点
参考:
Vue.prototype
main.js
1 | // 作用是将名为$appName这个变量设置为全局可用 |
带$的作用
只是避免在组件中使用时,自己在组件中创建了相同的变量名称不会被非全局变量覆盖
1 | Vue.prototype.appName = 'My App' |
以下 beforeCreate 先执行 created 后执行(appName被覆盖)
1 | new Vue({ |
组件间调用
组件的
name
选项设置为'kqShow'
,这是你显式地给组件命名的结果。当你在父组件中使用kq-show
标签时,这个名称kq-cart
实际上就是组件的名称,它由组件的name
选项决定。
全局
组件中
1 | export default { |
@/main.js
1 | // 挂载 全局组件 |
页面中直接可以使用
1 | <kq-show></kq-show> |
局部
组件中
1 | export default { |
父级调用
1 | <template> |
父子间方法调用
参考:
父组件
父组件中声明子组件需要访问的方法@search="navToSearch"
、@tab="tabClick"
1 | <rf-search-bar |
子组件
子组件中收到'search'
、'tab'
,分别对应父组件中的navToSearch
、tabClick
,使用this.$emit(<方法名>,[传参])
调用父组件中给定的方法
1 | <!-- 搜索框 --> |
vue-watch监听
参考:
filters
例如常用于:后端字段type返回数据 0、1、2,分别代表三种状态禁用、启用、处理,如何使后端返回的数据显示在前端以状态显示
使用了Vue的过滤器(Filter)功能。在模板中使用管道(|
)将status
的值传递给过滤器,并在过滤器中将其转换为相应的状态文本。
1 | <template> |