前端开发那些事儿Vue

vue3.0 + ts 使用viewerjs 图片放大预览插件

2020-11-09  本文已影响0人  seaflyj

前端时间vue3.0正式发布了,于是就尝试把原有项目重构一下,结合typescript重构项目,总体上还是很容易上手的,就是在集成一些老的插件方面遇到一些问题,比如viewerjs,想和一些新手的兄弟们一起分享一下经验;

首先,安装viewerjs

npm install viewerjs --save

viewerjs已经集成好了ts的类型定义文件,我们不需要单独安装,只是在使用时候需要注意

一、全局引入

import { createApp } from 'vue';
import App from './App.vue';
import router from './router';
import Viewer from 'viewerjs';
import 'viewerjs/dist/viewer.css';
Viewer.setDefaults({
  navbar: true,
  title: true,
  toolbar: {
    prev: true,
    next: true,
  },
});
const Vue = createApp(App);
Vue.use(router);
Vue.use(() => Viewer); //这样引入是为了兼容ts规定的类型,不用箭头函数方式会报错Argument of type 'typeof Viewer' is not assignable to parameter of type 'Plugin_2'.Property 'install' is missing in type 'typeof Viewer' but required in type '{ install: PluginInstallFunction; }'
Vue.mount('#app');

然而引入不报错了,却不能使用,这里如果那位大神解决了,烦劳告诉我一下解决办法;
索性我们还是局部引入吧,毕竟也不是每个组件都能用到,于是放弃了在main.ts中使用;

二、局部引入,这次成功了

按照vue2的引入方式,结果凉凉了

<template>
  <div class="home images" id="viewerjs">
    <HelloWorld msg="Welcome to Your Vue.js + TypeScript App" />
    <img alt="Vue logo" src="../assets/logo.png" />
    <img alt="Vue logo" src="../assets/logo.png" />
  </div>
</template>

<script lang="ts">
import { defineComponent, onMounted, reactive } from 'vue';
import HelloWorld from '@/components/HelloWorld.vue'; // @ is an alias to /src
import Viewer from 'viewerjs';
import 'viewerjs/dist/viewer.css';
export default defineComponent({
  name: 'Home',
  components: {
    HelloWorld,
  },
  setup() {
    onMounted(() => {
      const aaaa = document.getElementById('viewerjs')
      new Viewer(~~aaaa~~, { // ts类型报错 Argument of type 'HTMLElement | null' is not assignable to parameter of type 'HTMLElement'.Type 'null' is not assignable to type 'HTMLElement'
        navbar: true,
        title: true,
        toolbar: {
          prev: true,
          next: true,
        },
      });
    });
  },
});
</script>

这个错误解释就是,Viewer需要传入的类型是HTMLElement,而aaa被推断的类型的一个'HTMLElement | null'的联合类型,所以不正确,那么实际上我们知道aaa就是一个HTMLElement类型所以可以使用类型断言的方式,强制让ts知道aaa的类型,于是解决了;

 const aaa = <HTMLElement>document.getElementById('viewerjs')
 //或者
 const aaa = document.getElementById('viewerjs') as HTMLElement
 

上述两者都可以二选一,然后完美解决,附上全部代码;

<template>
  <div class="home images" id="viewerjs">
    <HelloWorld msg="Welcome to Your Vue.js + TypeScript App" />
    <img alt="Vue logo" src="../assets/logo.png" />
    <img alt="Vue logo" src="../assets/logo.png" />
  </div>
</template>

<script lang="ts">
import { defineComponent, onMounted, reactive } from 'vue';
import HelloWorld from '@/components/HelloWorld.vue'; // @ is an alias to /src
import Viewer from 'viewerjs';
import 'viewerjs/dist/viewer.css';
export default defineComponent({
  name: 'Home',
  components: {
    HelloWorld,
  },
  setup() {
    onMounted(() => {
      new Viewer(document.getElementById('viewerjs') as HTMLElement, {
        navbar: true,
        title: true,
        toolbar: {
          prev: true,
          next: true,
        },
      });
    });
  },
});
</script>

微信截图_20201110153916.png
上一篇 下一篇

猜你喜欢

热点阅读