我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

本篇内容介绍了“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"  :class="lazy" data-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封装弹窗表单如何使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

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

下载Word文档

猜你喜欢

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

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

ant design vue的form表单如何取值

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

Ant Design Vue Pagination分页组件的封装与使用

这篇文章主要介绍了Ant Design Vue Pagination分页组件的封装与使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-17

如何在vue中使用ant-design-vue组件

这篇文章主要介绍了如何在vue中使用ant-design-vue组件,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-01-29

怎么封装一个vue中也可使用的uniapp全局弹窗组件

这篇文章主要介绍了怎么封装一个vue中也可使用的uniapp全局弹窗组件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么封装一个vue中也可使用的uniapp全局弹窗组件文章都会有所收获,下面我们一起来看看吧
2023-07-05

vue如何封装一个高质量的表单通用组件

这篇“vue如何封装一个高质量的表单通用组件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue如何封装一个高质量的表单通用
2023-07-05

封装一个vue中也可使用的uniapp的全局弹窗组件(任何页面都可以弹出)

在写uniapp小程序的时候,弹窗提醒经常会用到,虽然弹窗的组件很多,但是通常别人封装好的弹窗组件自定义度不高,很难匹配自己的ui需求,这篇文章主要给大家介绍了封装一个vue中也可使用的uniapp的全局弹窗组件的相关资料,这个组件在任何页面都可以弹出,需要的朋友可以参考下
2023-02-23

vue中el-message如何封装使用

这篇文章将为大家详细讲解有关vue中el-message如何封装使用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。实现方法实现方法有很多种,可以根据你实际项目情况决定使用哪一种。方法一直接css里面给这个
2023-06-29

Vue如何使用Vuex封装并使用store

这篇文章主要介绍“Vue如何使用Vuex封装并使用store”,在日常操作中,相信很多人在Vue如何使用Vuex封装并使用store问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue如何使用Vuex封装并使
2023-07-04

如何使用vue实现一个toast弹窗组件

本篇内容介绍了“如何使用vue实现一个toast弹窗组件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先,我们来分析一下弹窗组件的特性(需
2023-07-04

Vue封装svg-icon组件如何使用

这篇文章主要介绍“Vue封装svg-icon组件如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue封装svg-icon组件如何使用”文章能帮助大家解决问题。一、SVG可缩放矢量图形SVG(
2023-07-05

如何使用vue组件封装共用的组件

这篇文章主要介绍了如何使用vue组件封装共用的组件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用vue组件封装共用的组件文章都会有所收获,下面我们一起来看看吧。这里提供两种vue封装共用组件的方法方法一
2023-06-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录