vue3初体验-基于vue3+ant design封装公共弹框

parent.vue

<template>
  <div>
    <a-form
      name="advanced_search"
      class="ant-advanced-search-form"
      :model="searchForm"
    >
      <a-form-item label="客户编码" name="customNo">
        <a-input-search enter-button v-model:value="searchForm.customNo" style="width: 200px" @search="searchCustomNo"/>
      </a-form-item>
    </a-form>
    <customMultipleModel v-if="childShow" :modelShow="modelShow" :selectType="selectType" @closeModel="changeDialogVisible"/>
  </div>
</template>
<script lang="ts">
import { defineComponent, reactive, ref} from 'vue';
import customMultipleModel from '/@/components/custonMultipleSelection/index.vue'
export default defineComponent({
  components: {
    customMultipleModel
  },
  setup() {
    const searchForm = reactive({}); // form表单字段
    const childShow = ref(false) // 弹框是否显示
    const modelShow = ref(false) // 子组件弹框状态
    const selectType = ref('radio') // 单多选
    // 客户编码弹框查询
    const searchCustomNo = () => {
      modelShow.value = true
      childShow.value = true
    }
    // 弹框关闭回调
    const changeDialogVisible = (content) => {
      modelShow.value = false
      childShow.value = false
      if (content) {
        searchForm.customNo = content.value
      }
    }
    return {
      searchForm,
      searchCustomNo,
      modelShow,
      childShow,
      changeDialogVisible,
      selectType,
    };
  },
});
</script>
<style lang="less" scoped>
</style>

child.vue

<template>
  <div>
    <a-modal v-model:visible="visible" width="900px" title="选择客户" @cancel="handleCancel">
      <template #footer>
        <a-button key="back" @click="handleCancel">取消</a-button>
        <a-button key="submit" type="primary" :loading="loading" @click="handleOk">确认</a-button>
      </template>
      <a-form
        ref="searchForm"
        name="advanced_search"
        class="ant-advanced-search-form"
        :model="customForm"
        :label-col="labelCol"
      >
        <a-form-item label="客户操作吗" name="customOpCode">
          <a-input v-model:value="customForm.customOpCode" style="width: 200px" />
        </a-form-item>
        <a-form-item label="客户编码" name="customNo">
          <a-input v-model:value="customForm.customNo" style="width: 200px" />
        </a-form-item>
        <a-form-item label="客户名称" name="customName">
          <a-input v-model:value="customForm.customName" style="width: 200px" />
        </a-form-item>
        <a-form-item>
          <a-button style="margin-left: 30px" type="primary" html-type="submit" @click="searchTableList">搜索</a-button>
          <a-button style="margin: 0 8px" @click="resetForm">重置</a-button>
        </a-form-item>
      </a-form>
      <a-table bordered :columns="columns" :data-source="tableData" :scroll="{ y: 300 }" :row-selection="{onChange: onSelectChange, type: selectType}" @change="handleTableChange" :loading="tableLoading" :pagination="pagination" @resizeColumn="handleResizeColumn" :customRow="rowClick"></a-table>
    </a-modal>
  </div>
</template>

<script lang="ts">
import {defineComponent, ref, reactive} from 'vue';
import {TableProps, Form} from "ant-design-vue";
import {useDemoStore} from '/@/store/demo'
export default defineComponent({
  props: {
    modelShow: {
      type: Boolean,
      default: false
    },
    selectType: {
      type: String,
      default: 'checkbox'
    }
  },
  setup(props, ctx) {
    const demoStore = useDemoStore()
    const useForm = Form.useForm
    const data = ref(props)
    const loading = ref<boolean>(false);
    const visible = ref(data.value.modelShow)
    const customForm = reactive({ customOpCode: '', customNo: '', customName: '' })
    const tableData = ref([]) // 表格渲染数据
    const tableLoading = ref(false) // 表格loading状态
    const selectData = ref([])
    const selectType = data.value.selectType
    console.log(data.value)
    const handleOk = () => {
      visible.value = false
      ctx.emit('closeModel', selectData)
    };
    const handleCancel = () => {
      visible.value = false
      ctx.emit('closeModel', false)
    };
    // 分页配置项
    let pagination = ref({
      // 数据总数
      total: 0,
      // 当前页数
      current: 1,
      // 每页条数
      pageSize: 20,
      // 展示总数
      showTotal: (totalSize) => `${totalSize}`,
      // 是否可以改变pageSize
      showSizeChanger: true,
      // 设置每页可以展示多少条的选项
      pageSizeOptions: ["20", "50", "100", "200"],
      // 小尺寸分页
      size: "middle",
      // 是否可以快速跳转至某页
      showQuickJumper: true,
      //默认条数
      defaultPageSize: 20,
    })
    const searchTableList = (async (e) => {
      if (e !== 'page') {
        pagination.value.current = 1
      }
      tableLoading.value = true
      let params = {
        pageNum: pagination.value.current,
        pageSize: pagination.value.pageSize,
        condition: { ...customForm }
      }
      const res = await demoStore.getCustomerList(params)
      tableLoading.value = false
      res.data.records.forEach((item, index) => {
        item.key = index + 1
      })
      tableData.value = res.data.records
      pagination.value.total = res.data.total
      pagination.value.current = res.data.pageNum
      pagination.value.pageSize = res.data.pageSize
    })
    // 分页接口逻辑
    const handleTableChange: TableProps['onChange'] = (pag: { pageSize: number; current: number }) => {
      pagination.value.current = pag.current
      pagination.value.pageSize = pag.pageSize
      searchTableList('page')
    }
    const { resetFields } = useForm(customForm)
    const resetForm = () => {
      resetFields()
      searchTableList()
    }
    const onSelectChange = (selectedRowKeys, selectedRows) => {
      selectData.value = selectedRows.map(item => {
        return item.customNo
      })
      selectData.value = selectData.value.join(',')
    };
    const rowClick = () => {
      return {
        onClick: (event) => {
          if (selectType === 'radio') {
            event.path[1].querySelector('.ant-radio-wrapper').click()
          } else {
            event.path[1].querySelector('.ant-checkbox-wrapper').click()
          }
        },
      };
    }
    const columns = ref([
      {title: '序号', dataIndex: 'key', resizable: true, width: 50, ellipsis: true},
      {title: '客户编码', dataIndex: 'customNo', resizable: true, width: 200, ellipsis: true},
      {title: '客户名称', dataIndex: 'customName', resizable: true, width: 350, ellipsis: true},
      {title: '客户操作码', dataIndex: 'customOpCode', resizable: true, width: 180, ellipsis: true},
    ])
    return {
      visible,
      loading,
      handleOk,
      handleCancel,
      labelCol: { style: { width: '100px' } },
      customForm,
      columns,
      pagination,
      tableData,
      tableLoading,
      handleTableChange,
      searchTableList,
      handleResizeColumn: (w, col) => {
        col.width = w;
      },
      onSelectChange,
      resetForm,
      rowClick,
      selectType,
    };
  },
});
</script>

<style scoped>

</style>

初学vue3,有什么不同意见大家一起交流,共同进步

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以帮您解答这个问题。 首先,我们可以使用 Ant Design Vue 中的 Modal 组件封装一个弹框。下面是一个简单的示例代码: ```html <template> <a-modal :visible="visible" @ok="handleOk" @cancel="handleCancel"> <p>{{ message }}</p> </a-modal> </template> <script> import { defineComponent } from 'vue'; import { Modal } from 'ant-design-vue'; export default defineComponent({ name: 'MyModal', components: { Modal, }, props: { visible: Boolean, message: String, }, methods: { handleOk() { this.$emit('ok'); }, handleCancel() { this.$emit('cancel'); }, }, }); </script> ``` 在这个示例中,我们使用了 Ant Design Vue 中的 Modal 组件,并将它封装一个名为 MyModal 的组件。我们在组件中定义了两个 props:visible 和 message,分别用来控制弹框的显示和传递弹框的内容。我们还定义了两个方法:handleOk 和 handleCancel,分别在用户点击确认和取消按钮时触发,并通过 $emit 方法向父组件传递事件。 接下来,我们可以在父组件中引入 MyModal 组件,并使用 v-model 来控制弹框的显示。下面是一个示例代码: ```html <template> <div> <a-button @click="showModal">打开弹框</a-button> <my-modal v-model="modalVisible" :message="modalMessage" @ok="handleOk" @cancel="handleCancel" /> </div> </template> <script> import { defineComponent, ref } from 'vue'; import MyModal from './MyModal.vue'; export default defineComponent({ name: 'MyComponent', components: { MyModal, }, setup() { const modalVisible = ref(false); const modalMessage = ref(''); const showModal = () => { modalVisible.value = true; modalMessage.value = '这是弹框的内容'; }; const handleOk = () => { modalVisible.value = false; console.log('用户点击了确认按钮'); }; const handleCancel = () => { modalVisible.value = false; console.log('用户点击了取消按钮'); }; return { modalVisible, modalMessage, showModal, handleOk, handleCancel, }; }, }); </script> ``` 在这个示例中,我们首先引入了 MyModal 组件,并在模板中使用 v-model 来控制弹框的显示。我们还定义了一个 showModal 方法,用来在用户点击按钮时显示弹框,并传递弹框的内容。在 MyModal 组件中,我们将父组件传递的 visible 和 message props 绑定到 Modal 组件上,并通过 $emit 方法向父组件传递事件。 这样,我们就成功地封装一个弹框组件,并在父组件中调用了它。希望这个示例能够帮助到您。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值