同学们可以私信我加入学习群!
在前面使用electron+vue3的过程中,已经验证了历史vue2代码+vue3混合开发的模式。
本次旧项目vue框架整体升级中,同事已经完成了vue3、pinia、store等基础框架工具的升级。所以我此次记录的主要是vite打包工具升级以及升级后,修改项目中使用到的插件工具兼容性bug。
import SockJS from 'sockjs-client'
改为:
import SockJS from 'sockjs-client/dist/sockjs.min.js'
const echarts = require('echarts')
import * as echarts from 'echarts'
这是echarts插件报错,原因是项目中把echart对象变为响应式,vue3响应式实现是利用代理实现,这会导致把echart变成一个代理对象,
可能造成echart插件本身某些api无法实现。
经过排查,找到“module-mail/mail-stats/view/mail-stats”组件,把其中在data中定义的myChart对象删除,然后修改所有和this.myChart相关代码即可。
主页面上面的导航栏点击后,页面不能正常跳转。这部分用到了标签组件:tags-nav.vue,查看代码可知,tags-nav.vue是main.vue的子组件,子组件中handleClick方法
触发了update:value方法,而父组件中定义的是@input,导致点击handleclick时子组件向父组件传值出现问题。查看git记录,发现这是升级iviewui时导致的不兼容,所以决定
更改main.vue中的应用,即把@input改为@update:value,后续框架修改也应大致遵循,底层优于顶层,框架优于应用的原则,在这次修改中,main.vue组件是tag-nav.vue的父组件,
对于tags-nav而言,main.vue即是应用,所以应该优先修改main.vue,以避免造成更大影响,且更利于后续框架viewui的升级。
vuedraggable组件时vue2版本,升级为vue3版本:
yarn add vuedraggable@next
核心代码大致如下:
importCom() {
let me = this
//当配置页选择不同的路由时,无法监听到c属性,即import()函数的变化,所以无法进入此方法,也就无法达到实时改变组件的效果
//为返回值增加一个无用的r属性,r,t属性的作用只有一个:保证当route值、dateType改变时,此方法体可以被调用
const route = me.getCom(this.index).route
return { c: () => import('../' + route), r: route, t: this.dateType }
},
依赖这种思路,实现了通过统一的json配置文件,加载大屏中各个模块的组件、名称等基本信息,并可通过修改json随意插拔。
现在import()函数在vite中不可使用变量,所以修改这部分代码,用vue3的方式实现(vue2(选项式)+vite如何加载异步组件没研究,感觉也没有研究的必要,因为vue2一般是搭配webpack):
//前面template部分代码不变,js部分改造为setup,核心代码如下
import {computed, defineAsyncComponent} from 'vue'
const importCom=computed(()=>{
//当配置页选择不同的路由时,无法监听到c属性,即import()函数的变化,所以无法进入此方法,也就无法达到实时改变组件的效果
//为返回值增加一个无用的r属性,r,t属性的作用只有一个:保证当route值、dateType改变时,此方法体可以被调用
const route = getCom(props.index).route
const viteComponents = import.meta.glob("../**/*.vue");
return { c:defineAsyncComponent(viteComponents['../' + route]),
r: route,
t: props.dateType }
})
主要是借助import.meta.glob生成多组件数组,import函数中虽然不能写变量,但是生成的组件数组+变量,可以得到需要的组件。
这样得到的组件是异步组件,通过defineAsyncComponent加载异步组件。
这部分内容网上资料不多,所以记录下来,以备后续完成第4条提过的路由插件里相关的配置功能。
以上是插件最简几行代码,这四行不能缺失。
b)报错 draggable element must have an item slot:这报错也是因为没有写item插槽,按照上面的语法写了插槽后,这报错就能解决。
c)报错Item slot must have only one child:这是由于item插槽下有多个元素,应该只有一个div。哪怕是注释的div也会报错
{{element}}
上面示例中div上面的元素已经注释,仍会出错。正确写法:
//这里可以随意写
{{element}}
本文章仅作为记录笔记,有类似问题但感觉上面描述不详尽的同学,可评论或私信。