iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >vue ant design封装弹窗表单如何使用
  • 434
分享到

vue ant design封装弹窗表单如何使用

2023-06-30 17:06:15 434人浏览 安东尼
摘要

本篇内容介绍了“Vue ant design封装弹窗表单如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!vue a

本篇内容介绍了“Vue ant design封装弹窗表单如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

vue ant design 封装弹窗表单

<template>    <div id="fORMForm">        <a-modal             :visible="true"             :title='title'             @ok="handleOk('ok')"             @cancel="handleOk('return')"             :centered="true"             :confirmLoading="confirmLoading"            :width="width">            <a-form :form="formState" :label-col="{ span: 5 }" :wrapper-col="{ span: 17 }">                <div v-for="itme in formData" :key="itme.value" >                    <!-- 输入款 -->                    <a-form-item                         :label="itme.label"                         v-if="itme.type === 'input'"                         :label-col="{ span: itme.labelCol ? itme.labelCol : 5 }"                         :wrapper-col="{ span: itme.wrapper ? itme.wrapper : 17 }">                        <a-input                             v-decorator="[itme.value, { rules: [{                                                         required: itme.required?itme.required:false,                                                         message: itme.message?itme.message:' ' },                                                         {validator: itme.validator}]}]"                            :placeholder="!itme.placeholder ? itme.label : itme.label"                             allowClear>                            <!-- 插入输入框的下拉框选择器 -->                            <a-select                                v-if="itme.select && itme.select.length>0"                                slot="addonBefore"                                v-decorator="[ itme.header ]"                                >                                <a-select-option v-for="select in itme.select" :key="select.value">                                    {{select.label}}                                </a-select-option>                            </a-select>                        </a-input>                    </a-form-item>                    <!-- 开始结束时间选择 -->                    <a-form-item :label="itme.label" v-if="itme.type === 'rangePicker'">                        <a-range-picker                            :placeholder="!itme.placeholder ? itme.label : itme.placeholder"                            showTime                            :                            v-decorator="[itme.value, { rules: [{ required: itme.required?itme.required:false, message: itme.message?itme.message:' ' }]}]" />                    </a-form-item>                    <!-- 单个时间选择 -->                    <a-form-item                         :label="itme.label" v-if="itme.type === 'datePicker'">                        <a-date-picker                             :                            v-decorator="[ itme.value, { rules: [{ required: itme.required?itme.required:false, message: itme.message?itme.message:' ' }]}]"                            showTime                            :placeholder="!itme.placeholder ? itme.label : itme.placeholder" />                    </a-form-item>                    <!-- 选择框 -->                    <a-form-item                         :label="itme.label"                         v-if="itme.type === 'select'"                        :label-col="{ span: itme.labelCol ? itme.labelCol : 5 }"                         :wrapper-col="{ span: itme.wrapper ? itme.wrapper : 8 }">                        <a-select                            allowClear                            v-decorator="[ itme.value, { rules: [{                                                          required: itme.required?itme.required:false,                                                          message: itme.message?itme.message:' ' }]}]"                            :placeholder="!itme.placeholder ? itme.label : itme.placeholder">                            <a-select-option v-for="optionItme in itme.option" :key="optionItme.value">                                {{optionItme.label}}                            </a-select-option>                        </a-select>                    </a-form-item>                                        <!-- 单选框 -->                    <a-form-item :label="itme.label" v-if="itme.type === 'radio'">                        <a-radio-group                             v-decorator="[ itme.value, { rules: [{ required: itme.required?itme.required:false, message: itme.message?itme.message:' ' }]}]">                            <a-radio v-for="radioItme in itme.radio" :key="radioItme.value" :value="radioItme.value">                                {{radioItme.label}}                            </a-radio>                        </a-radio-group>                    </a-form-item>                    <!-- 开关按钮 -->                    <a-form-item :label="itme.label"  v-if="itme.type === 'switch'">                        <a-switch v-decorator="[ itme.value, { valuePropName: 'checked' }]" />                    </a-form-item>                    <!-- 图片上传 -->                    <a-form-item                         :label="itme.label"                         v-if="itme.type === 'upload'"                        :label-col="{ span: itme.labelCol ? itme.labelCol : 5 }"                         :wrapper-col="{ span: itme.wrapper ? itme.wrapper : 20 }">                        <a-upload                            v-decorator="[ itme.value, { valuePropName: 'fileList', getValueFromEvent: normFile, }]"                            :action="itme.action?itme.action:'https://www.mocky.io/v2/5cc8019d300000980a055e76'"                            listType="picture-card"                            @preview="handlePreview">                            <div v-if="itme.value.length < 8">                                <a-icon type="plus" />                                <div class="ant-upload-text">点击上传图片</div>                            </div>                        </a-upload>                        <a-modal :visible="previewVisible" :footer="null" @cancel="previewVisible = false">                            <img alt="example"  :src="previewImage" />                        </a-modal>                    </a-form-item>                </div>            </a-form>        </a-modal>    </div></template>
<script lang='ts'>import { Component, Vue, Prop, Emit, Watch } from 'vue-property-decorator';import Moment from 'moment'function getBase64(file) {    return new Promise((resolve, reject) => {      const reader = new FileReader();      reader.readAsDataURL(file);      reader.onload = () => resolve(reader.result);      reader.onerror = error => reject(error);    });  }@Component({    data() {        return {            formState: this.$form.createForm(this),            previewVisible: false,            previewImage: ''        };    },})export default class FormForm extends Vue {    [x: string]: any;    // 弹出框宽度    @Prop({type: String, default: '500px'}) width!: string;    // 接收表单渲染内容数据    @Prop({type: Object, default: () => {console.log()}}) form!: {};        // 接收弹窗窗口标题    @Prop({type: String, default: '操作窗口'}) title!: string;    // 接收表单渲染内容格式    @Prop({type: Array, default: () => []}) formData!: [];    // 返出取消和确定按钮    @Emit('handleOk')    handleOk(e) {         if (e === 'return') {            return 'true';        } else if (e === 'ok') {            let stateType: object | boolean = false;            this.formState.validateFields((err, value) => {                if (!err) {                    this.confirmLoading = true;                    stateType = value;                }            })            return stateType;        }    }        // 监听表单渲染内容数据接入 + 转换多余传入问题    @Watch('form', {immediate: true, deep: false})    onForm(e) {        let obj: object = {};        Object.keys(e).forEach(key => {            Array.from(this.formData).forEach((res: any | object) => {                if (key === res.value || key === res.header) {                    if (res.type === 'rangePicker' && e[key].length > 0) {                        e[key] = [ Moment(e[key][0]), Moment(e[key][1]) ]                    }                    if (res.type === 'datePicker' && e[key]) {                        e[key] = Moment(e[key])                    }                    obj[key] = e[key]                }            })        })        this.$nextTick(() => {            this.formState.setFieldsValue(obj)        })    }    // 监听是否弹窗属性    public visibleOff: boolean = false;    // 确定按钮loading    public confirmLoading: boolean = false;// --------- methods ------------    async handlePreview(file) {        if (!file.url && !file.preview) {            file.preview = await getBase64(file.originFileObj);        }        this.previewImage = file.url || file.preview;        this.previewVisible = true;    }    normFile(e) {      if (Array.isArray(e)) {        return e;      }      return e && e.fileList;    }}</script>
<style lang='sCSS' scpoed>    .ant-form-item-label{        white-space: pre-wrap;        line-height: 25px;    }    .ant-row{        display: flex;        align-items: center;    }    .ant-form{        max-height: 60vh;        overflow: auto;        &::-WEBkit-scrollbar {            display: none;;        }    }    .ant-form-item{        margin-bottom: 10px;    }    .ant-form-item-control{        left: 10px;        max-height: 225px;        overflow: auto;        &::-webkit-scrollbar{            display: none;        }    }    .ant-upload-select-picture-card i {        font-size: 32px;        color: #999;    }    .ant-upload-select-picture-card .ant-upload-text {        margin-top: 8px;        color: #666;    }</style>

部分效果图:

vue ant design封装弹窗表单如何使用

使用ant-design-vue的Form表单

使用脚手架新建项目

vue create antd-demo

vue ant design封装弹窗表单如何使用

所以,得到了这么一个项目,如下

vue ant design封装弹窗表单如何使用

安装并导入ant-design-vue,使用Form组件

npm install --save ant-design-vue@next

修改main.ts 

import { createApp } from 'vue';import App from './App.vue';import Antd from "ant-design-vue";import "ant-design-vue/dist/antd.css";createApp(App).use(Antd).mount('#app');

修改App.vue

<template>  <HelloWorld/></template>
<script lang="ts">import { defineComponent } from 'vue';import HelloWorld from './components/HelloWorld.vue';export default defineComponent({  name: 'App',  components: {    HelloWorld  }});</script>
<style>#app {  font-family: Avenir, Helvetica, Arial, sans-serif;  -webkit-font-smoothing: antialiased;  -moz-osx-font-smoothing: grayscale;  text-align: center;  color: #2c3e50;  margin-top: 60px;}</style>

修改HelloWorld.vue

<template>  <a-form    layout="inline"    :model="formState"    @finish="handleFinish"    @finishFailed="handleFinishFailed"  >    <a-form-item>      <a-input v-model:value="formState.user" placeholder="Username">        <template #prefix><UserOutlined  /></template>      </a-input>    </a-form-item>    <a-form-item>      <a-input v-model:value="formState.passWord" type="password" placeholder="Password">        <template #prefix><LockOutlined  /></template>      </a-input>    </a-form-item>    <a-form-item>      <a-button        type="primary"        html-type="submit"        :disabled="formState.user === '' || formState.password === ''"      >        Log in      </a-button>    </a-form-item>  </a-form></template>
<script lang="ts">import { UserOutlined, LockOutlined } from '@ant-design/icons-vue';import { ValidateErrorEntity } from 'ant-design-vue/es/form/interface';import { defineComponent, Reactive, UnwrapRef } from 'vue';interface FormState {  user: string;  password: string;}export default defineComponent({  setup() {    const formState: UnwrapRef<FormState> = reactive({      user: '',      password: '',    });    const handleFinish = (values: FormState) => {      console.log(values, formState);    };    const handleFinishFailed = (errors: ValidateErrorEntity<FormState>) => {      console.log(errors);    };    return {      formState,      handleFinish,      handleFinishFailed,    };  },  components: {    UserOutlined,    LockOutlined,  },});</script>

启动应用,测试验证

npm run serve启动应用,效果如下

vue ant design封装弹窗表单如何使用

好了,应用就暂时介绍到这里。其实,我更想说说我的疑惑:

Hello.vue中,Username输入框的前面有个图片前缀,Password输入框的前面也有一个图片前缀,都是通过<template #prefix></template>实现的,一眼看去,应该就是通过插槽实现的,但是具体的实现过程是怎样的,尚不清楚。

简单调试了一下,如下图所示。

vue ant design封装弹窗表单如何使用

ant-design-vue的Form组件的FormItem.js的部分源码如下,

vue ant design封装弹窗表单如何使用

“vue ant design封装弹窗表单如何使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: vue ant design封装弹窗表单如何使用

本文链接: https://www.lsjlt.com/news/330614.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vue ant design封装弹窗表单如何使用
    本篇内容介绍了“vue ant design封装弹窗表单如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!vue a...
    99+
    2023-06-30
  • vue ant design 封装弹窗表单的使用
    目录vue ant design 封装弹窗表单使用ant-design-vue的Form表单使用脚手架新建项目安装并导入ant-design-vue,使用Form组件启动应用,测试验...
    99+
    2024-04-02
  • ant design vue的form表单如何取值
    本篇内容介绍了“ant design vue的form表单如何取值”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!ant ...
    99+
    2023-06-30
  • Ant Design Vue Pagination分页组件的封装与使用
    目录Ant Design Vue Pagination分页组件的封装与使用设置ant design vue中的 pagination的最大分页数总结Ant Design Vue Pa...
    99+
    2023-05-17
    Ant Design Vue Pagination分页组件 Pagination分页组件封装
  • 如何使用ant-design-vue的Table组件
    目录安装脚手架工具使用Vue CLI新建项目$slotsTable组件相关源码安装脚手架工具 npm install -g @vue/cli 查看@vue/cli版本,vue -V。...
    99+
    2024-04-02
  • 如何在vue中使用ant-design-vue组件
    目录在vue中使用ant-design-vue组件1. 安装2. 引入组件库3. 使用3.1 按钮样式3.2 导航栏样式3.3 表单样式在vue中使用ant-design-vue组件...
    99+
    2023-01-29
    vue使用ant-design-vue组件 ant-design-vue组件
  • vue中ant-design-vue组件的安装与使用
    目录1. 安装2. 引入组件库3. 使用3.1 按钮样式3.2 导航栏样式3.3 表单样式补充:ant-design-vue的兼容问题总结官方地址:Ant Design Vue 1....
    99+
    2024-04-02
  • vue中ant-design-vue组件怎么安装与使用
    这篇文章主要介绍了vue中ant-design-vue组件怎么安装与使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue中ant-design-vue组件怎么安装与使用文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-06-30
  • vue弹窗组件如何使用
    这篇文章给大家分享的是有关vue弹窗组件如何使用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。示例<!DOCTYPE html> <html ...
    99+
    2024-04-02
  • 怎么封装一个vue中也可使用的uniapp全局弹窗组件
    这篇文章主要介绍了怎么封装一个vue中也可使用的uniapp全局弹窗组件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么封装一个vue中也可使用的uniapp全局弹窗组件文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-07-05
  • 微信小程序如何实现简易封装弹窗
    今天就跟大家聊聊有关微信小程序如何实现简易封装弹窗,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。建立组件文件夹编写组件内容 <!--index.wxml-->&...
    99+
    2023-06-26
  • vue如何封装一个高质量的表单通用组件
    这篇“vue如何封装一个高质量的表单通用组件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue如何封装一个高质量的表单通用...
    99+
    2023-07-05
  • 封装一个vue中也可使用的uniapp的全局弹窗组件(任何页面都可以弹出)
    目录效果图:场景:思路:第一步:第二步:第三部:使用总结效果图: 场景: 当你对接websocket时,或者轮询也好,你需要获取到最新的信息,并且在任何页面弹出一个组件进行后续操作...
    99+
    2023-02-23
    uniapp 全局弹窗 vue弹窗组件 uniapp 全局组件
  • vue中如何使用axios和封装
    这篇文章给大家分享的是有关vue中如何使用axios和封装的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。vue官方推荐使用 axios发送请求首先上需求1.需要封装全局调用2.返...
    99+
    2024-04-02
  • vue中el-message如何封装使用
    这篇文章将为大家详细讲解有关vue中el-message如何封装使用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。实现方法实现方法有很多种,可以根据你实际项目情况决定使用哪一种。方法一直接css里面给这个...
    99+
    2023-06-29
  • Vue如何使用Vuex封装并使用store
    这篇文章主要介绍“Vue如何使用Vuex封装并使用store”,在日常操作中,相信很多人在Vue如何使用Vuex封装并使用store问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue如何使用Vuex封装并使...
    99+
    2023-07-04
  • 如何使用vue实现一个toast弹窗组件
    本篇内容介绍了“如何使用vue实现一个toast弹窗组件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先,我们来分析一下弹窗组件的特性(需...
    99+
    2023-07-04
  • 在vue中如何封装G2图表
    目录vue封装G2图表vue引入G2图表线上示例特性介绍一下在vue中使用G2vue封装G2图表 <template>     <div id="id">&l...
    99+
    2024-04-02
  • vue中如何简单封装axios浅析
    把axios注入到Vue中 import axios from 'axios'; Vue.prototype.$axios = axios; import axios f...
    99+
    2024-04-02
  • Vue封装svg-icon组件如何使用
    这篇文章主要介绍“Vue封装svg-icon组件如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue封装svg-icon组件如何使用”文章能帮助大家解决问题。一、SVG可缩放矢量图形SVG(...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作