首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vue 3注入类型记录

Vue 3注入类型记录
EN

Stack Overflow用户
提问于 2021-01-14 10:06:13
回答 2查看 6.5K关注 0票数 8

我使用了新的Vue 3组合API,并为反应性数据编写了一个“存储”。

代码语言:javascript
复制
const state = reactive<State>({
  accessToken: undefined,
  user: undefined,
});

export default {
  state: readonly(state),
}

在应用程序创建时,我向所有组件提供存储:

代码语言:javascript
复制
const app = createApp(App)
  .provide("store", store)
  .use(IonicVue)
  .use(router);

最后,在组件/视图中注入存储以利用它。

代码语言:javascript
复制
export default defineComponent({
  name: "Home",
  inject: ["store"],
  components: {
    IonContent,
    IonHeader,
    IonPage,
    IonTitle,
    IonToolbar,
    IonButton,
  },
  computed: {
    email() {
      return this.store.state.user.email;
    },
  },
});
</script>

不幸的是,类型记录不喜欢,就像我在computed property email()中使用this.store那样

并说

属性'ComponentPublicInstance<{},{ email():any;},{},EmitsOptions,{},{},false,ComponentOptionsBase<{},{ email():any;},{},ComponentOptionsMixin,ComponentOptionsMixin,EmitsOptions,string,{}>>‘

我的意思是,当我删除lang="ts"标记中的<script/>时,一切都正常,但是没有显示错误。对于如何解决这个问题,或者它特别意味着什么,有什么建议吗?

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-14 10:20:54

我建议将存储作为全局属性使用,而无需在任何子组件中指定inject,因为provide/inject可能有一些反应性警告:

代码语言:javascript
复制
const app = createApp(App)
  .use(IonicVue)
  .use(router);
app.config.globalProperties.store= store;

declare module '@vue/runtime-core' {
  interface ComponentCustomProperties  {
       store:any // replace it with the right type
     }
   }

然后直接使用:

代码语言:javascript
复制
export default defineComponent({
  name: "Home",
  components: {
  ...
  },
  computed: {
    email() {
      return this.store.state.user.email;
    },
  },
});
</script>
票数 11
EN

Stack Overflow用户

发布于 2021-10-31 22:39:31

对于那些使用Vue 3+ TS处理相同问题的人,我找到了一个解决方案,无需更改app.config或声明一个新的module

  1. App.ts设置
代码语言:javascript
复制
import { createApp, reactive } from 'vue'
import App from './App.vue'

const Store = reactive({
  myProperty: 'my value'
})

createApp(App)
  .provide('Store', Store)
  .mount('#app')
  1. 访问注入的反应性对象的组件:
代码语言:javascript
复制
<template>
  <div>{{ Store.myProperty }}</div>
</template>

<script lang="ts">
import { IStore } from '@/types'
import { defineComponent, inject } from 'vue'

export default defineComponent({
  name: 'MyComponentName',
  setup() {
    return {
      Store: inject('Store') as IStore,
    }
  },
  created() {
    console.log(this.Store) // will show the `Store` in the console
  }
})
</script>
  1. 存储区(@/types.ts)的类型指示:
代码语言:javascript
复制
export interface IStore {
  myProperty: string
}

按照以下三个步骤,我能够在使用Store.myProperty时不出问题地读写TypeScript

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65716936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档