vue3+webpack+elementplus+国际化+axios封装+pinia

文章目录

  • 创建项目 + eslint + prettier
    • 切换pinia(后补上)
    • 创建项目
    • eslint + prettier
      • 注意
    • 自动格式化
  • element plus
      • 注意
    • element plus icon
      • 注意:
  • 国际化
    • 注意
  • axios 封装

最近菜鸟自己搭建一个项目,想着 vue3 都出来这么久了,再不用 vue3,怕是等我熟悉 vue3 的时候,vue4 都出来了,直接落后时代一个大版本那就难受了!

但是突然从 vue2 转变到用这个 vue3 确实是让人脑壳疼,接下来就把菜鸟踩坑的地方都分享给大家了!

创建项目 + eslint + prettier

首先要知道的就是,既然是公司,那么一般都有一套代码规范,但是菜鸟现在待的是一个生物公司,之前都没有前端这个岗位,所以一切就是靠菜鸟了,那既然是由我定规范,那一定要搞好点,所以就采用了eslint + prettier!

之所以不用 vite,其一就是感觉 webpack 生态比较好,其二 vue2 就是 webpack 的,其三 vite 的一些依赖要自己去下载,感觉是没有 webpack 方便,所以暂时就没转换(不过好像没法体验 Pinia,可以自己把 vuex卸载并 npm Pinia,也可以创建的时候不选 vuex)!

切换pinia(后补上)

菜鸟在写完博客后,马上尝试了一下把 vuex 换成 pinia ,当然仅限创建项目的时候换,要是你都开发完了,那就不要换了!!!

首先就是执行两个命令:

npm install pinia -S
npm uninstall vuex

然后把 main.js 的store换成 pinia
在这里插入图片描述
然后如果是 vuex 换过来的就不用自己创建 store目录和 index.js 文件,否则需要自己创建,将里面的内容改成:

// store/index.js
import { defineStore } from "pinia";
// 1. 定义容器、导出容器
// 参数1:容器的ID,必须是唯一的,后面Pinia会把所有的容器挂载到根容器
// 参数2:一些选项对象,也就是state、getter和action
// 返回值:一个函数,调用即可得到容器实例export const useMainStore = defineStore("main", {// 类似于Vue2组件中的data,用于存储全局状态数据,但有两个要求// 1. 必须是函数,目的是为了在服务端渲染的时候避免交叉请求导致的数据状态污染// 2. 必须是箭头函数,这样是为了更好的 TS 类型推导state: () => {return {info: "pinia 可以使用",};},getters: {},actions: {},
});// 2. 使用容器中的 state
// 3. 通过 getter 修改 state
// 4. 使用容器中的 action 同步和异步请求

项目中最简单的使用:

js代码

import { useMainStore } from "../../store";
const mainStore = useMainStore();

html代码

<div>{{ mainStore.info }}</div>

创建项目

vue create testpro

然后选择
在这里插入图片描述
之所以不用 ts,首先菜鸟不是很会 ts,第二菜鸟感觉 js 本来就是自由的语言,你给它加上限制不能说不好,只是菜鸟不喜欢而已!

然后路由模式一定要使用 hash 模式,history 模式菜鸟没用过,反正好像是要后端进行配合,不是很好使用!
在这里插入图片描述
然后 css 菜鸟选择的是 scss,这个按照个人喜好就行!

eslint 菜鸟就是选择的 eslint + prettier
在这里插入图片描述
这个菜鸟选的第一个,不想让其提交的时候使用 fix, fix虽好,但是还是自己能全权掌握的更香,而不是交给 fix !
在这里插入图片描述
到这里项目就创建完了,但是配置还没有配置好!

eslint + prettier

因为这个时候,只要你新建一个 .vue 文件,eslint 就跑过来恶心你了,会报错

Component name "xxxxx” should always be multi-word

在这里插入图片描述
但是感觉这个规范确实不需要,所以只需要在 eslint.js 里面加上这一行就行

在这里插入图片描述
方便复制:

"vue/multi-word-component-names": 0,

这个时候你以为一切顺利,然后再敲了几行代码,eslint 就又来了,会报错

Delete eslint(prettier/prettier)

这是因为
在这里插入图片描述
这里就要创建 .prettierrc 文件,并输入以下

{"endOfLine": "auto"
}

注意

一定要重启vscode,不然还是会报错!

这里还有一篇文章说的是另一种方法,读者可以尝试:优雅解决:(linebreak-style) Expected linebreaks to be ‘LF‘ but found ‘CRLF‘. (eslint)

这个时候确实万事大吉,但是你如果写的代码最后一行没有换行,那么就会报错

Insert ␍⏎eslintprettier/prettier

但是这个无伤大雅,打个回车就行了!

自动格式化

要使用 eslint 自然需要一个插件(eslint 不像 prettier,prettier 就算没有插件也可以正常使用,不过不能按照 prettier 的规则自动保存罢了):
在这里插入图片描述
在这里插入图片描述
但是如果想保存的时候自动格式化成为我们想要的格式,那么我们该怎么配置?

这个时候就要下载该插件:
在这里插入图片描述
并将 vscode 的 setting.json 设置成这样:

{// 让函数(名)和后面的括号之间加个空格"javascript.format.insertSpaceBeforeFunctionParenthesis": true,// tab 大小为2个空格"editor.tabSize": 2,// 180 列后换行"editor.wordWrapColumn": 180,// 显示 markdown 中英文切换时产生的特殊字符"editor.renderControlCharacters": true,// 用来忽略工程打开的文件夹"files.exclude": {"**/.vscode": true,"**/.DS_Store": true,"**/.history": true,"**/nbproject": true},// 失去焦点自动保存"files.autoSave": "onFocusChange",// 资源管理器确认删除"explorer.confirmDelete": false,// 新窗口尺寸"window.newWindowDimensions": "maximized",// typescript更新启用文件移动时导入(就是ts文件移动时重新导入)"typescript.updateImportsOnFileMove.enabled": "always",// 比较不同时,忽略空白"diffEditor.ignoreTrimWhitespace": false,"editor.fontWeight": "normal",//忽略搜索设置"search.exclude": {"**/dist": true,"**/node_modules/**": true},// 将prettier设置为默认格式化程序(在编辑器中有可能被其他Formatter占用,所以将prettier设置为默认Formatter)"editor.defaultFormatter": "esbenp.prettier-vscode",// 保存时自动格式化 (根据根目录下‘.prettierrc文件配置项’)"editor.formatOnSave": true,// prettier 最长180列"prettier.printWidth": 180,// prettier 结束随便"prettier.endOfLine": "auto"
}

element plus

使用 element plus 自然要使用其最强大的按需引入,全部引入实在是太浪费内存了!

首先我们按照官网的步骤:

npm install -D unplugin-vue-components unplugin-auto-import

按照完事之后,就要配置 webpack 了,对于 webpack 好的人可能不难,但是不好的可能就不太会,所以这里菜鸟还是写一下,官网的 webpack 需要放在 vue.config.js 里面:

const { defineConfig } = require("@vue/cli-service");// 按需引入element plus
const AutoImport = require("unplugin-auto-import/webpack");
const Components = require("unplugin-vue-components/webpack");
const { ElementPlusResolver } = require("unplugin-vue-components/resolvers");const port = 8888;module.exports = defineConfig({transpileDependencies: true,productionSourceMap: false,// 按需引入element plusconfigureWebpack: {resolve: {alias: {components: "@/components",},},plugins: [AutoImport({resolvers: [ElementPlusResolver()],}),Components({resolvers: [ElementPlusResolver()],}),],},devServer: {port,proxy: {"/Api": {target: "http://xxxxx",changeOrigin: true, // 如果接口跨域,需要进行这个参数配置pathRewrite: {"^/Api": "",},headers: {referer: "http://xxxx",},},},},
});

然后等你兴高采烈的准备大干一场,并在项目中使用 element plus 时坑就来了,其编译的时候就会报错:

Module not found: Error: Can’t resolve ‘element-plus/es’ in
Module not found: Error: Can’t resolve ‘element-plus/es/components/base/style/css’ in

这个问题就是你没有安装 element plus 只安装了两个自动导入的插件而已,所以还要执行

npm install element-plus --save

注意

1、
如果你在 script 中使用了 ElMessage ,那么eslint 会报错没有引入,但是其实是没问题的,只需要在 ElMessage 之前加上该代码:

// eslint-disable-next-line

2、有的时候 element plus 版本高了也会报错,详情见:vue3引入element-plus报错解决方案

element plus icon

使用 element plus icon 就和使用其他组件是一样的,唯一的区别就是要引入

import { } from “@element-plus/icons-vue”;

具体引入什么就是去官网点击图标,将复制下来的引入就行!

注意:

上面 npm 了 element-plus,那么这里的图标可以直接引用,不需要 npm 图标库了!

还有一个坑的地方就是按需引入,但是菜鸟发现按需引入确实可以,但是使用的是时候就不能是官网复制下来的,而是不知道哪里复制的,所以暂时不推荐使用!

按需引用参考:
1、Element Plus Icon图标自动引入
2、Vue3!ElementPlus!更加优雅的使用Icon

国际化

首先便是安装国际化库

npm i vue-i18n

在项目中,我们一般会新建一个文件夹专门存放 i18n 的配置

目录结构如下:
在这里插入图片描述

然后新建 i18n.js 文件,引入 vue-i18n,vue-i18n 使用 createI18n 创建实例:

import { createI18n } from "vue-i18n";
import EN from "./en/en";
import CN from "./cn/cn";const message = {cn: {...CN,},en: {...EN,},
};const i18n = createI18n({locale: "cn", // 设置语言类型legacy: false, // 如果要支持compositionAPI,此项必须设置为false;globalInjection: true, // 全局注册$t方法messages: message,
});export default i18n;

然后 cn / en 里面的文件结构如下:

在这里插入图片描述

内容由自己定义,这里给个例子:

export default {username: "用户名",password: "密码",passwordtip: "请输入密码",signIn: "登录",signOut: "退出登录",signInerr: "登录失败",
};

英文的与之对应即可!

然后便是在 main.js 中引入国际化
在这里插入图片描述

注意

1、如果要在 script 中使用国际化方法,需要结构出 t 方法,html 中可以直接使用 $t(),如下:

import { useI18n } from "vue-i18n";//  解构出t方法
const { t } = useI18n(); // 先调用此方法,然后再使用// eslint-disable-next-line
ElMessage({message: t("signInerr"),type: "error",});

2、如果要获取值,必须这样使用:

js代码:

// 切换中英文
import { useI18n } from "vue-i18n";
const { locale } = useI18n(); // 先调用此方法,然后再使用
const changeLang = (msg) => {locale.value = msg;localStorage.setItem("LANG", msg);
};
const options = [{value: "cn",label: "中文",},{value: "en",label: "英文",},
];

html:

<el-select v-model="locale" @change="changeLang"><el-optionv-for="item in options":key="item.value":label="item.label":value="item.value"/>
</el-select>

axios 封装

// 对你引用的第三方网络请求框架进行封装

import axios from "axios";if (process.env.NODE_ENV == "development") {axios.defaults.baseURL = "/Api";
} else if (process.env.NODE_ENV == "production") {axios.defaults.baseURL = "";
}export function request(config) {// 1. 创建axios的实例const instance = axios.create({timeout: 15000,});//2. 使用axios拦截器//2.1 请求拦截instance.interceptors.request.use((conF) => {//如果不返回,则真正的请求被拦截了,用户就会打印err// *** 一般进行的操作 ***// 1. config中的一些信息不符合服务器要求,就可以在这修改,在创建实例时也可以// 2. 每次发送网络请求时,都希望在界面中显示一个请求的图标// 3. 某些网络请求(登陆[token]),必须携带一些特殊的信息//    解释:判断请求是什么,如果是特殊的请求,就看看里面有没有token,要是没有,就让其去登陆try {const token = localStorage.getItem("token");token ? (config.headers.Token = token) : null;} catch {throw new Error("没有token");}// console.log(conF);return conF;},(err) => {console.log(err);// eslint-disable-next-lineElMessage({showClose: true,message: err,});});//2.2 响应拦截instance.interceptors.response.use((res) => {console.log(res);//更新tokenif (res.status == 200) {// 要根据后台返回的token自行赋值if (res.data.data.token) {localStorage.setItem("token", res.data.data.token);}}return res.data;},(error) => {if (error.response.status) {switch (error.response.status) {// 401: 未登录case 401:// eslint-disable-next-lineElMessage({showClose: true,message: "未登录",});break;// 403 token过期// 登录过期对用户进行提示// 清除本地token对象// 跳转登录页面case 403:// eslint-disable-next-lineElMessage({showClose: true,message: "登录过期,请重新登录",});// 清除tokenlocalStorage.removeItem("token");break;// 404请求不存在case 404:// eslint-disable-next-lineElMessage({showClose: true,message: "网络请求不存在",});break;case 500:// eslint-disable-next-lineElMessage({showClose: true,message: "Request failed with status code 500",});break;// 其他错误,直接抛出错误提示default:console.log(error);// eslint-disable-next-lineElMessage({showClose: true,message: error.response.data.message,});}return Promise.reject(error.response);} else {console.log(error);// eslint-disable-next-lineElMessage({showClose: true,message: "服务器异常!",});}});//3. 真正的发送请求return instance(config);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/197006.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS开发Java与ArkTS如何抉择

在“鸿蒙系统实战短视频App 从0到1掌握HarmonyOS”视频课程中&#xff0c;很多学员来问我&#xff0c;在HarmonyOS开发过程中&#xff0c;面对Java与ArkTS&#xff0c;应该选哪样&#xff1f; 本文详细分析Java与ArkTS在HarmonyOS开发过程的区别&#xff0c;力求解答学员的一些…

<MySQL> 什么是JDBC?如何使用JDBC进行编程?

目录 一、JDBC是什么&#xff1f; 二、JDBC常用接口和类 2.1 DataSource 2.2 Connection 2.3 Statement 2.4 ResultSet 三、JDBC的使用 3.1 获得数据库驱动包 3.2 添加到项目依赖 3.3 描述数据库服务器 3.4 建立数据库连接 3.6 执行SQL语句和接收返回数据 3.7 释放…

搭建内部知识库,解决企业内部琐碎信息问题

企业内部面临着大量琐碎的信息&#xff0c;这些信息可能分散在各个部门、员工之间&#xff0c;导致查找和共享变得困难。这种情况下&#xff0c;搭建一个内部知识库可以解决这一问题。通过内部知识库&#xff0c;企业可以将琐碎的信息整理、分类&#xff0c;并提供一个集中存储…

python之使用深度学习创建自己的表情符号

目录 部署项目1、首先运行train.py训练模型2、接下运行gui.py测试 一、使用 CNN 进行面部情绪识别二、GUI 代码和表情符号映射 在这个深度学习项目中&#xff0c;我们将对人类面部表情进行分类&#xff0c;以过滤和映射相应的表情符号或头像。 数据集&#xff08;面部表情识别&…

【ARM Trace32(劳特巴赫) 使用介绍 5 -- Trace32 scan dump 详细介绍】

文章目录 1.1 JTAG 测试逻辑架构1.2 D型扫描触发器1.2.1 全扫描介绍1.3 IR 寄存器1.4 TDR(Test data registers)1.4.1 TDR 的实现1.4.1.1 Bypass Register1.4.1.2 Boundary-scan register1.5 Scan Dump1.5.1 soft fusion1.1 JTAG 测试逻辑架构 图 1-1 片上测试逻辑概念图 如前面…

基于STM32的多组外部中断(EXTI)的优化策略与应用

在某些嵌入式应用中&#xff0c;可能需要同时处理多个外部中断事件。STM32系列微控制器提供了多组外部中断线&#xff08;EXTI Line&#xff09;&#xff0c;可以同时配置和使用多个GPIO引脚作为外部中断触发器。为了有效管理和处理多组外部中断&#xff0c;我们可以采取一些优…

(带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程

源码简介&#xff1a; 1、会员管理&#xff1a; 该系统分为三个级别的会员流程&#xff1a;总站管理员、代理与会员&#xff08;会员有普通会员、中级会员和高级会员三个等级&#xff09;。总站管理员可以添加代理用户并为其充值余额&#xff0c;代理用户可以为普通用户充值余…

zookeperkafka学习

1、why kafka 优点 缺点kafka 吞吐量高&#xff0c;对批处理和异步处理做了大量的设计&#xff0c;因此Kafka可以得到非常高的性能。延迟也会高&#xff0c;不适合电商场景。RabbitMQ 如果有大量消息堆积在队列中&#xff0c;性能会急剧下降每秒处理几万到几十万的消息。如果…

若依框架数据源切换为pg库

一 切换数据源 在ruoyi-admin项目里引入pg数据库驱动 <dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>42.2.18</version> </dependency>修改配置文件里的数据源为pg spring:d…

交通 | 神奇动物在哪里?Operations Research经典文章

论文作者&#xff1a;Robert G. Haight, Charles S. Revelle, Stephanie A. Snyder​ 论文原文&#xff1a;Robert G. Haight, Charles S. Revelle, Stephanie A. Snyder, (2000) An Integer Optimization Approach to a Probabilistic Reserve Site Selection Problem. Operat…

解决java在idea运行正常,但是打成jar包后中文乱码问题

目录 比如&#xff1a; 打包命令使用utf-8编码&#xff1a; 1.当在idea中编写的程序,运行一切正常.但是当被打成jar包时,执行的程序会中文乱码.产生问题的原因和解决方案是什么呢? 一.问题分析 分别使用idea和jar包形式打印出System中所有的jvm参数---代码如下: public static…

H5ke11--1登录界面一直保存--用本地localStorage存储

目录 代码详解 localStage优点 :一直保存着 注意事项: storage属性们 代码详解 ke8学校陈老师H5-CSDN博客文章浏览阅读76次。实现H5中新增的三个元素&#xff1a;forEach的使用方法。https://blog.csdn.net/m0_72735063/article/details/134019012即此之后 当然可以分为按…

快速入门:构建您的第一个 .NET Aspire 应用程序

##前言 云原生应用程序通常需要连接到各种服务&#xff0c;例如数据库、存储和缓存解决方案、消息传递提供商或其他 Web 服务。.NET Aspire 旨在简化这些类型服务之间的连接和配置。在本快速入门中&#xff0c;您将了解如何创建 .NET Aspire Starter 应用程序模板解决方案。 …

Postman接收列表、数组参数@RequestParam List<String> ids

示例如下: 接口定义如下: GetMapping(value "/queryNewMoviePath")public List<Map<String, Object>> queryNewMoviePath(RequestParam List<String> ids ) {return service.queryNewMoviePath(ids);}postman中测试如下&#xff1a; http://loc…

MFA多因子认证

什么是多因子认证&#xff08;MFA&#xff09;&#xff1f;为什么需要MFA&#xff1f; 同义词 多因子认证或者多因素验证 [尤其是需要做等级保护测评的时候需要用到] 摘要 多因子认证MFA&#xff08;Multi Factor Authentication&#xff09;是一种安全认证过程&#xff0c;需…

k8s-部署Redis-cluster(TLS)

helm pull bitnami/redis-cluster v8.3.8拉取源码生成证书 git clone https://github.com/redis/redis.git #文档 https://redis.io/docs/management/security/encryption/#getting-started生成你的TLS证书用官网的工具生成 1 Run ./utils/gen-test-certs.sh 生成根CA和服务…

springboot321基于java的校园服务平台设计与开发

交流学习&#xff1a; 更多项目&#xff1a; 全网最全的Java成品项目列表 https://docs.qq.com/doc/DUXdsVlhIdVlsemdX 演示 项目功能演示&#xff1a; ————————————————

【双指针】复写0

复写0 1089. 复写零 - 力扣&#xff08;LeetCode&#xff09; 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&#xff1a;请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上…

python趣味编程-5分钟实现一个益智数独游戏(含源码、步骤讲解)

Puzzle Game In Python是用 Python 编程语言Puzzle Game Code In Python编写的,有一个 4*4 的棋盘,有 15 个数字。然后将数字随机洗牌。 在本教程中,我将教您如何使用Python 创建记忆谜题游戏。 Python Puzzle Game游戏需要遵循以下步骤,首先是将图块数量移动到空的图块空…

软件开发、网络空间安全、人工智能三个方向的就业和前景怎么样?哪个方向更值得学习?

软件开发、网络空间安全、人工智能这三个方向都是当前及未来的热门领域&#xff0c;每个领域都有各自的就业前景和价值&#xff0c;以下是对这三个方向的分析&#xff1a; 1、软件开发&#xff1a; 就业前景&#xff1a;随着信息化的加速&#xff0c;软件开发的需求日益增长。…