繁体   English   中英

如何在 TypeScript Vue 组件中访问全局 mixin 的方法?

[英]How to access global mixin's methods in TypeScript Vue component?

我正在使用 TypeScript 开发 Vue 应用程序。 我创建了一个 mixin(显示在下面的global.mixin.js中),并将它注册到Vue.mixin() (显示在下面的main.ts中)。

global.mixin.js

import { mathHttp, engHttp } from '@/common/js/http'

export default {
  methods: {
    wechatShare(config) {
      config.imgUrl = config.imgUrl
      mathHttp.get('/wechat/config', {
        url: encodeURIComponent(window.location.href),
      }).then((data) => {
        wx.config({
          debug: false,
          appId: data.appId,
          timestamp: data.timestamp,
          nonceStr: data.noncestr,
          signature: data.signature,
          jsApiList: ['updateAppMessageShareData', 'updateTimelineShareData'],
        })
      })
      wx.ready(() => {
        wx.updateAppMessageShareData(config)
        wx.updateTimelineShareData(config)
      })
    },
  },
}

主文件

我用Vue.mixin()注册了全局 mixin:

import globalMixins from './mixins/global.mixin'

Vue.mixin(globalMixins)

但是当我尝试从 Vue 组件中访问 mixin 方法时,出现错误:

property wechatShare doesn't exist on type Test.vue

测试.vue

<script lang='ts'>
import { Component, Prop, Vue } from 'vue-property-decorator'

@Component({ components: { } })
export default class Test extends Vue {

  created() {
    this.setWeChatShare()
  }

  setWeChatShare() {
    this.wechatShare
  }
}
</script>

我怎么解决这个问题?

vue-property-decorator来自vue-class-component mixin使用相同的语义 根据vue-class-component文档中的示例,mixin 采用与组件相同的形式:

src/mixin.ts:

import Vue from 'vue'
import Component from 'vue-class-component'

@Component
export default class MyMixin extends Vue {
  wechatShare(config) {
    //...
  }
}

使用Mixinsvue-property-decorator (或mixins来自vue-class-component ),包住您的自定义的mixin,并与您的组件扩展它:

源代码/应用程序.vue:

import { Component, Mixins } from 'vue-property-decorator'
// OR
// import Component, { mixins } from 'vue-class-component'

import MyMixin from './mixin'

@Component
export default class App extends Mixins(MyMixin) {
  mounted() {
    this.wechatShare(/* ... */)
  }
}

对于那些想要全局使用 mixin 并防止在每个组件中导入的人来说,这就是你可以做的。

src/mixins/mixin.ts

    import { Vue, Component } from 'vue-property-decorator'
    import Colors from "@/values/Colors"
    import Strings from "@/values/Strings";

    @Component
    export default class Values extends Vue {
        public test = 'Hello, hello, hello';
        public colors: {} = Colors.light;
        public strings: {} = Strings.pt
    }

在 src/main.ts 里面

import Values from "@/values/Values";//my Mixin
Vue.mixin(Values)

在你的 src/shims-tsx.d.ts 里面

// add the variables,functions ... inside the vue interface and then you will good to use them anywhere. 
interface Vue {
        colors,
      strings
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM