背景
npm i -S view-design
当前老项目使用view-design这个组件库,但是当我们去官网查看该组件库最新版本,竟然发现没有博主想用的image/ImagePreivew这两个基础组件
说实话,有点离谱了哈!!
自己造轮子?
貌似为了一天的小需求,不太可能,直接找view-design的弟弟view-ui-plus它的这两个基础组件,然后整合进去
进入主题
- 先给大家介绍一个vs-code的插件,这样大家操作起来会简单点(好有爱的博主!!)
然后利用这个插件,把viewuiplus的源码打开,找到这image/ImagePreivew两个组件的代码,
接下来我会说一下,我们需要更改的部分
- 当你把源码放到项目,那么你项目中就会多出这两个组件的文件夹,就想这样
由于view-design是基于vue2.x版本封装的组件,而view-ui-plus是基于vue3.x写的。拷贝之后,代码中会出现很多新的api和组件使用,我们要一一替换成vue2.x版本的写法。
替换写法【要先初步看看这两个组件的代码哈】
.vue文件
文件中出现的getCurrentInstance()的api,是vue3组合api中用来获取vue实例的,所以我们在vue2中,直接this就可以, 用代码表述意思就是
// vue3
import { getCurrentInstance } from 'vue';// 获取组件实例
const global = getCurrentInstance().appContext.config.globalProperties;
// vue2
this
但是,这里直接采用固定的默认值就行,举个栗子【其他的同理改】
transfer: {type: Boolean,default () {const global = getCurrentInstance().appContext.config.globalProperties;return !global.$VIEWUI || global.$VIEWUI.transfer === '' ? false : global.$VIEWUI.transfer;}
},
替换成
transfer: {type: Boolean,default () {return false;}
},
image-preview.js
默认都是vue3的写法,它直接使用了vue库中提供的createApp、h、getCurrentInstance, 以及mount方法, 我们改写成vue2写法:
ImagePreview.newInstance = properties => {if (!isClient) return;...const Instance = new Vue({...render () {return h => h(ImagePreview, Object.assign({}, _props, {...}));},...created () {_instance = this.$el;}});...Instance.$mount(container);...
};export default ImagePreview;
迁移一部分工具代码
以下的方法需要自己把源码(在utils中)拷过来,然后导入即可
- isClient;搬用人家的方法
- downloadFile; 搬用人家的方法
- keyCode
// keycode代码,其他不用的就删掉了
const KeyCode = {/*** ESC*/ESC: 27,/*** SPACE*/SPACE: 32,/*** LEFT*/LEFT: 37, // also NUM_WEST/*** UP*/UP: 38, // also NUM_NORTH/*** RIGHT*/RIGHT: 39, // also NUM_EAST/*** DOWN*/DOWN: 40, // also NUM_SOUTH
};export default KeyCode;
修改导入
// 下面导入可以直接用
import { on, off } from "view-design/src/utils/dom";
import throttle from "lodash.throttle";
// 按照上面的迁移哦
import { isClient, downloadFile } from "../../utils";
// 按照上面的迁移哦
import KeyCode from "../../utils/keyCode";
import { transferIndex, transferIncrease } from "view-design/src/utils/transfer-queue";
import TransferDom from 'view-design/src/directives/transfer-dom';
特殊说明:image-preview.vue
teleport组件是vue3的内置组件,这里起初我用了适合vue2的自定义teleport的组件(感兴趣的可以看看vue2-teleport库的实现),但是发现view-design中有自定义指令TransferDom实现了同样的功能,所以就直接用自带的啦
<teleport to="body" :disabled="!transfer">...</teleport>
更改为:
<div v-transfer-dom :data-transfer="transfer">...
</div>
写到最后
使用方式同view-ui-plus的Image/ImagePreview组件, 直接查看使用即可。
如果帮助到大家,帮忙点个免费的赞就行啦,让博主知道帮到了大家开心开心!!!