Bas acara Vue.js 3
P粉905144514
P粉905144514 2023-08-24 18:08:45
0
2
423
<p>Bagaimana untuk mencipta bas acara dalam Vue 3? </p> <hr /> <p>Dalam Vue 2, ia ialah: </p> <pre class="brush:js;toolbar:false;">export const bus = new Vue(); </pra> <pre class="brush:js;toolbar:false;">bus.$on(...) bas.$emit(...) </pra> <hr /> <p>Dalam Vue 3, <code>Vue</code> bukan lagi pembina dan <code>Vue.createApp({});</code> mengembalikan <kod>$ pada< ;/kod> dan kaedah <kod>$emit</code> </p>
P粉905144514
P粉905144514

membalas semua(2)
P粉638343995

Pada Vue.js versi 3, anda boleh menggunakan perpustakaan atau fungsi pihak ketiga yang ditulis dalam corak pengaturcaraan penerbit-pelanggan (konsep PubSub).

event.js

//events - a super-basic Javascript (publish subscribe) pattern

class Event{
    constructor(){
        this.events = {};
    }

    on(eventName, fn) {
        this.events[eventName] = this.events[eventName] || [];
        this.events[eventName].push(fn);
    }

    off(eventName, fn) {
        if (this.events[eventName]) {
            for (var i = 0; i < this.events[eventName].length; i++) {
                if (this.events[eventName][i] === fn) {
                    this.events[eventName].splice(i, 1);
                    break;
                }
            };
        }
    }

    trigger(eventName, data) {
        if (this.events[eventName]) {
            this.events[eventName].forEach(function(fn) {
                fn(data);
            });
        }
    }
}

export default new Event();

index.js

import Vue from 'vue';
import $bus from '.../event.js';

const app = Vue.createApp({})
app.config.globalProperties.$bus = $bus;
P粉744831602

Seperti yang dicadangkan dalam dokumentasi rasmi, anda boleh menggunakan perpustakaan mitt untuk menghantar acara antara komponen, dengan mengandaikan kami mempunyai bar sisi dan pengepala yang mengandungi butang untuk menutup/membuka bar sisi, kami memerlukan Butang itu untuk togol sifat tertentu dalam komponen bar sisi:

Import perpustakaan dalam main.js dan buat contoh pemancar ini dan takrifkannya sebagai harta global:

Pemasangan:

npm install --save mitt

Penggunaan:

import { createApp } from 'vue'
import App from './App.vue'
import mitt from 'mitt';
const emitter = mitt();
const app = createApp(App);
app.config.globalProperties.emitter = emitter;
app.mount('#app');

Pancarkan acara toggle-sidebartogol-bar sisi dengan beberapa muatan dalam pengepala:

<template>
  <header>
    <button @click="toggleSidebar"/>toggle</button>
  </header>
</template>
<script >
export default { 
  data() {
    return {
      sidebarOpen: true
    };
  },
  methods: {
    toggleSidebar() {
      this.sidebarOpen = !this.sidebarOpen;
      this.emitter.emit("toggle-sidebar", this.sidebarOpen);
    }
  }
};
</script>

Terima acara dengan muatan di bar sisi:

<template>
  <aside class="sidebar" :class="{'sidebar--toggled': !isOpen}">
  ....
  </aside>
</template>
<script>
export default {
  name: "sidebar",
  data() {
    return {
      isOpen: true
    };
  },
  mounted() { 
    this.emitter.on("toggle-sidebar", isOpen => {
      this.isOpen = isOpen;
    });
  }
};
</script>

Bagi mereka yang menggunakan API gubahan, mereka boleh menggunakan emitterpemancar seperti berikut:

Buat fail src/composables/useEmitter.js

import { getCurrentInstance } from 'vue'

export default function useEmitter() {
    const internalInstance = getCurrentInstance(); 
    const emitter = internalInstance.appContext.config.globalProperties.emitter;

    return emitter;
}

Dari situ, anda boleh menggunakan useEmitter,就像使用 useRouteruseEmitter seperti yang anda lakukan

useRouter:

import useEmitter from '@/composables/useEmitter'

export default {
  setup() {
    const emitter = useEmitter()
    ...
  }
  ...
}
Gunakan API Gabungan

Anda juga boleh mendapat manfaat daripada API gubahan baharu dan menentukan bas acara boleh gubah:

eventBus.js

import { ref } from "vue";
const bus = ref(new Map());

export default function useEventsBus(){

    function emit(event, ...args) {
        bus.value.set(event, args);
    }

    return {
        emit,
        bus
    }
}
Lakukan perkara berikut dalam komponen A:

import useEventsBus from './eventBus';
...
//in script setup or inside the setup hook
const {emit}=useEventsBus()
...
 emit('sidebarCollapsed',val)

Dalam komponen B: 🎜
const { bus } = useEventsBus()

watch(()=>bus.value.get('sidebarCollapsed'), (val) => {
  // destruct the parameters
    const [sidebarCollapsedBus] = val ?? []
    sidebarCollapsed.value = sidebarCollapsedBus
})

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!