我是第一次用 Vue 构建 SPA。我将重用几个功能,但似乎无法使其工作。我收到错误"this.ExperienceToLevel is not a function"。
同时,我什至不确定创建插件是实现我想要的目标的最佳方式。也就是说,让一些函数成为全局的“Vue 方式”。我不希望把它分配给窗口一样window.UserLevel = new UserLevel()。
用户级别.js
/*
Create Levels array
*/
let Levels = [];
for (let i = 0; i < 100; i++) {
let xp = Math.floor(Math.pow(i, 1.3) * 100);
Levels.push(xp);
}
/*
Create UserLevel Plugin
*/
const UserLevel = {
install(Vue, options) {
Vue.ExperienceToLevel = function (xp) {
for (const [level, levelXP] of Object.entries(options.levels)) {
if (levelXP > xp) {
return level-1;
}
}
}
Vue.LevelToExperience = function (level) {
return options.levels[level];
}
Vue.ExperiencePercent = function (level) {
return ((this.xp - this.LevelToExperience(this.level)) / (this.LevelToExperience(this.level + 1) - this.LevelToExperience(this.level))) * 100;
}
}
};
export {
Levels,
UserLevel
};
Run Code Online (Sandbox Code Playgroud)
我尝试将插件导入到这样的组件中:
import { UserLevel, Levels } from './../../UserLevel';
Vue.use(UserLevel, { levels: Levels });
Run Code Online (Sandbox Code Playgroud)
并像这样使用全局方法: this.ExperienceToLevel(this.xp)
根据关于 Plugins 的 Vue 文档,您有两个选择:
在 a 中声明这些方法mixin:
const UserLevel = {
install(Vue, options) {
Vue.mixin({
methods: {
ExperienceToLevel(xp) { ... },
LevelToExperience(level) { ... },
ExperiencePercent(level) { ... },
}
})
}
};
Run Code Online (Sandbox Code Playgroud)
或者将它们绑定到Vue.prototype:
Vue.prototype.$ExperienceToLevel = function (xp) { ... }
Vue.prototype.$LevelToExperience = function (level) { ... }
Vue.prototype.$ExperiencePercent = function (level) { ... }
Run Code Online (Sandbox Code Playgroud)
我会和前者一起去。