目录

js基本功七

js基本功(七)

Symbol的用武之地

情况一

busA.vue

<template>
  <div>
    <button :style="{ color }" @click="busGo">click bus</button>
  </div>
</template>
<script setup>
import { emitter } from '@/plugins/emitter';
import { onMounted, onBeforeUnmount, defineProps } from 'vue';

defineProps({
  color: {
    default: '',
    type: String
  }
});

const busName = 'busName'

const busGo = () => {
  emitter.emit(busName);
};

onMounted(() => {
  emitter.on(busName, () => {
    console.log('I am bus ' + props.color);
  });
});

onBeforeUnmount(() => {
  emitter.off(busName);
});
</script>

App.vue

<button
          @click="
            () => {
              showA = !showA;
            }
          "
        >
          toggle bus
        </button>
        <BusA v-show="showA" color="red"></BusA>
        <BusA v-show="!showA" color="blue"></BusA>

https://i-blog.csdnimg.cn/direct/eedc34aa96bc4b2a9536b04c51bae9f2.png

https://i-blog.csdnimg.cn/direct/e550bb5ad0184ef68aaa9abf6f358375.png

https://i-blog.csdnimg.cn/direct/211c3ff3c86147ce9e109f13886c705f.png

当点击蓝色时,红色会被触发;当点击红色时,蓝色会被触发。且不管怎么样,都是红色先触发,因为在App.vue中引入了红色和蓝色组件

情况二

const busName = Symbol();替换成这行代码

busA.vue

<template>
  <div>
    <button :style="{ color }" @click="busGo">click bus</button>
  </div>
</template>
<script setup>
import { emitter } from '@/plugins/emitter';
import { onMounted, onBeforeUnmount, defineProps } from 'vue';

defineProps({
  color: {
    default: '',
    type: String
  }
});

const busName = Symbol();

const busGo = () => {
  emitter.emit(busName);
};

onMounted(() => {
  emitter.on(busName, () => {
    console.log('I am bus ' + props.color);
  });
});

onBeforeUnmount(() => {
  emitter.off(busName);
});
</script>

App.vue

<button
          @click="
            () => {
              showA = !showA;
            }
          "
        >
          toggle bus
        </button>
        <BusA v-show="showA" color="red"></BusA>
        <BusA v-show="!showA" color="blue"></BusA>

点击红色就只会触发i am bus red;点击蓝色就只会触发i am bus blue。因为Symbol保证了事件的唯一性,symbol是独一无二的