antd vue的modal组件如何与btn按钮建立对应关联?

Ant Design Vue框架的modal对话框组件,其简单型中,一般是一个btn组件对应一个a-modal;我设计一个页面有多个btn按钮,对应多个a-modal,一般采取不同名的visible响应每个btn,如果是2-3个,还好处理,如下方代码。
但如果是10个以上,怎么办?不断地设置不同的响应变量吗?

<template>
  <div>
    <a-button type="primary" @click="showModal1">Open Modal1</a-button>
    <a-modal v-model:visible="visible1" title="Basic Modal" @ok="handleOk">
      <p>Some contents...1</p>
    </a-modal>
    <a-button type="primary" @click="showModal2">Open Modal1</a-button>
    <a-modal v-model:visible="visible2" title="Basic Modal" @ok="handleOk">
      <p>Some contents...2</p>
    </a-modal>
    <a-button type="primary" @click="showModal3">Open Modal1</a-button>
    <a-modal v-model:visible="visible3" title="Basic Modal" @ok="handleOk">
      <p>Some contents...3</p>
    </a-modal>
    <a-button type="primary" @click="showModal4">Open Modal1</a-button>
    <a-modal v-model:visible="visible4" title="Basic Modal" @ok="handleOk">
      <p>Some contents...4</p>
    </a-modal>
......
  </div>
</template>
<script>
import { defineComponent, ref } from 'vue';
export default defineComponent({
  setup() {
    const visible1 = ref(false);
......
    const showModal1 = () => {
      visible1.value = true;
    };
......
    return {
      visible1,
.......
    };
  },

});
</script>

新手上路,还望勿见笑

阅读 2.1k
1 个回答

比如类似下面这样的形式

<template>
  <div>
    <a-button type="primary" @click="showModal(DialogType.error)">Open Modal error</a-button>
    <a-button type="primary" @click="showModal(DialogType.success)" style="margin: 0 20px;">Open Modal success</a-button>
    <a-button type="primary" @click="showModal(DialogType.warn)">Open Modal warn</a-button>
    <a-modal :visible="dialogType!=DialogType.close" title="Basic Modal" @ok="closeDialog" @cancel="closeDialog">
      <p>{{content}}</p>
    </a-modal>
  </div>
</template>
<script>
const DialogType = createEnum(['close','error', 'success', 'warn'])

function createEnum(keys, start=0) {
  return Object.freeze(keys.reduce((res, k, i) => {
    res[ res[k] = start+i ] = k;
    return res;
  }, {}))
}

export default {
  data: () => ({
    dialogType: DialogType.close,
    DialogType,
  }),
  computed: {
    content() {
      return ['','error','success','warn'][this.dialogType] + 'content'
    }
  },
  methods: {
    showModal(dialogType) {
      this.dialogType = dialogType;
    },
    closeDialog() {
      this.dialogType = DialogType.close
    },
  }
};
</script>

可以用枚举,减少变量使用,modal如果配置上没啥区别,只是内容不一样的话,那变化内容就行了,modal就用一个,具体要看内容多复杂,如果只是像示例中文案不同,那用compute根据具体枚举返回对应文案就可以了。如果是复杂的结构,那可以抽象成组件,用component去映射到对应组件即可,这样就不需要很多变量,也不需要写一堆if...else

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏