emit事件

369 阅读1分钟

1. 父子组件通信 (vue2)

uTools_1711334981894.png

需求:<Bottom>组件可以弹出弹窗,弹窗内容为<Find>组件,该组件可以上传图片并预览。现在需要实现点击bottom的ok按钮,触发一个事件来清除find组件的previewUrl并渲染在页面,使得再次打开弹窗图片为空。

实现原理: 父组件给子组件传一个porps监听自定义事件,porps初始值为父组件的data【保证不修改porps】,自定义事件为更新previewUrl为最新值。子组件上传图片事件为$emit('自定义事件', 新值)实现previewUrl值的实时更新

<template>
<div @click="handleOk">
    <Find :previewUrl="previewUrl" @update:previewUrl="updatePreviewUrl" />
</div>
</template>
<script>
default export {
    data() {
        previewUrl: null;
    },
    methods: {
        handleOk() {
            this.previewUrl = null
        },
        updatePreview(newPreviewUrl) {
            this.previewUrl = newPreviewUrl
        }
    }
}
</script>
<template>
    <!-- 展示上传的图片预览 -->
    <div v-if="previewUrl" class="half-width">
        <img :src="previewUrl" alt="Preview" class="uploaded-image" />
    </div>
</template>
<script>
export default {
    props: {
        previewUrl: String
    },
    methods: {
        // 上传预览代码
        handleBeforeUpload(file) {
            // 使用 FileReader 对象预览图片
            const reader = new FileReader();
            reader.readAsDataURL(file);
            
            // 触发emit父组件的自定义事件更新previewUrl
            reader.onload = () => {
                this.$emit('update:previewUrl', reader.result); // 发送预览图片的事件
            };
              
            // 上传并获取返回值的逻辑...
        }
    }
}
</script>

2. 如果父组件有多个相同事件名,子组件的emit如何判断哪个是想要触发的事件?

这一过程其实就是父组件调用子组件时,子组件使用emit触发父组件的自定义事件来改变某值(或某事件),只需要让子组件再设置一个props来标识对应的父组件,并在emit触发事件时做逻辑判断标识是哪个父组件在使用他即可,这样就不会影响其他父组件

<template>
  <div>
    <child-component :value="y" :isParentA="true" @input="handleInputA"></child-component>
  </div>
</template>


<script>
import ChildComponent from './ChildComponent.vue';
export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      y: 0
    };
  },
  methods: {
    handleInputA(value) {
      this.y = value;
      // 处理父组件A的逻辑
    }
  }
}
</script>
<template>
  <div>
    <!-- 注意:这里使用了 prop 传递一个标识 isParentA -->
    <button @click="toggle">Toggle</button>
  </div>
</template>

<script>
export default {
  props: {
    value: Number,
    isParentA: Boolean  // 使用 prop 传递一个标识,告诉子组件是哪个父组件在使用它
  },
  methods: {
    toggle() {
      // 根据标识判断是哪个父组件,然后触发对应的 input 事件
      const newValue = !this.value;
      if (this.isParentA) {
        this.$emit('input', newValue);
      }
      // 在这里可以添加其他逻辑,处理其他父组件的情况
    }
  }
}
</script>