Vue错误汇总二

标签: 无 分类: 未分类 创建时间:2021-07-15 08:01:36 更新时间:2024-11-15 10:49:44

1.vuex的modules中commit is not defined

主store内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import Vue from 'vue';
import Vuex from 'vuex';

/** 引入模块 */
import Simulation from "@pages/simulation/store";

Vue.use(Vuex)

export default new Vuex.Store({
modules:{
simulation:Simulation
},
state: {},
mutations: {},
getters:{},
actions: {}
})

simulation.js文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import Vue from 'vue'
import animation from './animation'
import compose from './compose'
import contextmenu from './contextmenu'
import copy from './copy'
import event from './event'
import layer from './layer'
import snapshot from './snapshot'
import lock from './lock'

const data = {
namespaced:true,//注意 模块化管理数据请不要忘了命名空间的开启
state: {
},
mutations: {
compose({ componentData, areaData, editor }) {
console.log(commit); // 输出commit为undifine
console.log(this.commit); // 正确的使用方法
}
},
}

export default data

模块的使用:store.state.simulation ,获取到模块中的state。

参考文章:
1.vuex中mutations一个方法需要调用另外一个方法 在vuex中的mutations方法,想调用mutations中的另外一方法,还是用commit,只需要使用this.commit(‘function’),当前的this指向的就是当前模块中的mutations;
2.vuex 多模块时 模块内部的mutation和action的调用方式

2.键盘事件@keyUp不起作用

这个问题很奇怪,就是说,这个keyup事件,有时候能起作用,但是有时候不会起作用。

1
<div class="shape" @keyup="handleKeyUp"></div>

【解决方案】
也就是说,在div上单纯的监听键盘事件是不行的,需要使用 window 或者是 document 进行键盘事件的监听

参考文章:
1.vue element-ui 绑定@keyup事件无效 这里给出的方法:加上.native覆盖原有封装的keyup事件即可,但是无效
2.vue键盘事件不生效 如果元素没有获取焦点,keyup事件无法生效。解决办法一: 按钮添加自定义指令(获取焦点),添加事件修饰符,ok搞定;解决办法二:把事件绑定到父元素(外框)
3.发现给div绑定keyup.enter事件是没有效果的。那该如何实现呢?下面直接上代码吧 在created的生命周期中,写一个全局的enter事件,使用document.onkeyup
4.[面试官系列] input、change、keydown、keypress、keyup 触发的时机是?
5.VUE中@keyup.enter无法触发没有效果 @click 和 @keyup.enter不能一起使用,可以将@keyup.enter绑定到input框上。这个观点我不敢苟同
6.前端杂症–div等容器keydown事件无效(包括vue的@keydown) onKeydown事件触发条件:容器中某个元素获取焦点时,按键。因此无效的原因是当前容器内并没有元素获取焦点。
7.Vue:div上绑定键盘的enter事件

3.Uncaught (in promise) NavigationDuplicated:Avoided redundant

这个问题,是由于路由重复导致的,多数的解决方案就是添加

1
2
3
4
5
6
7
8
9
import Vue from 'vue'
import Router from 'vue-router'

// 解决ElementUI导航栏中的vue-router在3.0版本以上重复点菜单报错问题
const includPush = Router.prototype.push
Router.prototype.push = function push(location) {
return includPush.call(this, location).catch(err => err)
}
Vue.use(Router);

【解决方法】
为路由增加回调函数,捕获错误。

1
2
3
this.$router.replace({
query: { type: tab },
}).catch(err => {err});

4.not found:regenerator-runtime/runtime.js

这个问题挺奇怪的,就是我同一份的package.json,在windows上没有问题,但是在Deepin上 npm run 就会出现问题。

1
2
3
npm i regenerator-runtime
## 或者
pnpm add regenerator-runtime -D

5.To install it, you can run: npm install –save !xml-loader!../../src/svg

这是别人写的程序用到了vue-svg-icon这个插件,我安装的时候,总是报上面的错误。很多的文章可能出自同一个人之手,就是说再src目录下新建一个svg目录,图表放在里面,就可以解决问题了,但是很遗憾,我明明就有这个目录的,还是不行的。

1
2
3
4
5
6
// 这个方法并不行
import Icon from "vue-svg-icon/Icon.vue";
// 这一句好像要放在Vue.use和Vue.config.productionTip上面
Vue.component("icon", Icon);
Vue.use(ElementUI);
Vue.config.productionTip = false;

【解决方法】
打开vue-svg-icon的源码路径:node_modules\vue-svg-icon\Icon.vue,找到地77行,然后将下面的src/svg路径修改一下就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
icon() {
// 找到这个代码,注释原先的代码
// let xml = require(`!xml-loader!../../src/svg/${this.name}.svg`);
// 修改为下面的代码
let xml = require(`!xml-loader!/src/svg/${this.name}.svg`);
const t = xml.svg.$.viewBox.split(' ');
console.info(`src/svg/${this.name}.svg has been loaded`);
return {
width: t[2],
height: t[3],
paths: convert.SVGtoArray(xml.svg)
}
},
参考文章:
1.vue-svg-icon报错 这个就是添加svg目录的方案,根本不可行
2.vue问题记录svg-icon报错,iconclass 这是另外的一个插件
3.【vue-svg-icon】 !xml-loader! install error 这个问题一模一样,最后楼主换了组件库了
4.SVG 使用教程:如何在 Vue 中使用 SVG icon 图标系统 自己写了svg-icon的使用,感觉特别的麻烦
5.vue-svg-icon 这个就是代码库,也说了是因为找不到src/svg文件夹,但是我明明就已经有了src/svg文件夹了。

6.echarts切换页面不显示问题

这个问题比较特别(好像我遇到的全部的问题都非常的特别),就是我在页面中创建了一个折线图,在本地测试的时候,没有问题,但是部署到服务器上之后,切换页面的时候,就出现问题了,图表出不来了。

【解决方法】
解决方法就是在切换页面的时候,清空echart图表,这样就不会有问题了。

1
2
3
4
5
6
onBeforeUnmount(()=>{
if(chartInstance){
chartInstance.dispose();
chartInstance = null;
}
})

7.cannot reference locally declared variables because it will be hoisted outside of the setup() function.

这个问题就是我在 withDefaults 函数外部定义了变量 baseUrl,然后在 withDefaults 中引入了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<script setup lang="ts">
const baseUrl = import.meta.env.BASE_URL

const props = withDefaults(
defineProps<{
url?: string
mapKey?: string
options?: any
}>(),
{
url: baseUrl + "config/config.json",
mapKey: "default",
options: () => ({})
}
)
</script>

【解决】
修改为下面的东西就好了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<script setup lang="ts">
const props = withDefaults(
defineProps<{
url?: string
mapKey?: string
options?: any
}>(),
{
url: import.meta.env.BASE_URL + "config/config.json",
mapKey: "default",
options: () => ({})
}
)
</script>

8.Uncaught (in promise) SyntaxError: Unexpected token ‘<’, “<!DOCTYPE “… is not valid JSON

本地开发没有问题,但是通过 pnpm build 打包之后,就出现了这么一个莫名其妙的问题。

这个问题算是悬而未决的,幸好项目不是很大,我只能重新进行项目搭建了。

后来经过重新搭建项目,我终于找到了问题的原因,这个代价还是蛮大的。问题主要就出现在了上面的那个问题的这个url配置上面,url:import.meta.env.BASE_URL + “config/config.json”, 我本意是使用环境变量中的内容进行替换,我在环境变量 .env.production 文件中写入了一个变量:VITE_BASE_URL=”/dxs/“,我本意是引用这个变量的,结果写成了 import.meta.env.BASE_URL + “config/config.json”,那么自然而然的就是请求了错误的json文件,结果导致了问题出现。

【解决方法】
解决方法就是将 import.meta.env.BASE_URL 替换为 import.meta.env.VITE_BASE_URL,默认的 import.meta.env.BASE_URL 就是项目名称,不加后面的斜杠的,.env.production 文件中的变量改为:VITE_BASE_URL=”/dxs”

1
2
3
4
5
6
7
8
9
10
11
12
const props = withDefaults(
defineProps<{
url: string
mapKey?: string
options?: any
}>(),
{
url: import.meta.env.VITE_BASE_URL + "/config/config.json",
mapKey: "default",
options: () => ({})
}
)

9.Failed to load plugin ‘n’ declared in ‘.eslintrc.js

Vue3打包的时候,在macos上没有问题,但是到了windows系统上,运行 pnpm build 的时候就出现了问题。

【解决方案】
重新安装 eslint-plugin-n 插件。

1
pnpm add eslint-plugin-n -D
参考文章:
1.eslint Error: Failed to load plugin : Cannot find module ‘eslint-plugin-‘ 报错缺少某个工具时,npm全局安装它
2.eslint-plugin-n

10.Failed to parse source for import analysis because the content contains invalid JS syntax

【解决方案】
就是部分的语法写错了,没有括号闭合之类的错误。

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。