1.切换npm镜像源
检查当前的下包地址:
npm config get registry
把下包的地址切换为国内的淘宝服务器
npm config set registry=https://registry.npm.taobao.org/
官网地址
npm config set registry https://registry.npmjs.org
2.axios拦截器
// 添加请求拦截器
axios.interceptors.request.use( (req) => {
// 在发送请求之前做些什么
...
return req;
}, (err) => {
// 对请求错误做些什么
...
// 该返回的数据是axios.catch(err)中接受的数据
return Promise.reject(err);
});
// 添加响应拦截器
axios.interceptors.response.use( (res) => {
// 对响应数据做点什么
...
// 该返回的数据是axios.then(res)中接受的数据
return res;
}, (err) => {
// 对响应错误做点什么
...
// 该返回的数据是axios.catch(err)中接受的数据
return Promise.reject(err);
});
// axios请求错误时,可在catch里进行错误处理。
axios.get().then().catch(err => { // 错误处理 })
3.axios全局配置
axios.defaults.baseURL = 'https://api.example.com';
axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
4.常用正则表达式
- 比较常用:
-
1.Email地址:
/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/ -
2.手机号码:
/^(13[0-9]|14[57]|15[0-9]|17[067]|18[0-9])\d{8}$/ -
3.国内电话号码(0511-4405222、021-87888822):
/^0\d{2,3}[-]\d{7,8}$/ -
4.身份证号( X位、X位数字):
/^\d{* }|\d{* }$/ -
5.密码强度
- 只有大小写字母:
/^([a-z].*[A-Z])|([A-Z].*[a-z])$/ - 大小写字母与数字:
/^([a-z].*[0-9])|([A-Z].*[0-9])|[0-9].*[a-zA-Z]$/ - 大小写字母+数字+下划线:
/^[A-Za-z0-9]+[_][A-Za-z0-9]*/
- 只有大小写字母:
-
6.电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX)
/^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$/ -
7.域名:
/[a-zA-Z0-9][-a-zA-Z0-9]{0,* }(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,* })+/.?/ -
8.InternetURL:
/[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$/
5.使用 FileReader 把图片读取为 base64 格式的字符串
<input @change="onFileChange" type="file" style="display: none;" accept="image/*" ref="iptFile" />
onFileChange(e) {
const files = e.target.files
if (files.length === 0) {
// avatar: data里用来存储base64格式的字符串
this.avatar = ''
} else {
// 1. 创建 FileReader 对象
const fr = new FileReader()
// 2. 调用 readAsDataURL 函数,读取文件内容
fr.readAsDataURL(files[0])
// 3. 监听 fr 的 onload 事件
fr.onload = e => {
// 4. 通过 e.target.result 获取到读取的结果,值是字符串(base64 格式的字符串)
this.avatar = e.target.result
}
}
}
6.FormData格式(example:发布文章里面的ajax发送请求需要头像)
// 发起请求,发布文章
async postArticle() {
// 1. 创建 FormData 对象
const fd = new FormData()
// 2. 向 FormData 中追加数据
// Object.keys(对象) => 数组 对象中所有的键 ['title', 'cate_id', 'content', 'cover_img', 'state']
Object.keys(this.pubForm).forEach( item => {
fd.append ( item, this.pubForm [ item ] )
})
// 3. 发起请求
const { data: res } = await this.$http.post('/my/article/add', fd)
if (res.code !== 0) return this.$message.error('发布文章失败!')
this.$message.success('发布文章成功!')
// 4. 关闭对话框
this.pubDialogVisible = false
},
7.动态设置封面图片的 src 地址
onFileChange (e) {
// console.dir(e.target)
// 获取用户选择的文件列表
const files = e.target.files
if (files.length === 0) {
// 没有选择图片
this.pubForm.cover_img = null
// 点击取消显示默认图片(图片模块)
this.$refs.imgRef.src = defaultImg
} else {
// 选择了照片
this.pubForm.cover_img = files[0]
// 实现图片预览 files[0]图片对象 => img展示 (方式: 1.转成base64格式放入src 2.图片地址URL)
const url = URL.createObjectURL(files[0])
// console.log(url) // http://localhost:8080/a73c32e0-056b-4b2d-9d2b-7bc23ff30592
// 将url路径赋值给img的src属性
this.$refs.imgRef.src = url
}
8.ESLint 插件自动格式化
- ESLint (读取 ESLint 配置文件进行语法检测)
- Prettier ESLint(按照 ESLint 配置文件进行格式化)
-
若希望Ctrl+S自动格式化,还需要打开 JSON 格式的设置文件进行配置
- vscode-设置-首选项-设置-点击用户区的设置JSON图标-将以下配置粘贴进设置 JSON 文件中
{
"eslint.enable": true,
"eslint.run": "onType",
"eslint.options": {
"extensions": [
".js",
".vue",
".jsx",
".tsx"
]
},
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
}
}
9.element-ui table表格 自定义索引 (分页序号算法)
让分页的下一页序号不从头开始,而是按顺序继续往后
<el-table-column label="序号" type="index" :index="indexMethod" />
// 自定义索引值 index默认是从0开始
// 需求: 让数据按照顺序排列
// 算法: (page-1)*pagesize+index+1
indexMethod(index) {
return (this.page - 1) * this.pagesize + index + 1
},
10.javascript读取excel时间格式
// js中时间戳: 1970-1-1开始,以毫秒为单位
// js读取excel时间格式: 1900-1-1开始,并且以天数为单位
export function formatExcelDate(numb, format = '/') {
const time = new Date((numb-25567) * 24 * 3600000 - 5 * 60 * 1000 - 43 * 1000 - 24 * 3600000 - 8 * 3600000)
time.setYear(time.getFullYear())
const year = time.getFullYear() + ''
const month = time.getMonth() + 1 + ''
const date = time.getDate() + ''
if (format && format.length === 1) {
return year + format + month + format + date
}
return year + (month < 10 ? '0' + month : month) + (date < 10 ? '0' + date : date)
}
// 使用
new Date(formatExcelDate(item))
11.npm i 包
npm i qrcode // 生成二维码的插件
npm i vue-print-nb // 利用vue-print-nb实现打印功能
12.uni-app配置网络请求
小程序项目中不支持 axios,而原生的 wx.request() API 功能较为简单,不支持拦截器等全局定制的功能。因此,在 uni-app 项目中使用 @escook/request-miniprogram 第三方包发起网络数据请求。
下完以上包后在项目的 main.js 入口文件中,通过如下的方式进行配置:
yarn add @escook/request-miniprogram
import { $http } from '@escook/request-miniprogram'
uni.$http = $http
// 配置请求根路径
$http.baseUrl = 'https://www.uinav.com'
// 请求拦截器
$http.beforeRequest = function (options) {
uni.showLoading({
title: '数据加载中...',
})
}
// 响应拦截器
$http.afterRequest = function () {
uni.hideLoading()
}
// 使用
await uni.$http.get('...')
13.webpack打包优化 去除console.log
yarn add babel-plugin-transform-remove-console
// 安装完包后生成的babel.config.js中加上 transform-remove-console 即可
module.exports = {
presets: [
// https://github.com/vuejs/vue-cli/tree/master/packages/@vue/babel-preset-app
'@vue/cli-plugin-babel/preset'
],
'env': {
'development': {
// babel-plugin-dynamic-import-node plugin only does one thing by converting all import() to require().
// This plugin can significantly increase the speed of hot updates, when you have a large number of pages.
// https://panjiachen.github.io/vue-element-admin-site/guide/advanced/lazy-loading.html
'plugins': ['dynamic-import-node']
},
/* 上线环境去除console.log */
'production': {
// babel-plugin-dynamic-import-node plugin only does one thing by converting all import() to require().
// This plugin can significantly increase the speed of hot updates, when you have a large number of pages.
// https://panjiachen.github.io/vue-element-admin-site/guide/advanced/lazy-loading.html
'plugins': ['dynamic-import-node', 'transform-remove-console']
}
}
}