如何让 Vue 应用程序中的所有组件都可以使用 Buefy toast?
how can a Buefy toast be made available to all components in a Vue app?
在 Vue 应用程序的组件中,以下方法在用户单击表单上的“提交”按钮后运行:
execute() {
let message = '';
let type = '';
const response = this.actionMode == 'create' ? this.createResource() : this.updateResource(this.data.accountId);
response.then(() => {
message = 'Account ' + this.actionMode + 'd for ' + this.data.name;
type = 'is-success';
})
.catch(e => {
message = 'Account <i>NOT</i> ' + this.actionMode + 'd<br>' + e.message;
type = 'is-danger';
})
.then(() => {
this.displayOutcome(message, type);
this.closeModal();
});
}
同一组件中的 displayOutcome()
方法如下所示:
displayOutcome(message, type) {
this.$buefy.toast.open({
duration: type == 'is-danger' ? 10000 : 3500,
position: 'is-bottom',
message: message,
type: type
});
}
代码在组件中运行良好。现在我正在尝试将 displayOutcome()
方法移动到 helpers.js 文件中并导出该函数,以便应用程序中的任何组件都可以导入它。这将集中维护 toast,并防止在每个需要一个的组件中编写单独的 toast。无论如何,当 displayOutcome()
移动到 helpers.js,然后导入组件时,当函数被触发时,控制台会出现错误:
我怀疑它与引用 Vue 实例有关,所以我试验了 main.js 文件并更改了这个
new Vue({
router,
render: h => h(App),
}).$mount('#app');
至此
var vm = new Vue({
router,
render: h => h(App),
}).$mount('#app');
然后在 helpers.js
export function displayOutcome(message, type) {
// this.$buefy.toast.open({
vm.$buefy.toast.open({
duration: type == 'is-danger' ? 10000 : 3500,
position: 'is-bottom',
message: message,
type: type
});
}
但这导致了“编译失败”。错误信息。
是否可以让 helpers.js 中的 displayOutcome()
以某种方式工作?
您可以在 Vuex store 中创建一个动作并从任何组件发送它。
displayOutcome()
需要引用 this
才能工作,如果您将其定义为组件对象上的方法(标准方式),这很好。但是,当您在外部定义它时,您只需提供任何 function 而不是 method,这是一个“针对”对象的函数。这种“定位”是通过this
完成的。因此,当您从外部文件传递一个简单函数时,没有与特定对象的关联,因此没有 this
可用。
为了克服这个问题,您可以使用 displayOutcome.apply(thisArg, methodArgs)
,其中 thisArg
将是函数中的 this
引用,而 methodArgs
是剩余的参数正在传递给函数。
因此 displayOutcome.apply(4, ['some', 'thing'])
意味着 displayOutcome()
中的 this
引用在这种情况下变为 4
。
进一步阅读:
import { displayOutcome } from './component-utils'
// when calling displayOutcome() from within your component
displayOutcome.apply(this, ['Hello World', 'is-info'])
// component-utils.js
export function displayOutcome(message, type) {
// this.$buefy.toast.open({
this.$buefy.toast.open({
duration: type == 'is-danger' ? 10000 : 3500,
position: 'is-bottom',
message: message,
type: type
});
}
在 Vue 应用程序的组件中,以下方法在用户单击表单上的“提交”按钮后运行:
execute() {
let message = '';
let type = '';
const response = this.actionMode == 'create' ? this.createResource() : this.updateResource(this.data.accountId);
response.then(() => {
message = 'Account ' + this.actionMode + 'd for ' + this.data.name;
type = 'is-success';
})
.catch(e => {
message = 'Account <i>NOT</i> ' + this.actionMode + 'd<br>' + e.message;
type = 'is-danger';
})
.then(() => {
this.displayOutcome(message, type);
this.closeModal();
});
}
同一组件中的 displayOutcome()
方法如下所示:
displayOutcome(message, type) {
this.$buefy.toast.open({
duration: type == 'is-danger' ? 10000 : 3500,
position: 'is-bottom',
message: message,
type: type
});
}
代码在组件中运行良好。现在我正在尝试将 displayOutcome()
方法移动到 helpers.js 文件中并导出该函数,以便应用程序中的任何组件都可以导入它。这将集中维护 toast,并防止在每个需要一个的组件中编写单独的 toast。无论如何,当 displayOutcome()
移动到 helpers.js,然后导入组件时,当函数被触发时,控制台会出现错误:
我怀疑它与引用 Vue 实例有关,所以我试验了 main.js 文件并更改了这个
new Vue({
router,
render: h => h(App),
}).$mount('#app');
至此
var vm = new Vue({
router,
render: h => h(App),
}).$mount('#app');
然后在 helpers.js
export function displayOutcome(message, type) {
// this.$buefy.toast.open({
vm.$buefy.toast.open({
duration: type == 'is-danger' ? 10000 : 3500,
position: 'is-bottom',
message: message,
type: type
});
}
但这导致了“编译失败”。错误信息。
是否可以让 helpers.js 中的 displayOutcome()
以某种方式工作?
您可以在 Vuex store 中创建一个动作并从任何组件发送它。
displayOutcome()
需要引用 this
才能工作,如果您将其定义为组件对象上的方法(标准方式),这很好。但是,当您在外部定义它时,您只需提供任何 function 而不是 method,这是一个“针对”对象的函数。这种“定位”是通过this
完成的。因此,当您从外部文件传递一个简单函数时,没有与特定对象的关联,因此没有 this
可用。
为了克服这个问题,您可以使用 displayOutcome.apply(thisArg, methodArgs)
,其中 thisArg
将是函数中的 this
引用,而 methodArgs
是剩余的参数正在传递给函数。
因此 displayOutcome.apply(4, ['some', 'thing'])
意味着 displayOutcome()
中的 this
引用在这种情况下变为 4
。
进一步阅读:
import { displayOutcome } from './component-utils'
// when calling displayOutcome() from within your component
displayOutcome.apply(this, ['Hello World', 'is-info'])
// component-utils.js
export function displayOutcome(message, type) {
// this.$buefy.toast.open({
this.$buefy.toast.open({
duration: type == 'is-danger' ? 10000 : 3500,
position: 'is-bottom',
message: message,
type: type
});
}