You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何构建依赖JSON数据的编辑表单(支持GET/POST交互)

实现支持两种数据类型的动态预填充编辑表单

嘿,我来帮你搞定这个需要根据API返回数据动态渲染的编辑表单!下面是完整的实现方案,包含从API拉取数据预填充、动态渲染对应字段,以及提交表单的全部逻辑。

核心实现思路

  • 页面加载完成后,立刻调用GET /getformdata接口获取表单初始数据
  • 根据返回数据里的mytype字段(articleeventlisting),渲染对应类型的表单字段
  • 把API返回的字段值自动填充到表单对应的输入框里
  • 监听提交按钮的点击事件,收集表单数据后发起POST请求提交修改

完整代码示例(HTML + JavaScript)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>动态编辑表单</title>
    <style>
        .form-group { margin: 1rem 0; }
        label { display: block; margin-bottom: 0.5rem; }
        input, textarea { width: 100%; padding: 0.5rem; box-sizing: border-box; }
        button { padding: 0.5rem 1.5rem; background: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer; }
    </style>
</head>
<body>
    <div id="form-container"></div>
    <button id="submit-btn" style="margin-top: 1rem;">提交修改</button>

    <script>
        // 页面加载完成后获取表单数据
        document.addEventListener('DOMContentLoaded', async () => {
            try {
                // 调用GET接口获取数据
                const response = await fetch('/getformdata');
                const formData = await response.json();
                
                // 根据mytype渲染对应表单
                renderForm(formData);
            } catch (error) {
                console.error('获取表单数据失败:', error);
                alert('加载表单数据出错,请稍后重试');
            }
        });

        // 渲染表单函数
        function renderForm(data) {
            const container = document.getElementById('form-container');
            container.innerHTML = '';

            // 通用的title字段
            const titleGroup = createFormGroup('title', '标题', data.title);
            container.appendChild(titleGroup);

            // 根据mytype渲染专属字段
            if (data.mytype === 'article') {
                // Article类型的字段
                const bodyGroup = createFormGroup('body', '内容', data.body, 'textarea');
                const authorGroup = createFormGroup('author', '作者', data.author);
                const latGroup = createFormGroup('Latitude', '纬度', data.Latitude);
                const lngGroup = createFormGroup('Longitude', '经度', data.Longitude);
                const dateGroup = createFormGroup('Startdate', '开始日期', data.Startdate, 'date');

                container.appendChild(bodyGroup);
                container.appendChild(authorGroup);
                container.appendChild(latGroup);
                container.appendChild(lngGroup);
                container.appendChild(dateGroup);
            } else if (data.mytype === 'eventlisting') {
                // Event类型的字段(这里可以根据需求扩展更多字段)
                // 目前用户给出的示例只有title,若有其他字段可在这里添加
                console.log('渲染活动列表类型表单');
            }

            // 隐藏存储mytype的字段,提交时一起发送
            const typeInput = document.createElement('input');
            typeInput.type = 'hidden';
            typeInput.name = 'mytype';
            typeInput.value = data.mytype;
            container.appendChild(typeInput);
        }

        // 创建表单组的工具函数
        function createFormGroup(name, labelText, value, type = 'text') {
            const group = document.createElement('div');
            group.className = 'form-group';

            const label = document.createElement('label');
            label.htmlFor = name;
            label.textContent = labelText;
            group.appendChild(label);

            let input;
            if (type === 'textarea') {
                input = document.createElement('textarea');
                input.rows = 5;
            } else {
                input = document.createElement('input');
                input.type = type;
            }
            input.name = name;
            input.value = value || '';
            group.appendChild(input);

            return group;
        }

        // 提交表单逻辑
        document.getElementById('submit-btn').addEventListener('click', async () => {
            const formElements = document.querySelectorAll('#form-container input, #form-container textarea');
            const submitData = {};

            // 收集表单数据
            formElements.forEach(el => {
                submitData[el.name] = el.value;
            });

            try {
                // 发起POST请求提交数据
                const response = await fetch('/your-post-api-url', { // 替换成实际的POST接口地址
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json',
                    },
                    body: JSON.stringify(submitData),
                });

                if (response.ok) {
                    alert('提交成功!');
                    // 可以在这里添加提交后的逻辑,比如刷新页面或跳转
                } else {
                    alert('提交失败,请稍后重试');
                }
            } catch (error) {
                console.error('提交表单失败:', error);
                alert('提交时出现错误,请检查网络连接');
            }
        });
    </script>
</body>
</html>

关键细节说明

  • 动态字段渲染:通过判断mytype的值,只渲染对应类型需要的字段,避免显示无关内容
  • 数据预填充:利用工具函数createFormGroup自动把API返回的值填充到对应控件里,不用手动一个个赋值
  • 提交处理:用fetch API发送JSON格式的POST请求,记得设置Content-Type: application/json,确保后端能正确解析数据
  • 错误处理:在GET和POST请求里都加了异常捕获,避免页面因为请求失败直接崩溃,还能给用户友好的提示

内容的提问来源于stack exchange,提问作者Trewq

火山引擎 最新活动