Vue3 开发 Ant Design Vue 问题记录

文章记录了在Vue3项目中使用AntDesignVue2.2.8版本时遇到的问题,包括Table的customRender处理proxy对象,sorter函数的正确使用,以及自定义表格标题头和Tooltip宽度调整。同时提到了Form表单的非submit提交验证,Modal关闭时去除底部按钮的方法,Button实现路由跳转的方式,以及Select的模糊搜索配置。另外,文章还讨论了Echart5图表的自适应屏幕大小设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录一下在 vue3 开发 Ant Design Vue中遇到的问题。

Ant Design Vue ( 2.2.8 )

Table

  • ColumncustomRender 使用:
    • 文档:
      customRender 官方文档
    • 注意:
      • 如果需要使用 text 的值,使用时需指定 dataIndex 属性,否则取得的 text 会是一个 proxy 对象。
        {
          title: '创建时间',
          dataIndex: 'createdAt',
          customRender: ({ text }) => moment(text).format('YYYY-MM-DD HH:mm') || '-',
        },
        
      • proxy 对象,可使用 toRaw() 方法转为普通对象。
        import { toRaw } from '@vue/reactivity';
        
  • Columnsorter 函数根据返回值来进行排序,注意时间要用大于号小于号判断:
    • 文档:sorter 官方文档
    • 示例:
       {
         title: '创建时间',
         dataIndex: 'createdAt',
         slots: { customRender: 'createdAt' },
         sorter: (a, b) => a.createdAt > b.createdAt,
         defaultSortOrder: 'descend', // 默认排序
         width: '15%',
       },
      
  • table 标题头自定义图标
    • slots 属性中添加 title 配置:
      slots
    • 示例:
      // column 属性配置。
       columns: [
         { 
          dataIndex: 'name',
          slots: { customRender: 'name', title: 'myTitle' },
          width: '25%',
         },
         ...
       ],
      
      <!-- 自定义样式 -->
      <template #myTitle>
         <span>
           姓名
         </span>
         <Tooltip :title="name" arrow-point-at-center placement="rightTop">
           <InfoCircleOutlined />
         </Tooltip>
      </template>
      <template #name="{ record }">
        {{ record.name || '-' }}
      </template>
      
    • 注意: columns 中需要去掉 title 属性。

Tooltip

  • 更改 tooltip 宽度。
    • 示例:
      <Tooltip
        arrow-point-at-center
        placement="rightTop"
        :overlay-style="{ width: '380px', maxWidth: 'unset !important' }"
      >
       ...
      </Tooltip>
      

Form

  • 不使用 Form 表单自带的 submit 事件提交时,可通过 ref 手动调用 Form 表单校验。
    • 示例:
      <!-- From 设置 ref 属性 -->
      <Form
        ref="myForm"
        :rules="rules"
        :model="myForm"
      >
        ...
      </Form>
      
      onSubmit(){
        const currentForm = this.$refs.myForm as any;
        try {
          await myForm.validate();
        } catch (error) {
          return;
        }
        ...
       }
      

Modal

  • 通过 footer 属性去掉底部按钮:
    • 文档:
      footer
  • 示例:
    <Modal
      :visible="visible"
      :title="my modal"
      :centered="true"
      :footer="null"
      @cancel="onClose"
    >
     ...
    </Modal>
    

Button

  • 点击 Button 实现路由跳转
    • 方式一:使用 <router-link> 跳转,类似渲染成一个 <a> 标签,浏览器会自动跳转,并且在历史记录中生成一条记录。

      <!-- 页面路由跳转-->
      <router-link :to="{ name: 'xxx' }">
        <Button />
      </router-link>
      
    • 方式二:点击 Button 时调用 this.$router.push()

      <Button @click="onToXXXPage" />
      
      onToXXXPage(){
        this.$router.push({ name: 'xxx' });
      }
      

Select

  • 设置模糊搜索时匹配对应的 label:optionFilterProp="label"
    • 文档:
      文档
    • 示例:
      <Select
        v-model:value="value"
        :options="options"
        show-search
        option-filter-prop="label"
      />
      

Echart5

  • 图表自适应屏幕大小 :autoresize="true"
    • 示例:
      <!-- 直接使用 auto-resize 不起作用 -->
      <VueECharts
        ref="chart"
        :option="option"
        :autoresize="true"
      />
      

END

<think>我们正在讨论Arco Design Vue中的Modal组件使用方法。根据引用内容,我们可以总结出一些关键点: 1. 引用[1]提到封装Modal组件可以使其更灵活地与业务结合。 2. 引用[2]提到了Modal组件中有一个@ok事件,并对此有疑问。 3. 引用[3]和[4]重点讨论了在Modal中嵌套Form表单并实现验证后提交的问题。 4. 引用[5]提到在使用Modal时如果数据绑定深层数据或异步数据可能会出现报错。 用户问题:我想在Vue项目中使用Arco Design的Modal组件,请问Arco Design Vue Modal组件使用方法。 我们将分步骤介绍Modal组件的基本使用,包括: 1. 安装和引入Arco Design Vue 2. Modal组件的基本使用(显示/隐藏、内容、按钮等) 3. 事件处理(特别是@ok事件) 4. 在Modal中嵌套表单并处理验证提交 5. 可能遇到的问题及解决方案 注意:由于引用中提到了@ok事件和表单验证的问题,我们需要特别关注这些部分。 步骤1:安装和引入 首先,确保已经安装了Arco Design Vue。如果没有,可以通过以下命令安装: ``` npm install --save-dev @arco-design/web-vue ``` 然后在main.ts中引入: ```typescript import { createApp } from &#39;vue&#39;; import ArcoVue from &#39;@arco-design/web-vue&#39;; import App from &#39;./App.vue&#39;; import &#39;@arco-design/web-vue/dist/arco.css&#39;; const app = createApp(App); app.use(ArcoVue); app.mount(&#39;#app&#39;); ``` 步骤2:基本使用 在Vue组件中,我们可以使用Modal的模板方式或者函数式调用。 方式一:模板方式(推荐) ```vue <template> <a-button @click="handleClick">Open Modal</a-button> <a-modal v-model:visible="visible" title="Basic Modal" @ok="handleOk" @cancel="handleCancel"> <p>Content of modal</p> </a-modal> </template> <script> import { ref } from &#39;vue&#39;; export default { setup() { const visible = ref(false); const handleClick = () => { visible.value = true; }; const handleOk = () => { console.log(&#39;OK&#39;); visible.value = false; }; const handleCancel = () => { console.log(&#39;Cancel&#39;); visible.value = false; }; return { visible, handleClick, handleOk, handleCancel }; } }; </script> ``` 方式二:函数式调用 ```javascript import { Modal } from &#39;@arco-design/web-vue&#39;; Modal.info({ title: &#39;Info&#39;, content: &#39;This is an info message&#39; }); ``` 步骤3:事件处理 在Modal中,主要事件有: - @ok: 当点击确定按钮时触发 - @cancel: 当点击取消按钮、关闭图标或遮罩层时触发 引用[2]中提到对@ok事件的设计有疑问。实际上,@ok事件是Modal组件提供的一个事件,用于处理确定按钮的操作。通常我们在这个事件中处理一些提交逻辑,然后关闭Modal。 步骤4:在Modal中嵌套表单 引用[3]和[4]重点讨论了在Modal中嵌套表单并实现验证后提交的问题。下面是一个示例: 关键点:在Modal内部放置一个表单,并将Modal的确定按钮设置为HTML的submit类型(触发表单的submit事件)。然后通过表单的验证成功事件来处理提交。 ```vue <template> <a-button @click="visible = true">Open Modal with Form</a-button> <a-modal v-model:visible="visible" title="Form in Modal" :footer="null"> <!-- 注意:这里我们去掉Modal自带的底部按钮,使用表单的提交按钮 --> <a-form :model="form" :rules="rules" ref="formRef" @submit-success="handleSubmitSuccess"> <a-form-item field="name" label="Name" :rules="rules.name"> <a-input v-model="form.name" /> </a-form-item> <a-form-item> <a-button html-type="submit">Submit</a-button> </a-form-item> </a-form> </a-modal> </template> <script> import { ref, reactive } from &#39;vue&#39;; export default { setup() { const visible = ref(false); const formRef = ref(null); const form = reactive({ name: &#39;&#39; }); const rules = { name: [ { required: true, message: &#39;Please input name&#39; } ] }; const handleSubmitSuccess = (values) => { console.log(&#39;Submit Success:&#39;, values); // 在这里可以处理提交成功的逻辑,比如发送请求 visible.value = false; }; return { visible, form, rules, formRef, handleSubmitSuccess }; } }; </script> ``` 但是,如果我们希望使用Modal自带的确定按钮来触发表单提交,可以这样做: - 给Modal的确定按钮设置`html-type="submit"`属性,并关联到表单的submit事件。 - 但是注意:Modal的确定按钮并不是表单内部的按钮,所以我们需要通过给表单设置ref,然后在Modal的@ok事件中手动触发表单的提交。 修改后的代码: ```vue <template> <a-button @click="visible = true">Open Modal with Form</a-button> <a-modal v-model:visible="visible" title="Form in Modal" @ok="handleModalOk" @cancel="visible = false"> <a-form :model="form" :rules="rules" ref="formRef"> <a-form-item field="name" label="Name" :rules="rules.name"> <a-input v-model="form.name" /> </a-form-item> </a-form> </a-modal> </template> <script> import { ref, reactive } from &#39;vue&#39;; export default { setup() { const visible = ref(false); const formRef = ref(null); const form = reactive({ name: &#39;&#39; }); const rules = { name: [ { required: true, message: &#39;Please input name&#39; } ] }; const handleModalOk = () => { // 通过表单引用触发表单验证 formRef.value.validate((errors) => { if (!errors) { // 验证通过,可以提交 console.log(&#39;Submit:&#39;, form); visible.value = false; } else { console.log(&#39;Validation failed&#39;); } }); }; return { visible, form, rules, formRef, handleModalOk }; } }; </script> ``` 注意:在Modal的@ok事件中,我们手动调用了表单的validate方法。如果验证通过,则继续执行(比如提交数据并关闭Modal),否则不关闭Modal并显示错误信息。 步骤5:可能遇到的问题 1. 深层数据绑定问题:如引用[5]所述,当Modal中显示的数据是深层对象或异步获取时,可能会出现空数据报错。解决方法是确保数据已经正确加载,或者使用v-if控制Modal的显示时机。 2. 异步数据:在打开Modal时可能需要加载数据,可以在visible变化时(比如变为true时)去加载数据。 例如: ```vue <a-modal v-model:visible="visible" @open="fetchData"> ... </a-modal> ``` 其中,`@open`事件在Modal打开时触发,可以在这里加载数据。 总结: - 基本使用:通过visible控制显示隐藏,处理@ok和@cancel事件。 - 嵌套表单:推荐在@ok事件中手动触发表单验证,根据验证结果决定是否关闭Modal。 - 注意数据绑定和异步加载问题。 根据以上内容,我们可以生成相关问题。 §§相关问题§§ 1. Arco Design Modal组件中@ok事件的作用是什么? 2. 如何在Arco Design Modal中嵌套表单并实现验证? 3. 使用Arco Design Modal时遇到深层数据绑定报错怎么办? 4. Arco Design Modal支持函数式调用吗?如何使用? 5. 如何控制Arco Design Modal的显示和隐藏?</think>### Arco Design Vue Modal 组件使用方法 #### 1. **基本使用** ```vue <template> <a-button @click="visible = true">打开弹窗</a-button> <a-modal v-model:visible="visible" title="基础弹窗" @ok="handleOk" @cancel="handleCancel" > <p>弹窗内容区域</p> </a-modal> </template> <script setup> import { ref } from &#39;vue&#39;; const visible = ref(false); const handleOk = () => { console.log(&#39;点击确定按钮&#39;); visible.value = false; }; const handleCancel = () => { console.log(&#39;点击取消按钮&#39;); visible.value = false; }; </script> ``` - **核心属性**: - `v-model:visible`:控制弹窗显示/隐藏 - `title`:弹窗标题 - `@ok`:确定按钮事件 - `@cancel`:取消按钮事件 #### 2. **嵌套表单验证** 引用[3]提到表单验证需手动处理: ```vue <template> <a-modal v-model:visible="visible" title="表单弹窗" @ok="handleSubmit" <!-- 手动触发表单验证 --> > <a-form ref="formRef" :model="form" :rules="rules"> <a-form-item field="name" label="用户名"> <a-input v-model="form.name" placeholder="请输入" /> </a-form-item> </a-form> </a-modal> </template> <script setup> import { ref } from &#39;vue&#39;; const formRef = ref(null); const visible = ref(false); const form = ref({ name: &#39;&#39; }); const rules = { name: [{ required: true, message: &#39;用户名必填&#39; }] }; const handleSubmit = async () => { const res = await formRef.value.validate(); if (!res) { // 验证通过 console.log(&#39;提交数据:&#39;, form.value); visible.value = false; } }; </script> ``` > 关键点:Modal 不会自动触发表单验证,需在 `@ok` 事件中手动调用 `formRef.value.validate()`[^3] #### 3. **自定义底部按钮** ```vue <a-modal :footer="false" <!-- 隐藏默认按钮 --> > <template #footer> <a-button @click="visible=false">自定义按钮</a-button> </template> </a-modal> ``` #### 4. **异步关闭** ```javascript const handleOk = () => { return new Promise(resolve => { setTimeout(() => { visible.value = false; resolve(); }, 1000); // 模拟异步操作 }); }; ``` #### 5. **函数式调用** ```javascript import { Modal } from &#39;@arco-design/web-vue&#39;; Modal.info({ title: &#39;提示&#39;, content: &#39;操作成功&#39;, okText: &#39;知道了&#39;, onOk: () => console.log(&#39;关闭弹窗&#39;) }); ``` #### 6. **常见问题解决** - **深层数据报错**(引用[5]): ```vue <a-modal v-model:visible="visible"> <!-- 使用 v-if 确保数据已加载 --> <div v-if="deepData">{{ deepData.value }}</div> </a-modal> ``` - **空数据占位**: ```vue <a-table :data="[]" :show-empty-tree="true" > <template #empty> <a-empty description="暂无数据" /> </template> </a-table> ``` > 提示:完整文档请参考 [Arco Design Vue Modal](https://arco.design/vue/component/modal)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值