最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • [动态表单 jformer] 实现表单数据获取和表单提交

    正文概述 掘金(她的哥)   2021-01-05   413

    jformer 是一个动态表单呈现组件,只需要传递 json 数据就可以显示出界面和功能,使用 jformer 实现表单数据获取和提交有两种方法

    方法 1

    数据从动态表单组件外部读取,并将结果赋给表单的 v-model,提交时也从外部处理发起请求,动态表单只负责视图呈现和交互逻辑

    html 页面

    实现一个动态表单呈现,读取表单配置和数据

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <meta http-equiv="X-UA-Compatible" content="ie=edge" />
        <title>JFormer 表单</title>
        <script src="https://cdn.jsdelivr.net/npm/vue"></script>
        <script src="https://cdn.jsdelivr.net/npm/jformer"></script>
        <script src="https://cdn.jsdelivr.net/npm/element-ui/lib/index.js"></script>
        <link
          rel="stylesheet"
          href="https://cdn.jsdelivr.net/npm/element-ui/lib/theme-chalk/index.css"
        />
      </head>
      <body>
        <div id="app">
          <j-former v-model="model" v-bind:config="config"></j-former>
          <el-button type="primary" @click="submit">提交</el-button>
        </div>
        <script>
          new Vue({
            data() {
              return {
                model: {},
                config: {}
              };
            },
            methods: {
              submit() {
                // 提交表单数据
                fetch("<url>", {
                  method: "POST",
                  body: JSON.stringify(this.model)
                });
              }
            },
            async mounted() {
              const loading = this.$loading();
              try {
                // 读表单配置
                this.config = await (await fetch("./config1.json")).json();
                // 读数据
                this.model = await (await fetch("./data.json")).json();
              } finally {
                loading.close();
              }
            }
          }).$mount("#app");
        </script>
      </body>
    </html>
    

    表单配置和数据

    config1.json 文件定义

    {
      "fields": [
        {
          "component": "el-form",
          "fieldOptions": { "props": { "labelWidth": "120px" } },
          "children": [
            {
              "component": "el-form-item",
              "fieldOptions": { "props": { "label": "输入1" } },
              "children": [{ "component": "el-input", "model": ["text1"] }]
            },
            {
              "component": "el-form-item",
              "fieldOptions": { "props": { "label": "选择" } },
              "children": [
                {
                  "component": "el-select",
                  "model": ["selected"],
                  "children": [
                    {
                      "component": "el-option",
                      "fieldOptions": { "props": { "label": "选项1", "value": 1 } }
                    },
                    {
                      "component": "el-option",
                      "fieldOptions": { "props": { "label": "选项2", "value": 2 } }
                    }
                  ]
                }
              ]
            }
          ]
        }
      ]
    }
    

    data.json 表单数据

    {
      "text1": "ssssss",
      "selected": 1
    }
    

    完整示例
    预览效果

    方法 2

    完全利用动态表单定义实现整个逻辑

    jformer 提供数据源功能用来实现与远程数据的交互,其中 request 类型的数据源是一个 fetch 请求,用来从服务端获取数据和发送数据

    通过 request 数据源从服务端读取数据,利用监听功能监听数据读取的结果,更新表单内部数据 (model) 的值,提交的时候也通过 request 数据源向服务端发送数据 (model)

    html 页面

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <meta http-equiv="X-UA-Compatible" content="ie=edge" />
        <title>JFormer 表单</title>
        <script src="https://cdn.jsdelivr.net/npm/vue"></script>
        <script src="https://cdn.jsdelivr.net/npm/jformer"></script>
        <script src="https://cdn.jsdelivr.net/npm/element-ui/lib/index.js"></script>
        <link
          rel="stylesheet"
          href="https://cdn.jsdelivr.net/npm/element-ui/lib/theme-chalk/index.css"
        />
      </head>
      <body>
        <div id="app">
          <j-former v-bind:config="config"></j-former>
        </div>
        <script>
          new Vue({
            data() {
              return {
                config: {}
              };
            },
            async mounted() {
              this.config = await (await fetch("./config2.json")).json();
            }
          }).$mount("#app");
        </script>
      </body>
    </html>
    

    表单配置和数据

    {
      "datasource": {
        // request 类型的数据源
        // 数据获取
        "formData": { "type": "request", "url": "./data.json", "autoload": true },
        
        // request 类型的数据源
        // 数据提交
        "formSubmit": {
          "type": "request",
          "url": "url",
          "method": "POST",
          "data": "$:JSON.stringify(model.data)"
        }
      },
      "listeners": [
        {
          // 监听数据获取的数据源数据
          // 将数据赋给 model 的 data 属性
          "watch": "datasource.formData.data",
          "actions": [{ "handler": "@data:datasource.formData.data" }]
        }
      ],
      "fields": [
        {
          "component": "el-form",
          "fieldOptions": { "props": { "labelWidth": "120px" } },
          "children": [
            {
              "component": "el-form-item",
              "fieldOptions": { "props": { "label": "输入1" } },
              "children": [{ "component": "el-input", "model": ["data.text1"] }]
            },
            {
              "component": "el-form-item",
              "fieldOptions": { "props": { "label": "选择" } },
              "children": [
                {
                  "component": "el-select",
                  "model": ["data.selected"],
                  "children": [
                    {
                      "component": "el-option",
                      "fieldOptions": { "props": { "label": "选项1", "value": 1 } }
                    },
                    {
                      "component": "el-option",
                      "fieldOptions": { "props": { "label": "选项2", "value": 2 } }
                    }
                  ]
                }
              ]
            },
            {
              "component": "el-button",
              "text": "提交",
              "fieldOptions": {
                "props": { "type": "primary" },
                // 数据源的数据和方法都可以在表达式里直接使用
                "on": { "click": "@:datasource.formSubmit.load()" }
              }
            }
          ]
        }
      ]
    }
    

    data.json 数据

    {
      "text1": "ssssss",
      "selected": 1
    }
    

    完整示例
    预览效果

    相关链接

    设计器:Github Gitee

    动态表单:Github Gitee

    数据源、监听、转换表达式具体定义参考 文档


    起源地下载网 » [动态表单 jformer] 实现表单数据获取和表单提交

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元