【问题标题】:Rendering a form dynamically in react在反应中动态呈现表单
【发布时间】:2019-09-21 15:33:08
【问题描述】:

我已经编写了基于功能的组件,我正在检查开关盒中的类型,这取决于我在此处创建表单的类型

const component = (props) => {
    let renderObject = null
    let obj;
    const renderdata = () =>{
        console.log(props);
        obj = Object.keys(props.todoprop).map((todoproprties) =>{
            console.log("here we are looking at the data" , props.todoprop[todoproprties])
            let toDoProprties = props.todoprop[todoproprties]
             switch(props.todoprop[todoproprties].type){
                 case 'text':
                     return <input type="text"  key="1"  value={toDoProprties.value}  name = {toDoProprties.name} onChange={props.handleChange} />
                 case 'date':
                     return  <input type="date" key="2" value={toDoProprties.value}  onChange={props.handleChange}/>
                 default:
                    return <textarea rows="10" key="3" cols="30"  rows="10" cols="30"   value={toDoProprties.value} onChange={props.handleChange}/>

             }

        })
    }


    return (
        <div>
            <h1>Hello from component </h1>
            {renderdata()}
            <div className="card">
             <div className="card-body">
              <div>
              {obj}
              <button type="submit" onClick={props.handleSubmit}>Submit</button>
              </div>
             </div>
             </div>
            {console.log(props)}

        </div>
    );

    }
export default component;

下面是渲染我的组件的容器

class container extends Component {
    state = {
        // how i want my data to look  with  a heading with date proprtey and a description
        heading: '',
        date: '',
        description: '', 
        Todo: {
            heading: { type: "text", value: "", placeholder: 'plese enter heading', name:"heading"},
            date: { type: "date", value: "", placeholder: "plese enter date", name: "date" },
            description: {  value: "PLESE DESIGN A GOOD TODO",  placeholder: 'plese enter description',  name: "description"}
        }
    }

    onChangeHandler = (event) =>{
        console.log(event.value)
        this.setState({
            [event.target.name] : event.target.value
        })
        // this.setState({Todo.heading.value: event.target.value })
    }

    onSubmitHandler = () =>{

        console.log("you have succesfully clicked the handler")
        console.log("you are seeing the state" ,this.state.heading);
        console.log("you are seeing the description", this.state.description)
    }

    render() {
        var dataPassingHandler = () => {
            return (<div>
                <Dynamiccomponent  todoprop={this.state.Todo}   handleChange={this.onChangeHandler}  handleSubmit={this.onSubmitHandler}/>
            </div>
            )
        }

        return (
            <div>
                {dataPassingHandler()}
            </div>
        )
    }
}


export default container;

1) 在我的容器中,我正在渲染组件,我正在将类型传递给容器,我正在检查 switch case 我正在创建表单

2)我被困在这里有两个问题第一个是如何通过 onChange ,

3)其次如何处理onclick并在容器状态下创建一个新对象

【问题讨论】:

  • 有什么问题?你的表格正确吗?
  • 我无法在我的输入字段中输入任何内容
  • 为什么会有复杂的 Todo 状态?不能直接有Todo数组吗?
  • 是的,但我想学习(我是新来的反应)第一次尝试我使用数组接下来我想尝试如果给定对象类型如何提取数据然后我继续流程(我忘了改变我教它的工作并继续)
  • 一切都好,我只想知道如何动态添加待办事项的状态并使 onChange 工作

标签: reactjs forms


【解决方案1】:

您无法输入,因为您已绑定来自Todo 对象的值,

<input type="text"  key="1"  value={toDoProprties.value}  name = {toDoProprties.name} onChange={props.handleChange} />

但您并没有在此处更改 Todo 对象中的值,

onChangeHandler = (event) =>{
    console.log(event.value)
    this.setState({
       [event.target.name] : event.target.value
    })
    // this.setState({Todo.heading.value: event.target.value })
}

上面的 change handler 只是改变 state 变量,直接在 state 中可用。但是你需要改变Todo对象中的值,你可以这样做,

onChangeHandler = (event) => {
   //let's take name and value in a variable so that it can be accesiable in complex state updation
   let name = event.target.name;
   let value = event.target.value;

   //This is the object from Todo which needs to be updated
   let updatedTodo = this.state.Todo[name];

   //this is the functional setState, which take's previous state value to calculate the next state
   this.setState(prevState => ({
       Todo: { ...prevState.Todo, [name]: {...updatedTodo, value: value} }
   }))
}

现在您的输入完全受控,您可以输入。

您还需要在您的Dynamiccomponent 中进行一些更改。对于更改,您可以将您的代码与此演示进行比较,

Demo

注意:在这里做一些笔记。

  1. 在反应组件名称应该在PascalCase。例如,Dynamiccomponent 应该是 DynamicComponentcontainer 应该是 Container 等等。
  2. 在您创建动态输入的组件中,您应该为每个输入/文本提供 name,以便您的 onChange 处理程序顺利运行。

【讨论】:

  • @venkatesh,了解functional setState 的工作原理。您可以在互联网上搜索。
  • 谢谢它正在工作,但如果我在 onchange 之后更改所有三个我可以在 console.log 中看到的东西,我想我错过了一些东西,你能帮我吗,或者我在正确的路径中跨度>
  • @m.dvenkatesh,而不是this.state.Todo.proptype,你应该使用this.state.Todo[proptype]。这里prototype是动态key,动态key需要使用[]访问。
  • 是的,但来自另一个帐户,因为他们阻止了这些帐户,我会给你链接
  • 知道了,我没有返回(意味着不保存)更新后的状态(在 this.SetState 中)所以组件没有呈现
猜你喜欢
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-11
  • 1970-01-01
  • 2020-10-10
相关资源
最近更新 更多