javascript - 将全局附加到 Vue 实例
问题描述
如何将全局过滤器/mixins/等附加到定义的 Vue 实例而不是 Vue 对象?
例子
import Vue from 'vue.js'
import App from './app'
import demo from './mixins/demo'
Vue.mixin(demo)
const vm = new Vue({
router,
render: h => h(App).$mount('#app')
})
在我有多个实例的情况下,如何将此 mixin 附加到vm而不是Vue 对象?
我试过vm.mixin(demo)但它似乎不起作用
解决方案
你的问题不是很清楚,但我觉得你想要的是在页面上有多个 Vue 根实例,每个实例都有自己的一组全局混合/指令/过滤器等。
不幸的是,Vue 2 的设计方式并没有让这一切变得容易。Vue3 迁移指南(引文)的Global API部分对此进行了很好的阅读:
Vue 2.x 有许多全局 API 和配置可以全局改变 Vue 的行为。
虽然这种方法很方便,但它会导致几个问题。从技术上讲,Vue 2 没有“应用程序”的概念。我们定义为应用程序的只是一个根 Vue 实例,通过
new Vue()
. 从同一个 Vue 构造函数创建的每个根实例共享相同的全局配置。因此:
全局配置使得同一页面上的多个“应用程序”之间难以共享相同的 Vue 副本,但具有不同的全局配置
这主要是(但不限于)测试期间的问题。为了解决这个问题,他们在 vue-test-utils 中引入了createLocalVue() 方法,该方法使用Vue.extend全局 API 创建基本 Vue 构造函数的“子类”......
所以我使用相同的方法在下面创建了一个示例,该示例显示了 2 个不同的 Vue 子类,每个子类都有自己的一组全局 mixin 和组件。它有点工作,但有它的怪癖(例如看看组件是如何注册的 - 省略MyVue1.extend
调用会破坏代码)
我从这个练习中得出的结论是,它可以使用 Vue 2 来完成,但这可能是一条崎岖不平的道路,可能最好的解决方案是使用 Vue 3 来正确解决这些问题......
const MyVue1 = Vue.extend()
const MyVue2 = Vue.extend()
MyVue1.mixin({
methods: {
mixinMethod: function() {
return 'MyVue1'
}
}
})
MyVue1.component('my-component1', MyVue1.extend({
template: '<div> Hello from my-component1: {{ mixinMethod() }} !</div>'
}))
MyVue2.mixin({
methods: {
mixinMethod: function() {
return 'MyVue2'
}
}
})
MyVue2.component('my-component2', MyVue2.extend({
template: '<div> Hello from my-component2: {{ mixinMethod() }} !</div>'
}))
const vm1 = new MyVue1({
template: '<my-component1 />',
}).$mount('#app1')
const vm2 = new MyVue2({
template: '<my-component2 />',
}).$mount('#app2')
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app1"></div>
<div id="app2"></div>
推荐阅读
- jenkins - 无法安装插件
- javascript - Angular 6在客户端以pdf格式保存材料向导数据
- ios - Swift 在 UITableView 内的数组中获取值的第一个实例
- android - 这里不再允许使用元素 font-family :Android Studio
- php - Codeigniter - 尝试使用 postgresql 时出现问题
- java - Spring Batch Job 的连接重置问题
- google-analytics - 如何创建可以跟踪 API 调用的分析程序
- php - PHP Soap 客户端调用
- ruby - puppet:确保按特定顺序排列
- ruby-on-rails - Ruby on Rails -- 嵌套单选按钮问题(当一个被选中时,另一个被取消选中)