在 React 中渲染动态输入字段

Posted

技术标签:

【中文标题】在 React 中渲染动态输入字段【英文标题】:Rendering a dynamic input field in React 【发布时间】:2016-11-23 23:18:09 【问题描述】:

我在这里有一个测验表格,我想在用户单击“添加问题”按钮时为问题添加输入字段。

我一直在玩弄代码,并且能够用一些文本填充状态对象。显然,目标是让它成为一个输入组件,然后以某种方式将其渲染到屏幕上。

我正在苦苦挣扎的是如何将实际元素呈现到页面上。我知道它是在组件的渲染方法中完成的,只是不确定如何。

我想我已经接近了。任何帮助,将不胜感激。代码如下。

谢谢!

 var QuizForm = React.createClass(
        getInitialState : function() 
            return  questions : [] 
        ,
        createQuestion : function() 

        this.state.questions.push("Test");

        // Adds "Test" to state object. 
        this.setState(
            questions : this.state.questions
        );
    ,
    render : function() 
        return (
            <div className="quiz-form well text-center">
                <h1 className="header text-center">Quiz Form</h1>
                <ul>
                    /* Would like question inputs to show up here */
                </ul>
                <button onClick=this.createQuestion className="add-question-btn btn btn-primary" style= marginTop : 40 >Add Question</button>
            </div>    
        );
    

【问题讨论】:

【参考方案1】:

只需将您的 this.state.questions 数组映射到您想要的 html 元素。

例如,如果你想渲染&lt;li&gt; 元素:

render : function() 
    return (
        <div className="quiz-form well text-center">
            <h1 className="header text-center">Quiz Form</h1>
            <ul> // magic happens now
                this.state.questions.map(function(state) 
                   return <li>state</li>
                )
            </ul>
            <button onClick=this.createQuestion 
               className="add-question-btn btn btn-primary" 
               style= marginTop : 40 >Add Question</button>
        </div>    
    );

见an example。


如果你想渲染&lt;input&gt;标签,你可以使用上面相同的技术,但要注意the fact that React treats it as a controlled component。

【讨论】:

【参考方案2】:

React 的最佳实践是将 state.questions 数组映射到动态生成的 HTML 组件,例如:

    render : function() 
    return (
        <div className="quiz-form well text-center">
            <h1 className="header text-center">Quiz Form</h1>
            <ul> // magic happens now
                this.state.questions.map(function(state) 
                   return <li key=state.someId>state.question</li>
                )
            </ul>
            <button onClick=this.createQuestion 
               className="add-question-btn btn btn-primary" 
               style= marginTop : 40 >Add Question</button>
        </div>    
    );

请记住,在 React 中映射和渲染动态对象时,最好为每个映射对象插入一个键。因此,请确保在创建内容时创建它。

最好的问候,

【讨论】:

以上是关于在 React 中渲染动态输入字段的主要内容,如果未能解决你的问题,请参考以下文章

React:动态添加输入字段到表单

Reactjs - 在动态元素渲染中添加 ref 到输入

React - 以动态形式输入 1 个字符后输入失去焦点

动态计算输入值 - React

React Formik 中的动态输入字段

通过 React 中的输入元素更新对象中的嵌套状态