我使用单个文件组件的webpack.
我在菜单标题中有1个Vue实例来显示购物车购物下拉菜单:
import Vue from 'vue';
import App from './AppShoppingCart.vue';
new Vue({
el: '#shoppingCartApp',
template: '<App/>',
components: {App}
});
Run Code Online (Sandbox Code Playgroud)
我在同一页面(产品目录)中有另一个Vue实例:
import Vue from 'vue';
import App from './AppCatalog.vue';
new Vue({
el: '#catalogApp',
template: '<App/>',
components: {App}
});
Run Code Online (Sandbox Code Playgroud)
我想$ $从一个实例发出一个事件到另一个实例:当Catalog更改时,我想在ShoppingCart中调用一个函数.
我测试eventHub:
import Vue from 'vue';
var eventHub = new Vue();
export default eventHub;
Run Code Online (Sandbox Code Playgroud)
所以我在每个实例上导入事件:
import eventHub from './events/eventHub';
Run Code Online (Sandbox Code Playgroud)
在目录中:
eventHub.$emit( "actproductslist-changed" );
Run Code Online (Sandbox Code Playgroud)
在ShoppingCart中:
eventHub.$on('actproductslist-changed', function(){ alert('AppShoppingCart') } );
Run Code Online (Sandbox Code Playgroud)
但这不会奏效.它仅在$ on和$ emit与Vue的同一实例中有效.
我认为webpack创建了2个模块,我不能在我的2个实例之间共享变量.
此设置有效,这main.js是您的入口点。
bus.js
import Vue from "vue"
const bus = new Vue();
export default bus;
Run Code Online (Sandbox Code Playgroud)
main.js
import Vue from 'vue'
import App from './App.vue'
import App2 from './App2.vue'
new Vue({
el: '#app',
render: h => h(App)
})
new Vue({
el:"#app2",
render: h => h(App2)
})
Run Code Online (Sandbox Code Playgroud)
应用程序
<template>
<button @click="sendMessage">Send Message</button>
</template>
<script>
import Vue from "vue"
import bus from "./bus"
export default {
methods:{
sendMessage(){
bus.$emit("testing")
}
}
}
</script>
Run Code Online (Sandbox Code Playgroud)
App2.vue
<template></template>
<script>
import Vue from "vue"
import bus from "./bus"
export default {
mounted(){
bus.$on("testing", ()=> alert("message received"));
}
}
</script>
Run Code Online (Sandbox Code Playgroud)
要跨入口点进行通信,可以bus在窗口上显示Vue。
webpack.config.js
entry: {
"main": './src/main.js',
"main2": './src/main2.js'
},
output: {
path: path.resolve(__dirname, './dist'),
publicPath: '/dist/',
filename: '[name].js'
},
Run Code Online (Sandbox Code Playgroud)
bus.js
import Vue from "vue"
window.bus = new Vue();
Run Code Online (Sandbox Code Playgroud)
main.js
import Vue from 'vue'
import App from './App.vue'
new Vue({
el: '#app',
render: h => h(App)
})
Run Code Online (Sandbox Code Playgroud)
main2.js
import Vue from 'vue'
import App2 from './App2.vue'
import bus from "./bus"
new Vue({
el:"#app2",
render: h => h(App2)
})
Run Code Online (Sandbox Code Playgroud)
应用程序
<template>
<button @click="sendMessage">Send Message</button>
</template>
<script>
import Vue from "vue"
export default {
methods:{
sendMessage(){
if (bus)
bus.$emit("testing")
}
}
}
</script>
Run Code Online (Sandbox Code Playgroud)
App2.vue
<template></template>
<script>
import Vue from "vue"
export default {
mounted(){
bus.$on("testing", ()=> alert("message received"));
}
}
</script>
Run Code Online (Sandbox Code Playgroud)
请注意,由于bus仅在中导入main2.js,因此在App.vue可能不存在的情况下(因为仅在中导入main2.js),您需要谨慎使用。
| 归档时间: |
|
| 查看次数: |
3334 次 |
| 最近记录: |