vue3.0 + ts 使用viewerjs 圖片放大預覽插件

前端時間vue3.0正式發(fā)布了,于是就嘗試把原有項目重構(gòu)一下,結(jié)合typescript重構(gòu)項目,總體上還是很容易上手的,就是在集成一些老的插件方面遇到一些問題,比如viewerjs,想和一些新手的兄弟們一起分享一下經(jīng)驗;

首先,安裝viewerjs

npm install viewerjs --save

viewerjs已經(jīng)集成好了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規(guī)定的類型,不用箭頭函數(shù)方式會報錯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的引入方式,結(jié)果涼涼了

<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'的聯(lián)合類型,所以不正確,那么實際上我們知道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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容