项目踩坑记

158 阅读2分钟

1. 路由死循环,堆栈溢出

  • 原因:next() 表示路由成功,直接进入to路由,不会再次调用router.beforeEach()。next('/login') 表示路由拦截成功,重定向至login,会再次调用router.beforeEach()

2. 地图加载时页面卡顿严重

  • 原因:代码阻塞,并非地图json文件过大
  • 解决方案:
setTimeout(() => {
        this.myChart.setOption(conf, true);
        this.myChart.resize();
      }, 30);

3. 性能优化,数据报表页面加载慢

  • 原因:指标太多导致多次请求接口
  • 解决方案:接口优化,传入指标集合即可,即一次接口请求返回所有数据

4. 免登的实现

enbrands登录时暗调用BI系统(相当于首次携参请求BI系统但不跳转到BI系统,以便确确认当前是否有用户登录)。登录进来后点击BI数据分析跳转BI系统,免登成功则进入列表页,免登失败则进入login页面。

  • 问题:首次携参请求BI系统时没有触发暗操作
  • 原因:php开发中,没有触发image的url,故没有检测到首次免登结果
  • 方案:image换成iframe;增加个接口请求,请求的url即为BI系统的url

5. 时间格式转化

// 获取当前标准时间
let date = new Date();
// 标准时间转时间戳
let timeStamp = date.getTime();
// 标准时间转时间格式
let timeFormat = dayjs(date).format("YYYY-MM-DD");

// 获取当前时间戳
let currentTime = Date.now();
// 获取当前时间戳(具体到秒) 8.64e7 = 8.64*10的7次方
var currentTime = Date.now() - 8.64e7;
// 获取当前时间戳(具体到秒)
var currentTime = Date.now() - 24 * 60 * 60 * 1000;

6. vue重新渲染的几种方式

  • 使用组件中的key,key变则重新渲染
  • 使用$forceUpdate(),不会更新任何计算属性,仅强制重新渲染视图(销毁并新建)
  • v-if ,结合this.$nextTick实现刷新
  • 重新加载整个页面
  • this.$set(this.form, "key", value)数据更改了但ui没渲染时使用

7. 数值千分位处理

// 数值千分位,保留小数
const thousandsFormat = (num: number, end: number): string => {
	let splits = [];
	let res: any = [];
	splits = num.toFixed(end).toString().split(".");
	splits[0]
		.split("")
		.reverse()
		.map((item, i) => {
			if (i % 3 == 0 && i != 0) {
				res.push(",");
			}
			res.push(item);
		});
	return res.reverse().join("") + (splits.length > 1 ? `.${splits[1]}` : "");
};

// 数值千分位,整数
function integerFormat(num: number): string {
	const c =
		num.toString().indexOf(".") !== -1
			? num.toLocaleString()
			: num.toString().replace(/(\d)(?=(?:\d{3})+$)/g, "$1,");
	return c;
}

8. 数组找最值

const arr = [1, 2, 3, 4, 5, 6, 7, 1];

// 1
var max = arr[0];
for (let i = 0; i < arr.length; i++) {
	max = Math.max(max, arr[i]);
}

// 2.函数reduce
var max = arr.reduce(function (pre, next) {
	return Math.max(pre, next);
});

// 3.排序sort
arr.sort(function (a, b) {
	return a - b;
});
var max = arr[arr.length - 1];

// 4.es6中
var max = Math.max(...arr);

9. vue3中setup前面加上async后页面不显示

  • 使用<suspense>标签包裹当前组件
  • 使用生命周期钩子,如下代码:
setup() {
    onBeforeMount(async () => {
      const result = await axios.get(".............");
    });
  }

10.