使用reactjs中的json数据创建动态HTML

时间:2017-03-07 07:34:10

标签: json forms reactjs dynamic

我有以下json数据和动态填充数据的反应代码

var DATA = [{"processList":
[{"processId":"1","processName":"Process1","htmlControlType":"radio","cssClassName":"radio"},
{"processId":"2","processName":"Process2","htmlControlType":"radio","cssClassName":"radio"}],
"processIndexList":
[{"processId":"1","indexId":"1","indexDesc":"First Name","htmlControlType":"textbox","cssClassName":"form-control"},{"indexId":"2","indexDesc":"Last Name","htmlControlType":"textbox","cssClassName":"form-control"}]}];

renderProcessList: function () {

    const data = DATA;
    return data[0].processList.map(group => {
        return <div className={group.cssClassName}>
                    <label><input type={group.htmlControlType} name="processOptions"/>{group.processName}</label>
                </div>
    });

},

renderProcessData: function () {

    const data = DATA;
    return data[0].processIndexList.map(group => {
        return <div>
                    <label>{group.indexDesc}</label>
                  <input type={group.htmlControlType} className={group.cssClassName} placeholder=""/>
                  <br/>
        </div>
    });

},

截至目前,表单已根据json数据显示,但我想根据进程列表中的用户选择显示表单 例如:如果用户选择Process1单选,则需要在收音机下方显示名字文本框,用户选择进程2,然后需要显示姓名文本框。

有谁能告诉我如何在reactjs中做到这一点?

1 个答案:

答案 0 :(得分:0)

要完成任务,您必须执行以下三个步骤:

  1. 处理无线电输入点击。
  2. 将选定的进程ID存储在状态中。
  3. 根据所选ID(a.k.a.过滤)显示进程列表项。
  4. 请注意,您错过了在processId对象中添加processIndexList[1]属性。

    另请注意,在下面的示例中,我在renderProcessData()中使用基本过滤。

    由于问题的作者请求,我在ES5,ES6中实现了该示例。请记住,在这两个示例中我使用的是JSX,因此您需要一个编译器工具(例如Babel)。一旦使用编译器,就可以使用最新的JS功能。请修改您使用ES5的选择。

    ES6

    var DATA = [{
        "processList": [{
                "processId": "1",
                "processName": "Process1",
                "htmlControlType": "radio",
                "cssClassName": "radio"
            },
            {
                "processId": "2",
                "processName": "Process2",
                "htmlControlType": "radio",
                "cssClassName": "radio"
            }
        ],
        "processIndexList": [{
            "processId": "1",
            "indexId": "1",
            "indexDesc": "First Name",
            "htmlControlType": "textbox",
            "cssClassName": "form-control"
        }, {
            "processId": "2",
            "indexId": "2",
            "indexDesc": "Last Name",
            "htmlControlType": "textbox",
            "cssClassName": "form-control"
        }]
    }];
    
    
    
    class App extends React.Component {
    
        constructor(props) {
            super(props);
    
            this.state = {
                selectedProcessID: null
            };
        }
    
        setProcessID(e) {
            this.setState({
                selectedProcessID: e.target.value
            });
        }
    
        renderProcessList() {
            const data = DATA;
    
            return data[0].processList.map( group => {
                return <div className={group.cssClassName}>
                    <label><input
                        value={group.processId}
                        onClick={this.setProcessID.bind(this)}
                        type={group.htmlControlType}
                        name="processOptions"/>{group.processName}</label>
                </div>
            });
    
        }
    
        renderProcessData() {
            // Display process data, only if there is already
            // selected process ID
            if ( ! this.state.selectedProcessID) return;
    
            const data = DATA;
    
            return data[0].processIndexList.map( group => {
                // Display process list items for the selected process ID.
                // The filtering can be implemented performance better with a library (lodash for example).
                // Current implementation is enough for the SO demo. 
                if (group.processId !== this.state.selectedProcessID) return;
    
                return <div>
                    <label>{group.indexDesc}</label>
                    <input type={group.htmlControlType} className={group.cssClassName} placeholder=""/>
                    <br/>
                </div>
            });
    
        }
    
        render() {
            return <div>
                {this.renderProcessList()}
                {this.renderProcessData()}
            </div>
        }
    }
    
    ReactDOM.render(<App />, document.getElementById('container'));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
    <div id="container"></div>

    ES5

    var DATA = [{
        "processList": [{
                "processId": "1",
                "processName": "Process1",
                "htmlControlType": "radio",
                "cssClassName": "radio"
            },
            {
                "processId": "2",
                "processName": "Process2",
                "htmlControlType": "radio",
                "cssClassName": "radio"
            }
        ],
        "processIndexList": [{
            "processId": "1",
            "indexId": "1",
            "indexDesc": "First Name",
            "htmlControlType": "textbox",
            "cssClassName": "form-control"
        }, {
            "processId": "2",
            "indexId": "2",
            "indexDesc": "Last Name",
            "htmlControlType": "textbox",
            "cssClassName": "form-control"
        }]
    }];
    
    
    
    var App = React.createClass({
    
        getInitialState() {
            return {
                selectedProcessID: null
            }
        },
    
        setProcessID: function(e) {
            this.setState({
                selectedProcessID: e.target.value
            });
        },
    
        renderProcessList: function() {
            const data = DATA;
    
            return data[0].processList.map( group => {
                return <div className={group.cssClassName}>
                    <label><input
                        value={group.processId}
                        onClick={this.setProcessID.bind(this)}
                        type={group.htmlControlType}
                        name="processOptions"/>{group.processName}</label>
                </div>
            });
    
        },
    
        renderProcessData: function() {
            // Display process data, only if there is already
            // selected process ID
            if ( ! this.state.selectedProcessID) return;
    
            const data = DATA;
    
            return data[0].processIndexList.map( group => {
                // Display process list items for the selected process ID.
                // The filtering can be implemented performance better with a library (lodash for example).
                // Current implementation is enough for the SO demo. 
                if (group.processId !== this.state.selectedProcessID) return;
    
                return <div>
                    <label>{group.indexDesc}</label>
                    <input type={group.htmlControlType} className={group.cssClassName} placeholder=""/>
                    <br/>
                </div>
            });
    
        },
    
        render: function() {
            return <div>
                {this.renderProcessList()}
                {this.renderProcessData()}
            </div>
        }
    });
    
    ReactDOM.render(<App />, document.getElementById('container'));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
    <div id="container"></div>