gpt4 book ai didi

javascript - 如何在vue类组件中访问$bvToast

转载 作者:行者123 更新时间:2023-12-01 00:14:27 27 4
gpt4 key购买 nike

我对 vue.js 还很陌生,但我可以弄清楚一些事情。我从普通的 js 开始,但现在切换到带有类样式 vue 组件的 typescript。对于组件样式,我使用 bootstrap-vue。

在我的 main.ts 文件中,我导入了 bootstrap 以及 vuex 存储

...
import BootstrapVue from 'bootstrap-vue'
//use custom bootstrap styling
import '../src/bootstrap/bootstrap.css'
import 'bootstrap-vue/dist/bootstrap-vue.css'
Vue.use(BootstrapVue)

...//some more code

new Vue({
router,
store,
i18n,
render: h => h(App)
}).$mount('#app')

在商店中我动态注册一个NotificationModule

NotificationModule.ts

//import node modules
import { Module, VuexModule, Mutation, Action } from "vuex-module-decorators";
import { store } from "@/store";

//import application modules
import i18n from '@/i18n';

import Notification from '../types/Notification';
import Message from '../types/Message';
import logger from '@/system/logger';

@Module({
dynamic: true,
store: store,
name: "notification",
namespaced: true,
})
export default class NotifcationModule extends VuexModule {

//notification types definition with according prompts
notificationTypes: Array<string> = ['info', 'success', 'warning', 'danger'];

//definition of the notification object
notification: Notification = {
variant: '',
prompt: '',
message: ''
}

/**
* prove the supported notification types
*/
get getSupportedNotificationTypes(): Array<string> {
return this.notificationTypes;
}

/**
* provide the notification
*/
get getNotification(): Notification {
return this.notification;
}

@Action
notify(msg: Message){

logger.warn(`called notify with [type:${msg.variant}]:[text:${msg.text}]`);

if(msg.variant === undefined || !Array.from(this.notificationTypes).includes(msg.variant)){
msg.variant = 'info';
}

//configure custom notification data
const notification = {
variant: msg.variant,
prompt: i18n.t(`notify.${msg.variant}`),
message: msg.text || 'No message provided.'
}

this.context.commit('setNotification', notification);
}

@Mutation
public setNotification(data: Notification) {
if (data) {
this.notification = data;
}
}
}

一切正常。我可以在生成通知的 vue 组件中获取此商店的实例,但在以下 vue 组件中创建 toast 时遇到问题。

Notification.vue

<template>
<b-container></b-container>
</template>

<script lang="ts">
import { Component, Vue, Watch } from 'vue-property-decorator';
import { getModule, VuexModule } from 'vuex-module-decorators';
import NotificationModule from '../../util-notification/components/NotificationModule';
import Notification from '../types/Notification';
import logger from '../../../system/logger';

@Component
export default class UserNotification extends Vue {

//get the instance of the NotificationModule
noticationInstance: NotificationModule = getModule(NotificationModule);

//watch the property 'notification' -> accessed via getter method
@Watch('noticationInstance.getNotification')
onPropertyChange(notification: Notification, oldValue: string) {
logger.debug(`replaced [${JSON.stringify(oldValue)}] by [${JSON.stringify(notification)}]`);

//create a toast
this.$bvToast.toast(notification.message, {
title: notification.prompt || 'Info',
variant: notification.variant || 'warning',
solid: true
});


}
}
</script>

尽管可以编译,但 Vetur 文件中出现以下错误。但没有制作和显示任何 toast 。

“UserNotification”类型上不存在属性“$bvToast”。Vetur(2339)

我创建了一个 TestView,在其中以不同的方式集成了 $bvToast 并且它可以工作。

<template>
<b-container fluid>
<h1>This is the page for testing components and functionality</h1>
<hr>
<div>
<h3>Trigger für vuex notification test</h3>
<b-button @click="$bvToast.show('example-toast')" class="mb-2">Default</b-button>
</div>

<b-toast id="example-toast" title="BootstrapVue" static no-auto-hide>
Hello, world! This is a toast message.
</b-toast>

</b-container>
</template>

您对我做错的事情有什么建议吗?谢谢你

问题已解决或效果更好

我真的不知道为什么,但现在可以了!无需进一步更改。抱歉,我无法再重现此内容。此外,网络控制台也没有显示任何错误。

看来我可以访问 UserNotification 组件中的 vue 实例。 UserNotification 扩展了 Vue,因此它是一个 Vue 实例而不是 VueX。答案中描述的解决方案是不必要的。

难道只有 Vetur 无法将 $vbToast 识别为 UserNotification 的属性,甚至无法识别 Typscript 上下文中的扩展 Vue 实例吗?

最佳答案

VueX 的 this 上下文不是 Vue 实例,因此 this.$bvToast 无法直接使用。

但是有一个解决方法可以访问 VueX 中的主 Vue 实例。请改用 this._vm.$bvToast

参见:

关于javascript - 如何在vue类组件中访问$bvToast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59865660/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com