【vue】vue3.x项目初始化

太过爱你忘了你带给我的痛 2022-09-03 14:16 348阅读 0赞

文章目录

  • vue项目初始化
    • 参考文档
    • 出现的问题
      • Delete `␍`eslint(prettier/prettier)
      • eslint 单双引号,末尾分号(不建议使用,因为原本使用eslint就是为了美化代码)
    • 安装axios
      • 执行命令
      • 添加配置文件
      • 在main.js配置全局调用
    • 安装路由
    • 安装状态管理vuex
    • 安装less
      • TypeError: this.getOptions is not a function
      • warning delete `.. Replace `·· function` prettier/prettier

vue项目初始化

参考文档

https://www.freesion.com/article/70671403784/

出现的问题

Delete eslint(prettier/prettier)

原因:https://www.cnblogs.com/jasonboren/p/12337002.html
解决办法1:https://blog.csdn.net/LPLIFE/article/details/105655178
在控制台执行命令:

  1. git config --global core.autocrlf false

然后把本地代码提交,删掉本地仓库,重新拉取代码,就没问题了
解决办法2(不推荐,因为每个文件都需要改):https://www.cnblogs.com/victorlyw/p/13589682.html
在这里插入图片描述

eslint 单双引号,末尾分号(不建议使用,因为原本使用eslint就是为了美化代码)

在项目根目录添加文件.prettierrc.json
解决项目代码中单引号变双引号,以及末尾自动添加分号

  1. {
  2. "singleQuote": true,
  3. "semi": false
  4. }

安装axios

执行命令

  1. npm install axios -S
  2. npm install qs -S

添加配置文件

config.js

  1. export const baseURL = '/api'
  2. export const rootFile = '/myApp/'

server.js

  1. import Axios from 'axios'
  2. import { baseURL } from './config.js'
  3. import { Toast } from 'vant'
  4. import qs from 'qs'
  5. // import router from '../router/index'
  6. // 请求地址
  7. Axios.defaults.baseURL = baseURL
  8. // 超时时间
  9. Axios.defaults.timeout = 15000
  10. // 允许携带cookie
  11. Axios.defaults.withCredentials = true
  12. // 请求头
  13. Axios.defaults.headers = {
  14. // 'Content-Type': 'application/json;charset=UTF-8'
  15. // 'Content-Type': 'application/x-www-form-unlencoded'
  16. // 'Content-Type': 'multipart/form-data'
  17. 'Content-Type': 'application/x-www-form-urlencoded'
  18. }
  19. // 发送到服务器前修改请求数据
  20. Axios.defaults.transformRequest = [
  21. function(data) {
  22. return JSON.stringify(data)
  23. }
  24. ]
  25. /** *loading配置 */
  26. let loading = {
  27. load: null,
  28. showLoading: true,
  29. loadingMsg: '加载中...'
  30. }
  31. /** * 请求拦截器 */
  32. Axios.interceptors.request.use(
  33. res => {
  34. if (loading.showLoading) {
  35. loading.load = Toast.loading({
  36. duration: 0,
  37. message: loading.loadingMsg,
  38. forbidClick: true
  39. })
  40. }
  41. return res
  42. },
  43. error => {
  44. errorMsg(error)
  45. return Promise.reject(error)
  46. }
  47. )
  48. /** * 返回拦截器 */
  49. Axios.interceptors.response.use(
  50. res => {
  51. if (loading.showLoading) {
  52. Toast.clear()
  53. loading.showLoading = false
  54. }
  55. failMsg(res.data)
  56. return res
  57. },
  58. error => {
  59. errorMsg(error)
  60. return Promise.reject(error)
  61. }
  62. )
  63. /** * putService put请求 * @param {*} url * @param {*} params * @param {*} showLoading */
  64. export const putService = (url = '', params = { }, showLoading = true) => {
  65. loading.showLoading = showLoading
  66. return new Promise((resolve, reject) => {
  67. Axios.put(url, qs.stringify(params))
  68. .then(res => {
  69. const { data } = res
  70. resolve(data)
  71. })
  72. .catch(err => {
  73. errorMsg(err)
  74. reject(err)
  75. })
  76. })
  77. }
  78. /** * getService get请求 * @param {*} url * @param {*} params * @param {*} showLoading */
  79. export const getService = (url = '', params = { }, showLoading = true) => {
  80. loading.showLoading = showLoading
  81. return new Promise((resolve, reject) => {
  82. Axios.get(
  83. url,
  84. { params: params },
  85. {
  86. headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
  87. }
  88. )
  89. .then(res => {
  90. const { data } = res
  91. resolve(data)
  92. })
  93. .catch(err => {
  94. errorMsg(err)
  95. reject(err)
  96. })
  97. })
  98. }
  99. /** * postFile 文件请求 * formData示例 * let formData = new FormData() * formData.append("username", '张三') * formData.append("file", file) * @param {*} url * @param {*} formData * @param {*} showLoading */
  100. export const postFileService = (
  101. url = '',
  102. formData = { },
  103. showLoading = true
  104. ) => {
  105. loading.showLoading = showLoading
  106. return new Promise((resolve, reject) => {
  107. Axios.post(url, formData, {
  108. headers: { 'Content-Type': 'multipart/form-data;' }
  109. })
  110. .then(res => {
  111. const { data } = res
  112. resolve(data)
  113. })
  114. .catch(err => {
  115. errorMsg(err)
  116. reject(err)
  117. })
  118. })
  119. }
  120. /** * postService post请求 * ps:需要注意qs.stringify * @param {*} url * @param {*} params * @param {*} showLoading */
  121. export const postService = (url = '', params = { }, showLoading = true) => {
  122. loading.showLoading = showLoading
  123. return new Promise((resolve, reject) => {
  124. Axios.post(url, qs.stringify(params), {
  125. headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
  126. })
  127. .then(res => {
  128. const { data } = res
  129. resolve(data)
  130. })
  131. .catch(err => {
  132. errorMsg(err)
  133. reject(err)
  134. })
  135. })
  136. }
  137. /** * postJsonService post请求 * ps:需要注意qs.stringify * @param {*} url * @param {*} params * @param {*} showLoading */
  138. export const postJsonService = (url = '', params = { }, showLoading = true) => {
  139. loading.showLoading = showLoading
  140. return new Promise((resolve, reject) => {
  141. Axios.post(url, params, {
  142. headers: { 'Content-Type': 'application/json;charset=UTF-8' }
  143. })
  144. .then(res => {
  145. const { data } = res
  146. resolve(data)
  147. })
  148. .catch(err => {
  149. errorMsg(err)
  150. reject(err)
  151. })
  152. })
  153. }
  154. /** * 服务器编码 */
  155. export const SERVER_CODE = {
  156. // 响应成功
  157. SUCCESS: 200,
  158. // 响应失败
  159. ERROR: 500
  160. }
  161. /** * 异常错误提示 * @param {*} err */
  162. function errorMsg(err) {
  163. // 关闭load
  164. Toast.clear()
  165. loading.showLoading = false
  166. // 解析错误
  167. let title = '系统异常'
  168. if (err.message) {
  169. title = err.message
  170. }
  171. Toast.fail(title)
  172. }
  173. /** * 普通错误提示(请求成功,但是返回非200) * @param {*} res */
  174. function failMsg(res) {
  175. if (res.infoCode !== SERVER_CODE.SUCCESS) {
  176. Toast.fail(res.msg)
  177. }
  178. }

api-module-public.js

  1. export default {
  2. hello() {
  3. return "hello world!";
  4. },
  5. };

global-api.js

  1. import apiModulePublic from "@/api/module/api-module-public";
  2. export default {
  3. public: apiModulePublic,
  4. };

在main.js配置全局调用

https://blog.csdn.net/block_xu/article/details/111150883
main.js

  1. import { createApp } from "vue";
  2. import App from "./App.vue";
  3. import globalApi from "@/api/global-api";
  4. const app = createApp(App);
  5. // 配置全局变量
  6. app.config.globalProperties.$globalApi = globalApi;
  7. app.mount("#app");

调用方式:this.$globalApi.public.hello()

安装路由

https://blog.csdn.net/qq_31754523/article/details/108830149

安装状态管理vuex

这里使用了模块化 + vuex-persistedstate
首先,安装vuex和persistedstate

  1. npm install vuex --save
  2. npm i -S vuex-persistedstate

在这里插入图片描述

store-module-base.js

  1. export default {
  2. namespaced: "StoreModuleBase",
  3. state: {
  4. welcomeMessage: "欢迎━(*`∀´*)ノ亻!",
  5. },
  6. mutations: {
  7. SET_WELCOME_MESSAGE(state, param) {
  8. state.welcomeMessage = param;
  9. },
  10. },
  11. getters: {
  12. getWelcomeMessage(state) {
  13. return state.welcomeMessage;
  14. },
  15. },
  16. actions: {
  17. setWelcomeMessage({ commit }, param) {
  18. commit("SET_WELCOME_MESSAGE", param);
  19. },
  20. },
  21. };

index.js
这个文件,createStore这里参考了这篇文章:https://www.freesion.com/article/70671403784/

  1. import { createStore } from 'vuex'
  2. import persistedState from "vuex-persistedstate";
  3. // 模块
  4. import StoreModuleBase from "./module/store-module-base";
  5. /** * @vuex-persistedstate * 数据持久化,默认localStorage 参考:https://www.jianshu.com/p/c22861ec5f21 */
  6. export default createStore({
  7. plugins: [
  8. persistedState({
  9. storage: window.sessionStorage,
  10. }),
  11. ],
  12. modules: {
  13. StoreModuleBase,
  14. },
  15. });

main.js
最后是main.js

  1. import { createApp } from "vue";
  2. import App from "./App.vue";
  3. import globalApi from "@/api/global-api";
  4. import router from "@/router";
  5. import store from "@/store"
  6. const app = createApp(App);
  7. // 全局变量
  8. app.config.globalProperties.$globalApi = globalApi;
  9. // 安装组件
  10. app.use(router).use(store);
  11. app.mount("#app");

如果报错:Uncaught TypeError: Object(…) is not a function
可以安装一下这个:vue add vue-next
在这里插入图片描述
console.log(this.$store.state.storeModuleBase.welcomeMessage);
在这里插入图片描述

安装less

  1. npm install less less-loader --save-dev

配置less全局变量
https://www.cnblogs.com/linbudu/p/11445137.html

TypeError: this.getOptions is not a function

https://blog.csdn.net/qq_42430948/article/details/113552673

  1. 原因: less-loader安装的版本过高
  2. 解决方案:
  3. npm uninstall less-loader
  4. npm install less-loader@6.0.0

warning delete .. Replace·· function` prettier/prettier

https://www.cnblogs.com/zan0627/p/14097046.html

  1. 在.eslintrc.js文件中配置关闭Prettier
  2. rules中增加一行:"prettier/prettier": "off"
  3. 重启后生效

发表评论

表情:
评论列表 (有 0 条评论,348人围观)

还没有评论,来说两句吧...

相关阅读