還記得區域元件有自己的作用域嗎?已知外層元件可以跟內層元件傳遞資料(props
),或是傳遞事件(emit
),但是當有另外兩個子元件,彼此需要傳遞又該怎麼做?
mitt
介紹概念圖:
Vue 2
中要進行跨元件常使用的方式就是Event Bus
,只要使用$on
與$emit
這兩個語法,就能達到跨元件的溝通,但是在Vue 3
移除了$on
、$emit
..等語法。
Vue 3 可以使用mitt
套件來達成相同作用,寫法與Vue 2
的Event Bus
相當接近。
mitt
建立npm
安裝:$ npm install --save mitt
cdn
引入:<script src="https://unpkg.com/mitt/dist/mitt.umd.js"></script>
建立mitt()
實體,指定到emitter
上:
const emitter = mitt();
<div id="app">
<h4>{{ text }}</h4>
<con-tainer></con-tainer>
<con-tainer2></con-tainer2>
</div>
const emitter = mitt();
const app = Vue.createApp({
data() {
return {
text: "外部元件"
};
}
});
app.component("ConTainer", {
data() {
return {
text: "component1",
componentText: "由元件1傳入的文字",
};
},
methods: {
click() {
emitter.emit('componentText', this.componentText);
}
},
template: `<div>
<h4>{{ text }}</h4>
<button @click="click">Click me!</button>
</div>`
});
app.component("ConTainer2", {
data() {
return {
text: "component2",
componentText: ""
};
},
created() {
emitter.on('componentText', (data) => {
this.componentText = data;
})
},
template: `<div>
<h4>{{ text }}</h4>
<h4>{{ componentText }}</h4>
</div>`
});
app.mount('#app');
emitter.emit('componentText', this.componentText);
,傳遞component1
裡data
的componentText
的值。emitter.on
,(data)
裡就是emitter.emit
傳出來的值。上面範例就是mitt
的使用方法,比slot
簡單又好寫呢。