vue-vueadmin記錄
title: vue-vueadmin記錄
categories: Vue
tags: [vue, vueadmin, js, 記錄]
date: 2019-09-06 17:37:10
comments: false
vue-vueadmin記錄
相關資料
- 官方資料
- GitHub - https://github.com/PanJiaChen/vue-element-admin/blob/master/README.zh-CN.md
- 中文文件 - https://panjiachen.gitee.io/vue-element-admin-site/zh/guide/#%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84
- 示例 - https://panjiachen.gitee.io/vue-element-admin/#/dashboard
- vue 文件 - https://cn.vuejs.org/v2/guide/
- element 文件 - https://element.eleme.io/#/zh-CN/component/layout
- vuex 文件 - https://vuex.vuejs.org/zh/guide/
- 手摸手,帶你用vue擼後臺 系列 (不錯) - https://juejin.im/post/59097cd7a22b9d0065fb61d2
- vue-element-admin 技術棧 - https://learnku.com/articles/20050?order_by=vote_count&
TODO
- webpack 打包
- 全域性變數或函式
- https://blog.csdn.net/qq_30669833/article/details/81706217
vscode 外掛
- Vuetur
- vue
- ESLint
chrome 外掛
- https://github.com/vuejs/vue-devtools
安裝完後外掛欄有個 vue icon 出現, 按 f12 調出除錯工具, 頂欄有個 vue 的選項.
取消 eslint 校驗
官方文件 - https://eslint.org/docs/rules/
去掉 縮排校驗
參考: https://panjiachen.github.io/vue-element-admin-site/zh/guide/advanced/eslint.html#%E9%85%8D%E7%BD%AE%E9%A1%B9
.eslintrc.js
檔案中的 'indent': [2, 2, {
修改為 'indent': [0, 0, {
就可以 4 個空格為縮排
去掉 單引號 雙引號 校驗
參考: https://eslint.org/docs/rules/quotes
.eslintrc.js
檔案中的 'quotes': [2, 'single',
修改為 'quotes': [0, 'single',
去掉 程式碼結尾 分號 校驗
參考:
.eslintrc.js
檔案中的 'semi': [2, 'never'],
修改為 'semi': [0, 'never'],
去掉 no use 校驗
.eslintrc.js
檔案中的檔案中的 'no-unused-vars': [2, {
修改為 'no-unused-vars': [0, {
去掉 空行 校驗
.eslintrc.js
檔案中的檔案中的 'no-multiple-empty-lines': [2, { 'max': 1
修改為 'no-multiple-empty-lines': [2, { 'max': 9999
去掉 物件構建 最後一個 逗號 校驗
.eslintrc.js
檔案中的檔案中的 'comma-dangle': [2,
修改為 'comma-dangle': [0,
生命週期
- 詳解 Vue 生命週期實現 - https://juejin.im/post/5c6d48e36fb9a049eb3c84ff
查詢呼叫棧
在 chrome 中按 F12 鍵, 在 sources 下 ctrl + shift + F, 查詢日誌, 然後設定斷點.
環境變數配置
參考: https://panjiachen.gitee.io/vue-element-admin-site/zh/guide/essentials/env.html#%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F
-
配置檔案為 .env.xxx
-
環境變數必須以
VUE_APP_
為開頭。如:VUE_APP_API
、VUE_APP_TITLE
console.log(process.env.VUE_APP_xxxx)
-
修改配置檔案後必須重新 npm run dev 才生效
跨域配置
- 使用vue-element-admin框架呼叫後端介面及跨域問題 - https://blog.csdn.net/ywdhzxf/article/details/90518807
在 vue.config.js 檔案中
proxy: {
// change xxx-api/login => mock/login
// detail: https://cli.vuejs.org/config/#devserver-proxy
// [process.env.VUE_APP_BASE_API]: {
// target: `http://127.0.0.1:${port}/mock`,
// changeOrigin: true,
// pathRewrite: {
// ['^' + process.env.VUE_APP_BASE_API]: ''
// }
// },
'/hello': {
target: `http://127.0.0.1:8001`,
changeOrigin: true
}
},
import 別名設定
configureWebpack: {
name: name,
resolve: {
alias: {
'@': resolve('src') // 這也是為什麼 很多地方 import 有個 @
}
}
},
狀態儲存 Vuex
參考: https://vuex.vuejs.org/zh/guide/state.html
訪問資料
通過在根例項中註冊 store
選項,該 store 例項會注入到根元件下的所有子元件中,且子元件能通過 this.$store
訪問到
Element UI
- 官方資料
- https://element.eleme.io/#/zh-CN/component/layout
頁面資料使用
- vuex 中關於 mapGetters 的作用 - https://www.cnblogs.com/crazycode2/p/7636082.html
ui 使用多語言
參考: https://codeday.me/bug/20190430/1010561.html
在 main.js 中引入多語言
import locale from 'element-ui/lib/locale/lang/en'
Vue.use(Element, {
locale,
size: Cookies.get('size') || 'medium' // set element-ui default size
})
自定義元件
踩坑
報錯: The “MyComponent” component has been registered but not used
沒有使用元件命名不正確
import MyComponent from './components/MyComponent' // 使用時的命名必須是 my-component, 不能用駝峰命名, 必須全小寫, 用 - 分割. 繫結值也一樣 <my-component :arg1="123" :is-show="isShow" :arg3="'hello'" @on-my-notify="onMyNotify666" />
報錯: Syntax Error: SyntaxError: Assigning to rvalue
參考: https://blog.csdn.net/u014182411/article/details/80071198
html的模板中 引用的值 如: v-module 繫結的屬性並沒有在 data 屬性中定義
報錯: Attribute ‘fileNameTitle’ must be hyphenated
參考: https://blog.csdn.net/qq_35366269/article/details/90644180
原因
出現該錯誤的原因是元件的屬性fileNameTitle使用了駝峰命名法,導致ESLint 檢測出語法錯誤
解決辦法:
將fileNameTitle改為file-name-title即可
<my-component :arg1="123" :isShow="isShow" :arg3="'hello'" @onMyNotify="onMyNotify666" /> <!-- 修改為: --> <my-component :arg1="123" :is-show="isShow" :arg3="'hello'" @on-my-notify="onMyNotify666" />
元件
命名方式
傳參 props
props: {
dialogStatus: { // 變數
required: true,
type: Boolean,
default: false
},
dataArr: { // 陣列
required: true,
type: Array,
default: () => []
},
userData: { 物件
required: true,
type: Object,
default: () => {}
},
},
監聽 watch
watch: {
dialogStatus(newVal, oldVal) {
this.isDialogShow = newVal
},
userData: {
immediate: true, // 解決第一次顯示頁面不生效問題
handler(newVal, oldVal) {
this.singleData = deepClone(newVal)
}
}
},
參考報錯: [元件賦值 object 第一次不生效問題](#元件賦值 object 第一次不生效問題)
靜態載入
動態載入
- Vue動態元件和非同步元件 - https://segmentfault.com/a/1190000018018502
- 官網: 動態元件 & 非同步元件 - https://cn.vuejs.org/v2/guide/components-dynamic-async.html
非同步載入
- Vue中的非同步元件 - https://juejin.im/post/5c3c7435e51d4551cd71cf5c
- 官網: 動態元件 & 非同步元件 - https://cn.vuejs.org/v2/guide/components-dynamic-async.html
父元件控制子元件顯示隱藏
- https://segmentfault.com/q/1010000014179934
不能同步一個值
tree
- https://element.eleme.io/#/zh-CN/component/tree
自定義唯一 key
node-key
,其值為節點資料中的一個欄位名,該欄位在整棵樹中是唯一的。
半選狀態
this.checkStrictly = false
程式碼動態設定時, 選中子節點時, 父節點才有半選狀態
mock 伺服器
- https://www.jianshu.com/p/7cbf83eff644
使用 json 當做臨時資料庫
使用 const fs = require('fs')
io 本地檔案即可
hot reload 忽略 部分檔案監聽
-
修改 mock-server.js 增加忽略檔案
// watch files, hot reload mock server chokidar.watch(mockDir, { ignored: /mock-server/, ignoreInitial: true }).on('all', (event, path) => { //修改為 // watch files, hot reload mock server chokidar.watch(mockDir, { ignored: [/mock-server/, /fakedb/], // 這樣 fakedb 目錄下的檔案就不會被監聽 ignoreInitial: true }).on('all', (event, path) => {
- 忽略寫法參考: https://github.com/micromatch/anymatch
-
重啟 mock. done
踩坑
在 mock 目錄下, 檔案變化會導致 hotload 重啟伺服器
通常在使用 [使用 json 當做臨時資料庫](#使用 json 當做臨時資料庫) 是 io 檔案後, 回導致重啟伺服器, 導致伺服器 token 被重置, 解決辦法: hot reload 忽略 部分檔案監聽
許可權驗證
- 許可權驗證 (靜態許可權) - https://panjiachen.gitee.io/vue-element-admin-site/zh/guide/essentials/permission.html#%E9%80%BB%E8%BE%91%E4%BF%AE%E6%94%B9
- 手摸手,帶你用vue擼後臺 系列二(登入許可權篇) (動態許可權) - https://juejin.im/post/591aa14f570c35006961acac
動態路由
- 將前端的 路由 丟個後端, 後端鑑權後獲取該使用者可訪問的路由表通過 json 方式發給前段, 前端在轉成路由,
router.addRoutes(accessRoutes)
的方式動態新增進去.
執行時 惰性載入 import 問題
-
webpack 打包不能再執行時 import 一個變數, 會報錯找不到頁面:
__webpack_require__("xxx"
, 只能 import 一個常量值, 所以曲線救國的方式是用一個 map 去對映const routerMap = { 'layout': () => import('@/layout'), '~/views/permission/page': () => import('~/views/permission/page'), '~/views/permission/directive': () => import('~/views/permission/directive') } item.component = routerMap[item.component] // 正確姿勢 // item.component = () => import(item.component) // 報錯, 執行時變數
-
參考
- vue 非同步元件採用引數路徑報錯 - https://segmentfault.com/q/1010000012485066
增加頁面
因為 [執行時 惰性載入 import 問題](#執行時 惰性載入 import 問題) 的原因, 所以每次新增頁面需要 服務端路由表增加一個 router, 在 客戶端 map 對映表增加一個頁面對映
伺服器下發路由表 component 值問題
下發的路由中的 component 欄位不要有 @
字元, 比如 component: '@/views/excel/select-excel'
, 用 mock 下發時報錯, 換別的語言的伺服器應該不會有問題,
vue.config.js 加個別名
configureWebpack: {
resolve: {
alias: {
'@': resolve('src'),
'~': path.resolve(__dirname, 'src') // 加的別名
}
}
},
就可以這樣下發 json : component: '~/views/excel/select-excel'
踩坑
從後臺獲取路由Map後,前臺轉route的時候報錯
參考: https://github.com/PanJiaChen/vue-element-admin/issues/2381
報錯: __webpack_require__("xxx"
vue-router.esm.js:1897 Error: Cannot find module 'function () {
return Promise.resolve().then(function () {
return (0, _interopRequireWildcard2.default)(__webpack_require__("./src/router sync recursive ^.*$")
webpack 打包不能再執行時 import 一個變數, 參考: [執行時 惰性載入 import 問題](#執行時 惰性載入 import 問題)
報錯: must be accessed with "$data."
參考: 從後臺獲取路由Map後,前臺轉route的時候報錯 - https://github.com/PanJiaChen/vue-element-admin/issues/2381
將 伺服器下發的路由 轉換一下
webpack 打包
- 構建和釋出 - https://panjiachen.github.io/vue-element-admin-site/zh/guide/essentials/deploy.html
部署
https://panjiachen.gitee.io/vue-element-admin-site/zh/guide/#%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84
# clone the project
> git clone git@github.com:PanJiaChen/vue-element-admin.git
# enter the project directory
> cd vue-admin-template
# install dependency
> npm install
# develop
> npm run dev
protobuf 接入
- 如何在前端中使用protobuf(vue篇) - https://www.fengxianqi.com/index.php/archives/129/
流程
-
安裝 pb 相關庫
npm install --save protobufjs protobufjs/light
-
將 xxx.proto 生成為 js 檔案
npx pbjs -t json-module -w commonjs -o src/proto/proto.js proto/*.proto
-
將此命令加入 package.json, 方便以後生成
"scripts": { "serve": "vue-cli-service serve", ... "proto": "npx pbjs -t json-module -w commonjs -o src/proto/proto.js proto/*.proto" },
-
-
a
js 語法糖
獲取物件中的某個屬性
const response = {
data: 111,
name: 222,
}
const { data } = response // 獲取 data 欄位
多個 then
- es6中Promise多個then的使用方法 - https://blog.csdn.net/qq575792372/article/details/83901397
踩坑
方法呼叫引數要一直
不一致會導致呼叫不到方法
請求 400 錯誤
可能是請求的引數封裝成 json 不對
request({ url: ENetCmd.GetPermission, method: 'post', data: token // 修改為 request({ url: ENetCmd.GetPermission, method: 'post', data: { token: token, arg1: '666' }
報錯: TypeError: undefined is not iterable
報錯:
Error in mounted hook: "TypeError: undefined is not iterable (cannot read property Symbol(Symbol.iterator))
一般是由於 路由 為 undefined, 導致 vue 讀不到, 所以登出時重置路由不能設為 undefined, 設為一個空陣列就ok
const mutations = { CLEAN_ROUTES: () => { // 不能置為 undefined, 否則讀不到路由會報錯 state.addRoutes = [] // addRoutes 這個是會被 router.addRoutes(accessRoutes) 進去的 state.routes = [] } }
使用 el-image 報錯: Require self-closing on Vue.js custom components (el-image)
參考: https://github.com/PanJiaChen/vue-element-admin/issues/2400
這個元件是 2.9.0 之後才有, vue-element-admin 使用的是 2.7.0, 升級依稀版本就ok
直接修改 package.json 中的版本
"element-ui": "2.12.0"
, 在執行命令:npm i
訪問是報錯: Invalid Host header
參考: https://blog.csdn.net/guzhao593/article/details/85918869
在 vue.config.js 檔案加入
disableHostCheck: true,
module.exports = { devServer: { disableHostCheck: true, // 加入這個欄位 } }
元件賦值 object 第一次不生效問題
參考: https://blog.csdn.net/qq_37800886/article/details/82220574
解決辦法: watch 監聽寫法
watch: { userData(newVal, oldVal) { this.singleData = deepClone(newVal) } }, // 修改為 watch: { userData: { immediate: true, // 增加這個 immediate 這個屬性可以解決 第一次賦值 object 不生效問題 handler(newVal, oldVal) { this.singleData = deepClone(newVal) } } },
http 請求頭 header 上行後變為小寫的問題
參考: https://stackoverflow.com/questions/46200756/header-keys-become-lowercase-when-interacting-with-api-react-native
根據 RFC 2616, 應該 大小寫不敏感
js map 的 Object.keys 遍歷時, number 型別的 key 變為了 string 型別
用 Number 轉換成功 number 型別
const permArr = [] Object.keys(this.appPermMap).forEach(key => { permArr.push({ appId: Number(key), // 這裡有個坑, permissionArr: this.appPermMap[key], }) })
相關文章
- 記錄
- 20240505記錄《程式碼隨想錄》筆記筆記
- Conda常用命令記錄(自用記錄)
- planetype記錄
- Spring記錄Spring
- Ionic記錄
- paper記錄
- GitText記錄Git
- 思路記錄
- MongoDB 記錄MongoDB
- 2024.3 記錄
- MyBatis記錄MyBatis
- debian記錄
- 工具記錄
- Git記錄Git
- 命令記錄
- explain記錄AI
- 地址記錄
- PEAC記錄
- PlaneLoc記錄
- 科研記錄
- 2024.10 記錄
- rabbitmq 記錄MQ
- nginx 記錄Nginx
- mybatis 記錄MyBatis
- jvm 記錄JVM
- spring 記錄Spring
- Kafka 記錄Kafka
- netty 記錄Netty
- 指令記錄
- 照片記錄
- git 記錄Git
- redis 記錄Redis
- 好文記錄
- ad記錄
- Duel 記錄
- 學習記錄Spring Boot 記錄配置細節Spring Boot
- 淘寶記錄筆記筆記