vue 问题汇总

2,067 阅读2分钟

问题一

element-plus 插件报错

Module not found: Error: Package path ./lib/locale/lang/zh-cn is not exported from package ...项目路径\node_modules\element-plus (see exports field in ...项目路径\node_modules\element-plus\package.json)



ERROR in ./src/plugins/element.js 2:0-48
Module not found: Error: Package path ./lib/theme-chalk/index.css is not exported from package ...项目路径\node_modules\element-plus (see exports field in ...项目路径\node_modules\element-plus\package.json)
 @ ./src/main.js 5:0-51 7:0-18

ERROR in ./src/plugins/element.js 3:0-56
Module not found: Error: Package path ./lib/locale/lang/zh-cn is not exported from package ...项目路径\node_modules\element-plus (see exports field in ...项目路径\node_modules\element-plus\package.json)
 @ ./src/main.js 5:0-51 7:0-18

方法

之前的代码

import ElementPlus from 'element-plus'
import 'element-plus/lib/theme-chalk/index.css'
import locale from 'element-plus/lib/locale/lang/zh-cn'

export default (app) => {
  app.use(ElementPlus, { locale })
}

修改后的代码

import ElementPlus from 'element-plus'
import 'element-plus/theme-chalk/index.css'
import locale from 'element-plus/es/locale/lang/zh-cn'

export default (app) => {
  app.use(ElementPlus, { locale })
}

总结

安装的element-plus 2.4.2 依赖, 里面部分代码路径更新了, 导致插件中的配置有问题

问题二

tab切换(VUE中el-tabs切换)echarts无法显示的问题

最近刚好项目里需要用到tab切换显示echarts,也同样出现了图表总是刷不出来的问题。对于这个问题我也是翻看了很多资料哈,其实最后都不是我想要的效果之类的,比如说v-if之类的,话不多说直接上我自己的解决办法

方法一

每次tab切换时我们只需要重新获取到该标签,然后调用一下resize就行

var echarts = require('echarts');
this.dataChart = echarts.init(document.getElementById('dvDataCharts'));

image.png

在el-tabs事件tabChange里引用echarts的resize(),前面一定要加this.$nextTick哦

image.png

方法二

var echarts = require('echarts');
this.dataChart = echarts.init(document.getElementById('dvDataCharts'));
handleClick (active) {
  if(active.name == 'echart'){
    this.$nextTick(()=>{
      this.dataChart && this.dataChart.resize();
      //echarts.getInstanceByDom(this.$refs.dvEchart).resize();
    })
  }

},

总结

每次tab切换时我们只需要重新获取到该标签,然后调用一下resize

问题三

vue3 reactive赋值问题

let obj = reactive({
	name: 'zhangsan',
	age: '18'
})
obj = {
	name: 'lisi'
	age: ''
}
// 上面这样赋值检测不到,因为响应式的是它的属性,而不是它自身
			
// 如需要对 reactive 赋值
// 方法1: 单个赋值
obj['name'] = 'lisi';
obj['age'] = '';
// 方法2:多包一层
let obj = reactive({
	data: {
		name: 'zhangsan',
		age: '18'
	}
})
obj.data = {
	name: 'lisi'
	age: ''
}

清空对象

// 错误示例
<template>
  <div>{{ obj }}</div>
  <button @click="click">点击</button>
</template>
 
<script setup>
import { reactive } from 'vue'
let obj = reactive({a: 111, b: 222})
const click = () => {
  obj = {}
  console.log(obj) // 这里打印的结果是正常的空对象
}
</script>

如何监听vuex中的变量参数变化,用watch!

watch: { 
    '$store.getters.vuex变量'(d) {
        console.log(d);
    },
},
import { mapGetters } from "vuex";
 
computed: {
    ...mapGetters(["vux变量"]), 
},
 
watch: {
    vux变量(d) {
        console.log(d);
    },
},

v-show 的问题

      <div class="h-full border border-color-basis p-16">
        <ChartStyle v-show="state.checkedTab == '0'" :chartConfig="chartConfig" :drawBatteryTests="drawBatteryTests" />
        <AxisAndScaleLines v-show="state.checkedTab == '1'" />
        <Scale v-show="state.checkedTab == '2'" />
        <Grid v-show="state.checkedTab == '3'" />
      </div>

如上所示:通过v-show控制四个子组件的显示和隐藏,但是我加上去怎么都不生效,F12查看元素发现子组件并没有各自的父元素,而且也没有display:none这个样式(v-show底层是通过display:none控制元素的显示隐藏的)

结果真的是:由于我的子组件没有一个根节点,也就是在template区域直接就写了各个小部分的节点,没有一个大的div(这就可能造成各个小部分的display:flex和v-show的display:none造成冲突,导致v-show失效) ,直接在各个子组件加上根节点就可以了