亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

在 Typescript 中使用可被復用的 Vue Mixin功能

2019-11-19 14:01:16
字體:
來源:轉載
供稿:網友

轉到用 Typescript 寫 Vue 應用以后,經過一輪工具鏈和依賴的洗禮,總算蹣跚地能走起來了,不過有一個很常用的功能 mixin,似乎還沒有官方的解決方案。

既想享受 mixin 的靈活和方便,又想收獲 ts 的類型系統帶來的安全保障和開發時使用 IntelliSense 的順滑體驗。

vuejs 官方組織里有一個 'vue-class-component' 以及連帶推薦的 'vue-property-decorator',都沒有相應實現。翻了下前者的 issue,有一條掛了好些時間的待做 feature 就是 mixin 的支持。

也不是什么復雜的事,自己寫一個吧。

后注:vue-class-component 6.2.0 開始提供 mixins 方法,和本文的實現思路相似。

實現

import Vue, { VueConstructor } from 'vue'export type VClass<T> = { new(): T} & Pick<VueConstructor, keyof VueConstructor>/** * mixins for class style vue component */function Mixins<A>(c: VClass<A>): VClass<A>function Mixins<A, B>(c: VClass<A>, c1: VClass<B>): VClass<A&B>function Mixins<A, B, C>(c: VClass<A>, c1: VClass<B>, c2: VClass<C>): VClass<A&B&C>function Mixins<T>(c: VClass<T>, ...traits: Array<VClass<T>>): VClass<T> { return c.extend({  mixins: traits })}

聲明 VClass<T> 可作為 T 的類構造器。同時通過 Pick 拿到 Vue 的構造器上的靜態方法(extend/mixin 之類),如此才能夠支持下面這段中的真正實現,通過調用一個 Vue 的子類構造器上的 extend 方法生成新的子類構造器。

function Mixins<T>(c: VClass<T>, ...traits: Array<VClass<T>>): VClass<T> { return c.extend({  mixins: traits })}

至于 ABC 這個純粹是類型聲明的體力活了。

使用

實際使用時:

import { Component, Vue } from 'vue-property-decorator'import { Mixins } from '../../util/mixins'@Componentclass PageMixin extends Vue { title = 'Test Page' redirectTo(path: string) {  console.log('calling reidrectTo', path)  this.$router.push({ path }) }}interface IDisposable { dispose(...args: any[]): any}class DisposableMixin extends Vue { _disposables: IDisposable[] created() {  console.log('disposable mixin created');  this._disposables = [] } beforeDestroy() {  console.log('about to clear disposables')  this._disposables.map((d) => {   d.dispose()  })  delete this._disposables } registerDisposable(d: IDisposable) {  this._disposables.push(d) }}@Component({ template: ` <div>  <h1>{{ title }}</h1>  <p>Counted: {{ counter }}</p> </div> `})export default class TimerPage extends Mixins(PageMixin, DisposableMixin) { counter = 0 mounted() {  const timer = setInterval(() => {   if (this.counter++ >= 3) {    return this.redirectTo('/otherpage')   }   console.log('count to', this.counter);  }, 1000)  this.registerDisposable({   dispose() {    clearInterval(timer)   }  }) }}count to 1count to 2count to 3calling reidrectTo /otherpageabout to clear disposables

注意到直接 extends Vue 的 DisposableMixin 并不是一個有效的 Vue 組件,也不可以直接在 mixins 選項里使用,如果要被以 Vue.extend 方式擴展的自定義組件使用,記住使用 Component 包裝一層。

const ExtendedComponent = Vue.extend({ name: 'ExtendedComponent', mixins: [Component(DisposableMixin)],})

Abstract class

在業務系統中會使用到的 Mixin 其實多數情況下會更復雜,提供一些基礎功能,但有些部分需要留給繼承者自行實現,這個時候使用抽象類就很合適。

abstract class AbstractMusicPlayer extends Vue { abstract audioSrc: string playing = false togglePlay() {  this.playing = !this.playing }}class MusicPlayerA extends AbstractMusicPlayer { audioSrc = '/audio-a.mp3'}class MusicPlayerB extends AbstractMusicPlayer { staticBase = '/statics' get audioSrc() {  return `${this.staticBase}/audio-b.mp3` }}

但抽象類是無法被實例化的,并不滿足 { new(): T } 這個要求,因此只能被繼承,而不能被混入,由于同樣的原因,抽象類也無法被 'vue-class-component' 的 Component 函數裝飾。

這時候只好將實現了的功能寫入 Mixin 中,待實現的功能放到接口里,讓具體類來實現。

interface IMusicSourceProvider { audioSrc: string}/** * @implements IPlayerImplementation */class PlayerMixin extends Vue { /** @abstract */ audioSrc: string logSrc() {  console.log(this.audioSrc) }}interface IPlayerImplementation extends IMusicSourceProvider {}class RealPlayer extends Mixins(PlayerMixin) implements IPlayerImplementation { audioSrc = '/audio-c.mp3'}

這種欺騙編譯器的方式其實還是比較拙劣的,如果一個具體類繼承了 PlayerMixin,卻沒有顯示聲明實現 IPlayerImplementation ,編譯器無法告訴你這個錯誤。我們只能在代碼里小心翼翼寫上注釋,期待使用者不要忘了這件事。

總結

以上所述是小編給大家介紹的在 Typescript 中使用可被復用的 Vue Mixin功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品videosex牲欧美| 久久精品电影网| 91精品国产99久久久久久| 亚洲最大的成人网| 国产精品成人av在线| 久久99久久99精品中文字幕| 亚洲欧美一区二区三区在线| 久久久久久久久亚洲| xxav国产精品美女主播| 韩剧1988免费观看全集| 欧美精品久久久久| 欧美一区二区影院| 98视频在线噜噜噜国产| 久久国产精品久久久| 亚洲男人天堂视频| 欧美在线亚洲一区| 欧美色道久久88综合亚洲精品| 午夜精品一区二区三区在线播放| 国产精品国产三级国产aⅴ9色| 欧美激情区在线播放| 亚洲免费电影在线观看| 国产精品极品美女在线观看免费| 日韩一级裸体免费视频| 国产精品亚洲网站| 日韩精品欧美激情| 日本成人精品在线| 国产精品视频在线播放| 亚洲欧美日韩国产中文专区| 久久人人97超碰精品888| 视频在线一区二区| 久久久久九九九九| 日韩免费在线免费观看| 亚洲精品视频在线观看视频| 超碰97人人做人人爱少妇| 欧美性受xxx| 姬川优奈aav一区二区| 欧美激情网友自拍| 狠狠做深爱婷婷久久综合一区| 538国产精品一区二区在线| 国内精品国产三级国产在线专| 国模私拍一区二区三区| 最近2019年日本中文免费字幕| 国产精品91免费在线| 国产精品一区二区电影| 日本人成精品视频在线| 7m第一福利500精品视频| 欧美日韩国产激情| 欧美理论电影在线观看| 国产精品99久久久久久白浆小说| 久久久久久久久久久人体| 亚洲午夜av久久乱码| 国产伦精品一区二区三区精品视频| 日韩在线视频免费观看| 国产在线a不卡| 全球成人中文在线| 日韩免费观看视频| 日韩激情在线视频| 91精品中文在线| 国产精品成人播放| 久久久久久久国产| 亚洲最大福利视频网| 成人精品一区二区三区电影黑人| 欧美日韩国产中文字幕| 免费成人高清视频| 色综合伊人色综合网站| 日韩天堂在线视频| 日韩精品一区二区三区第95| 国产精品美女久久久久av超清| 亚洲a级在线播放观看| 欧美丝袜一区二区三区| 精品国产依人香蕉在线精品| 国产成人自拍视频在线观看| 另类专区欧美制服同性| 欧美色videos| 国产精品扒开腿做爽爽爽的视频| 成人在线视频福利| 国产69精品99久久久久久宅男| 国产成人免费av电影| 韩日精品中文字幕| 97国产成人精品视频| 欧美日韩国产成人高清视频| 中文字幕日韩欧美精品在线观看| 国产在线观看精品| 久久久97精品| 国产视频999| 88国产精品欧美一区二区三区| 国产欧美精品日韩精品| 韩国视频理论视频久久| 亚洲精选一区二区| 欧美性猛交xxxx免费看| 日韩欧美在线视频| 精品视频www| 亚洲乱码一区二区| 亚洲跨种族黑人xxx| 久久精品久久精品亚洲人| 亚洲人成电影网站色…| 亚洲一区二区三区xxx视频| 日韩在线视频网| 最新69国产成人精品视频免费| 性欧美长视频免费观看不卡| 中文字幕亚洲综合久久筱田步美| 国产精品揄拍500视频| 91精品国产自产在线| 成人在线视频福利| 136fldh精品导航福利| 久久99国产精品久久久久久久久| 成人久久一区二区| 国产精欧美一区二区三区| 亚洲欧美中文日韩在线| 久久免费少妇高潮久久精品99| 欧美日韩一区二区在线播放| 亚洲国产日韩欧美在线图片| 欧美亚洲视频在线看网址| 欧美性高潮床叫视频| 精品女厕一区二区三区| 亚洲97在线观看| 国产精品久久久久秋霞鲁丝| 日韩福利在线播放| 国产午夜精品视频免费不卡69堂| 日本高清不卡在线| 欧美精品18videos性欧| 91久久久久久久一区二区| 不卡在线观看电视剧完整版| 日韩中文字幕免费视频| 亚洲三级黄色在线观看| 亚洲国内高清视频| 欧美日韩综合视频网址| 国产精品成人观看视频国产奇米| 国产69精品久久久久久| 国产精品视频免费观看www| 在线观看欧美日韩| 亚洲成av人片在线观看香蕉| 国产精品一区电影| 国产99视频精品免视看7| 奇门遁甲1982国语版免费观看高清| 一本大道久久加勒比香蕉| 国产成人亚洲综合青青| 国产精品99久久久久久久久| 日韩av在线网址| 欧美国产日韩精品| 欧美精品18videosex性欧美| 亚洲精品在线视频| 国产精品情侣自拍| 日韩风俗一区 二区| 中文字幕亚洲激情| 亚洲福利小视频| 日韩精品免费在线播放| 国产精品网红福利| 亚洲а∨天堂久久精品喷水| 国产精品一区=区| 最近中文字幕日韩精品| 一个人看的www久久| 日韩精品亚洲视频| 国产精品国模在线| 欧美特黄级在线| 亚洲天堂av在线免费观看| 一区二区欧美在线| 日韩高清免费在线| 欧美高清电影在线看| 久久精品99无色码中文字幕| 国产精品日韩久久久久| 亚洲国产欧美日韩精品| 国产福利精品视频| 亚洲第一视频网|