当前位置:  首页>> 技术小册>> Vue面试指南

实现一个 Modal 可以使用 Vue3.0 中的组合式 API。

首先,我们可以创建一个 Modal 组件,包含以下结构:

  1. <template>
  2. <div class="modal-wrapper" v-show="visible">
  3. <div class="modal-mask" @click.self="close"></div>
  4. <div class="modal">
  5. <div class="modal-header">
  6. <h3>{{ title }}</h3>
  7. <button @click="close">×</button>
  8. </div>
  9. <div class="modal-body">
  10. <slot></slot>
  11. </div>
  12. </div>
  13. </div>
  14. </template>

在 setup 函数中,我们可以使用 ref 创建一个可响应的 visible 变量,并提供 open 和 close 方法以打开和关闭 Modal:

  1. <script>
  2. import { ref } from 'vue'
  3. export default {
  4. props: {
  5. title: {
  6. type: String,
  7. required: true
  8. }
  9. },
  10. setup(props, { emit }) {
  11. const visible = ref(false)
  12. const open = () => {
  13. visible.value = true
  14. }
  15. const close = () => {
  16. visible.value = false
  17. emit('update:visible', false)
  18. }
  19. return {
  20. visible,
  21. open,
  22. close
  23. }
  24. }
  25. }
  26. </script>

在父组件中,可以通过 v-model 绑定 visible 变量来打开或关闭 Modal。同时,我们也可以在 Modal 组件中通过 $emit 来发送一个自定义的事件,如 close 事件,以在父组件中监听关闭 Modal 的操作。

  1. <template>
  2. <div>
  3. <button @click="openModal">打开 Modal</button>
  4. <Modal v-model:visible="modalVisible" title="这是 Modal 标题" @close="modalVisible = false">
  5. <p>这是 Modal 内容</p>
  6. </Modal>
  7. </div>
  8. </template>
  9. <script>
  10. import Modal from './Modal.vue'
  11. export default {
  12. components: {
  13. Modal
  14. },
  15. data() {
  16. return {
  17. modalVisible: false
  18. }
  19. },
  20. methods: {
  21. openModal() {
  22. this.modalVisible = true
  23. }
  24. }
  25. }
  26. </script>

这样,我们就成功地实现了一个简单的 Modal,可以通过在父组件中设置 Modal 的 title 和内容来创建不同的 Modal。