vForm快速入门及postMessage通信

在Vue2.0中集成Vform动态表单 最近由于业务需要,要做一个导出类似Word登记表的功能,所以考虑使用Variant Form动态表单来做前端表单的搭建、表单交互以及数据收集等功能。Variant Form实际上是一个低代码表单,支持Element UI组件库,能够大大提高我们的开发效率以及用户体验,这也是我们选择这一组件的目的。我们这次的功能涉及:Variant Form表单的引入、使用以及导出Word文档,我将全程记录使用过程中遇到的问题以及难点。 阅读详情

一、vForm引入使用

根据文档完成4.1、4.2内容;

二、封装vFormEdit

<template>
    <el-card style="height: 100vh">
        <div style="height: 92vh; overflow: auto">
            <v-form-designer style="height: 98vh; position: relative; top: -48px"
                             :designer-config="designerConfig"
                             ref="vFormDesigner"></v-form-designer>
        </div>
        <span class="width_center mb10" style="bottom: 0">
            <el-button @click="cancel">关 闭</el-button>
            <el-button type="primary" @click="getFormJson">确 定</el-button>
        </span>
    </el-card>
</template>

<script>
export default {
    name: "vFormEdit",
    data() {
        return {
            designerConfig: {
                //是否显示GitHub、文档等外部链接
                externalLink: false,

                //是否显示导入JSON按钮
                importJsonButton: true,

                //是否显示导出JSON器按钮
                exportJsonButton: false,

                //是否显示导出代码按钮
                exportCodeButton: false,

                //是否显示生成SFC按钮
                generateSFCButton: false,
            },
            obj: {}
        }
    },
    methods: {
        getFormJson() {
            this.obj.type = true
            this.obj.formJson = JSON.stringify(this.$refs.vFormDesigner.getFormJson())
            if (this.$refs.vFormDesigner.getFormJson().widgetList.length) {
                console.log(this.obj)
                window.parent.postMessage(this.obj, '*');
                this.$refs.vFormDesigner.clearDesigner()
            } else {
                this.$message({
                    type: 'error',
                    message: '请编辑报表模板'
                })
            }
        },
        cancel() {
            // 清空画布
            this.$refs.vFormDesigner.clearDesigner()
            this.obj.type = false
            window.parent.postMessage(this.obj, '*');
        }
    },
    mounted() {
        window.addEventListener('message', messageEvent => {
            // console.log(messageEvent,'messageEvent---------------')
            if (messageEvent.source !== window.parent.window.parent) return;
            //    console.log('子收到messageEvent:',messageEvent);
            console.log('儿子收到vue的数据:', messageEvent.data);
            if (messageEvent.data.formJson) {
                this.$refs.vFormDesigner.setFormJson(JSON.parse(messageEvent.data.formJson))
            }

        })
    }
}
</script>

<style scoped>

</style>

三、父组件

1、在你的父组件中引入iframe;
2、使用iframeWin.postMessage发送参数;
3、使用window.addEventListener()获取并监听iframe传递来的数据;

<template>
    <el-drawer :visible.sync="drawer"
               :direction="direction"
               size="85%"
               style="margin-top: -70px"
               :before-close="handleClose">
        <iframe src="http://localhost:80/#/vForm"
                style="width: 100%; height: 100%; border: 0; margin: 0"
                ref="iframe" @load="loader"></iframe>
    </el-drawer>
</template>

<script>
export default {
    name: "reportAdd",
    data(){
        return{
            direction: 'rtl',
            drawer:false,
            form:{
                formJson:''
            }
        }
    },
    methods:{
        handleClose(done) {
            this.$confirm('确认关闭?')
                .then(_ => {
                    done();
                })
                .catch(_ => {});
        },
        loader() {
            // 传参
            const mapFrame = this.$refs['iframe'];
            const iframeWin = mapFrame.contentWindow;
            iframeWin.postMessage(
                {
                    formJson: this.form.formJson || '',
                },
                '*'
            );
        }
    },
    mounted() {
        // 获取并监听iframe传递来的数据
        let that = this
        window.addEventListener('message', function (e) {
            let res = e.data || {};
            console.log(res)
            if(res.type) {
                that.form.formJson = res.formJson || ''
            }
            that.drawer = false
        })
    }
}
</script>

<style lang="scss">
body {
    margin: 0;  /* 如果页面出现垂直滚动条,则加入此行CSS以消除之 */
}

</style>

四、使用postMessage来实现父子通信跨域

1、子向父通信

parent父组件:

window.addEventListener('message', function (e) {
    let res = e.data || {};
    //自己的逻辑业务处理
})

child子组件:

window.parent.postMessage(this.obj, '*');

2、父向子通信

parent父组件:

loader() {
    const mapFrame = this.$refs['iframe'];//获取iframe
    const iframeWin = mapFrame.contentWindow;
    iframeWin.postMessage(
        {
            formJson: this.form.formJson || '',
        },
        '*'
    );//*是子页面的源(协议+主机+端口号)
}

child子组件:

window.addEventListener('message', function(e){
      console.log(e.data.data);
}

注意:
1.子向父,子postMessage,父监听message;
2.父向子,父postMessage,子监听message;
3.测试发现,子向父postMessage的时候,源可以写为‘*’,父向子postMessage的时候,源需要写成子的源,(也就是子页面的协议+主机号+端口)

五、vForm表单渲染

<v-form-render :readonly="this.open? false : 'readonly'" :form-json="formJson" :form-data="formData" :option-data="optionData" ref="vFormRef">
</v-form-render>

六、外部链接

<template>
    <div class="app-container">
        <v-form-render :form-json="formJson" :form-data="formData" :option-data="optionData" ref="vFormRef"></v-form-render>
        <div slot="footer" class="dialog-footer">
            <el-button type="primary" @click="submitMyForm" :disabled="disabled">提 交</el-button>
            <el-button @click="close">重 置</el-button>
        </div>
    </div>
</template>

<script>
import {addEditQuest} from "@/api/dailyInfo";
import {queryQuestInfoById} from "@/api/questInfo";
import wx from 'weixin-js-sdk'
export default {
    name: 'AppList',
    data () {
        return {
            formJson: { 'widgetList': [], 'formConfig': { 'modelName': 'formData', 'refName': 'vForm', 'rulesName': 'rules', 'labelWidth': 80, 'labelPosition': 'left', 'size': '', 'labelAlign': 'label-left-align', 'cssCode': '', 'customClass': '', 'functions': '', 'layoutType': 'PC', 'onFormCreated': '', 'onFormMounted': '', 'onFormDataChange': '', 'onFormValidate': '' } },
            formData: {},
            optionData: {},
            formId: '',
            procKey: '',
            formName: '',
            disabled: false,
            // 查询参数
            queryParams: {
                pageNum: 1,
                pageSize: 10,
                name: null,
                defination: null,
                refProcKey: null,
                createName: null
            },
            // 表单参数
            form: { procKey: null, formId: null, formName: null, data: null },
            // 表单校验
            rules: {}
        }
    },
    created () {
        this.formId = this.$route.params.formId
        queryQuestInfoById(this.formId).then((response) => {
            console.log(response)
            this.$refs.vFormRef.setFormJson(JSON.parse(response.data.data.formJson))
            // this.procKey = response.refProcKey
            // this.formName = response.name
        })
    },
    methods: {
        // 取消按钮
        close () {
            this.$refs.vFormRef.resetForm()
            this.form = {}
            this.formData = {}
        },
        submitMyForm () {
            this.disabled = true;
            this.$refs.vFormRef.getFormData().then(formData => {
                this.form.data = JSON.stringify(formData)
                this.$refs.vFormRef.setFormData(JSON.parse(this.form.data))
                this.form.formJson = JSON.stringify(this.formJson)
                this.form.formData = JSON.stringify(JSON.parse(this.form.data))
                addEditQuest(this.form).then((response) => {
                    console.log(response)
                    if(response.data.code === 0){
                        this.$message({
                            type: 'success',
                            message: response.data.data
                        });
                    }else {
                        this.$message({
                            type: 'info',
                            message: response.data.data
                        });
                    }
                    this.disabled = false;
					// 推送小程序关闭方法
                    wx.miniProgram.navigateBack()
                })
            }).catch(error => {
                this.$message.error(error)
            })
        }
    }
}
</script>
<style>
.app-container{
    padding: 3vh 3vh;
}
</style>
(四)vForm 动态表单自定义组件、属性 本章节详细讲述了自定义字段组件及组件属性的方法,熟悉了源码中的功能文件,可以帮助我们应对不同的定制化需求。 阅读详情

相关推荐

(六)vForm 动态表单(数据量大,下拉选卡顿问题)

最近项目中使用动态表单遇到了卡顿的问题,打开一个表单就会卡顿,甚至有时候造成前端崩溃的情况。最终方案,前端分页处理。

刘一线的博客 1585

(一)vForm 动态表单设计器之使用

VForm是一款基于Vue 2/Vue 3的低代码表单,支持Element UI、iView两种UI库,定位为前端开发人员提供快速搭建表单、实现表单交互和数据收集的功能

刘一线的博客 1万+

vForm:这是一套通过json配置表单的工具。设计意愿是用户通过所见即所得编辑器生产业务表单

vForm 这是一套通过json配置表单的工具,包含。 TODO: 支持多语种切换 表单验证模块 input类的H5 form控件,自带基础校验 输出提示格式化 在控件中加入校验结果 输出结果支持多语言处理 设计器模块 表格模块Table 数据在格子的对齐方式:上中下、左中右 数据源加载 动态调整配置SetOptions 样式调整 onchange事件的监听绑入 跨表单数据提取 表格控件跨列(Colspan) 表格\控件的销毁重载 表格\控件的只读模式 控件开发 Select Date DateTime SelectGrid tree hyperlink 表单伸缩

基于vant封装的动态表单(VFrom使用教程)

vant-ui是属于vue开发移动端中用的比较多的一个组件库了,网上基于它的一些组件的二次封装也数不胜数,但是却都是零零散散,不成体系。总不能用一个就去找类似的封装吧,这样拼凑起来的也不是我们想要的。尤其,涉及众多表单业务的时候。

qq_34761385的博客 9783

vue-form-render:基于Vue 3.x,使用JSON模式快速生成自定义表单配置界面

Vue形式呈现 基于Vue 3.x,使用JSON Schema快速生成自定义表单配置界面。 例子 安装 npm i vue3-form-render --save vue3 form render依赖于从item.so进行渲染,因此在使用vue3 form render我们需要安装Ant Design of Vue并将其导入到我们的项目中: import { createApp } from 'vue' import App from './App.vue' import Antd from 'ant-design-vue' ; import 'ant-design-vue/dist/antd.css' ; const app = createApp ( App ) ; app . use ( Antd ) ; app . mount ( '#app' ) ; 简易演示 < temp

DMTF相关协议(一):Redfish和SMBIOS

Redfish 是一种管理标准,使用超媒体 RESTful 接口中的数据模型表示。该模型以标准的、机器可读的模式表示,消息的有效负载以 JSON 表示。该协议本身利用了 OData v4。由于它是一个超媒体 API,因此能够通过一致的接口表示各种实现。它具有管理数据中心资源、处理事件、长时间任务和发现的机制。

weixin_44032634的博客 2265

Vform低代码表单、表单生成器

Vform - 让表单开发变得简单Vform 是一个基于 Vue.js 的前端表单生成器,使用它可以通过可视化拖拽的方式快速构建出功能完备的表单。相比手写模板代码,它可以大大提高表单开发的效率和体验。

weixin_61665636的博客 4655

传感器采集信息的频率(采样频率)

较高的采集频率通常能提供更详细的信息,但也会增加数据处理和存储的负担。在某些应用中,较高的采样频率可能是必要的,而在其他情况下,则可能会选择适当的低采样频率以降低功耗和数据处理压力。传感器采集信息的频率(采样频率)是指传感器在一定时间内对输入信号进行采样的次数。对于一些需要快速检测和响应的应用,如运动传感器、声音传感器等,高采样频率是至关重要的。高采样频率通常需要更多的功耗和更大的存储容量,因为产生的数据量更大。例如,对于快速运动的对象,较低的采样频率可能无法捕捉到运动的真实轨迹。

chen的博客 5345

VForm动态表单组件设置和组件库的二次开发

VForm表单属性的新增和组件库新增组件的步骤

m0_61837007的博客 6421

【PMP认证考试之个人总结】第 4 章 项目范围管理

第 4 章 项目范围管理 4.1 综述   1.产品范围和项目范围的区别 ①产品范围:某项产品、服务或成果所具有的特性和功能; ②项目范围:为交付具有规定特性与功能的产品、服务或成果而必须完成的工作; 2.收集需求、定义范围和创建WBS输出的区别 ①收集需求 ===> 需求跟踪矩阵; ②定义范围 ===> 项目范围说明书;

qq296398300的博客 2892

Linux内核支持串口屏,linux串口触摸屏设计总结

Linux serial touch 设计总结概述:最近在做嵌入式linux下串口触摸屏设计,遇到一些问题,经过查找资料和请教同事,总算把问题解决了,事后有把linux相关的内核代码仔细看了一遍,为了有点成果,特别写了个总结。如有任何问题请联系yxj_5421@http://www.doczj.com/doc/87b94b1e227916888486d76d.html,转载请标明出处。系统资源:L...

weixin_39935903的博客 1297

【VForm3】扩展自定义表单组件

以下步骤均在extension文件夹中进行,新增完成后,Steps控件在自定义扩展字段中出现。配置属性扩展,extension-schema.js中,根据组件属性进行配置字段组件的类型名称,必须唯一,不能跟已有组件重复;且必须是新建组件的名称,例如组件名为steps-widget.vue,type必须为steps。i18通过type显示容器名称。需要在lang的en-US_extension.js和zh-CN_extension.js的widgetLabel中配置type对应的名称。

weixin_43385060的博客 5853

Cisco Packet Tracer实战:三层交换机链路聚合配置全流程(附常见错误排查)

本文详细解析了在Cisco Packet Tracer环境中配置三层交换机链路聚合的全流程,包括基础网络设置、LACP协议配置、路由协议集成及高级优化技巧。通过实战案例和常见错误排查指南,帮助网络工程师和CCNA备考学员掌握这一提升带宽利用率和实现链路冗余的核心技术。

grafana6viz的博客 230

Vue3中使用Vform3(自定义表单工具)

Vform的简单介绍和使用

huangzhixin1996的博客 1万+

解决MiGPT部署痛点:小米账号异地登录安全验证的解决方案

为让小米音箱更智能🤖,部署MiGPT时遇到小米账号异地登录验证问题,手动验证后仍无法解决。本文分享亲测有效的简化方案✨:通过浏览器F12获取passToken📝,手动创建mi.json配置文件并挂载到Docker容器,无需本地运行MiGPT,直接绕过异地验证,附完整操作步骤和问题排查指南。

XiaoqiangClub的博客 1445

ESM2蛋白预训练模型 蛋白质、氨基酸向量表示

参考: https://github.com/facebookresearch/esm https://huggingface.co/facebook/esm2_t33_650M_UR50D https://esmatlas.com/resources?action=fold tokenizer_对输入蛋白会头尾添加cls、eos特殊字符,占两个字符长度 参考:https://github.com/facebookresearch/esm 直接clone下来代码

weixin_42357472的博客 1万+

Vue+Element-UI 使用 Vform 表单设计器

6.2、触发点击事件 使用axios与WebApi接口交互 将设计好的表单 以json的字符串的形式 保存到后台数据库。2、后台.Net Core WebApi增删改查接口照常写 注意添加修改时要通过post,FromBody进行传参。6.3.2、使用 axios 调用 WebApi 接口对组件进行赋值 使用此方法。、如果想要把你存入到数据库中表单数据进行修改。6、将设计好的表单保存到数据库中。5、运行后的页面效果 托拉拽控件。6.3、使用Vform渲染页面。1、表单设计器基础字段建议。......

weixin_71933203的博客 6756

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

vue 可视化表单设计器 自定义组件

vue使用可视化编辑器设计表单,并自定义组件

jmszl1991的博客 8801

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

基于 Vue 3.x 的 Form render

github: vue form render 在线演示 简介 我们在写一些常规后台页面的时候,避免不了是需要经常和表单打交道。所以可以想偷懒的小伙伴可能会考虑有没有办法不去做表单工程师?用代码解决重复的人肉工作,没错,我们可以通过 JSON Schema 来描述我们的表单信息,这比重复的写表单控件可方便多了。 但是 JSON Schema 到表单的映射,则是需要我们去关注的,so… 业界有没有比较好的方案呢?答案是肯定的,比如以下几个表单渲染工具: Form Render Formliy … Form.

qq_32344993的博客 4972

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

vForm自定义组件说明

自定义组件 一、自定义组件说明 自定义组件包括vue文件和配置文件 配置文件格式: [ { type:"", 组件定义的名称 即组件vue文件 export default{ name:"" } 定义的名称 icon:"", 显示在widget-panel的组件图标,可以是iconfont图标或其他图标 plugin:true, 标记是自定义组件,这个为true就行了 formItemFlag:true, 标记显示fromItem options:{

JustinChia的博客 8008

【亲测免费】 VForm 开源项目安装与使用指南

本指南旨在帮助您快速了解并开始使用 [VForm](https://github.com/cretueusebiu/vform.git),一个高效且灵活的表单验证库。我们将通过三个主要部分深入理解项目结构、启动文件以及配置文件。 ## 1. **项目目录结构及介绍** VForm 的目录结构精心设计,以确保模块化和易于维护。以下是其基本结构概述: ```markdown vform/ ├──

gitblog_00955的博客 1141

vfrom表单设计器使用事件机制控制字段显示隐藏

依据 vform3.0开发者文档。

u014642921的博客 729

Vform3 功能扩展,组件及子组件复制导入

vform3组件按需导入和导出,页面之间组件的互导

咚咚博客 3222

(二)vForm 动态表单设计器之下拉、选择

动态表单下拉、选择等组件,大概率要使用数据库中的数据,那么vForm如何拿到数据库中的数据呢?跟随我的步骤,就能很快实现!到此就完成了下拉数据走后台接口的抽取,此方法适用单选radio,多选checkbox,等需要后台拉去数据的,都可以使用和借鉴。(一)vForm 动态表单设计器之使用。

刘一线的博客 1646

关于扩展自定义表单Vform3

关于使用自定义表单Vform3的一些事情

huangzhixin1996的博客 8161
上一篇: echarts实现-百度山西省热力图-标点显示天气信息
下一篇: 【尚硅谷】IDEA2022快速上手开发利器
智汇风渔AI小白
博客等级 码龄7年 1万+粉丝 179原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智汇风渔AI小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值