【问题标题】:React updating props with state data使用状态数据响应更新道具
【发布时间】:2016-12-09 06:32:56
【问题描述】:

我有一个组件正在处理来自用户的联系论坛提交。我想获取用户提交的状态并将其添加到我的道具数据中。现在一切正常,但是 handleSubmit,我不确定如何获取状态并将其传递给我的 this.data.props 以更新数据以包含新对象。

我的数据是一个对象数组。状态接受用户输入并自行更新。接下来我要获取状态对象并将其添加到我的 props.data 中,然后将其显示在屏幕上。

编辑:使用最新代码更新

import React, { Component, PropTypes } from 'react';


const testData = [
    {
        name: 'Joe',
        email: 'joemail'
    },

    {
        name: 'Bill',
        email: 'billmail'
    },

    {
        name: 'Dude',
        email: 'dudemail'
    }
]

class FormContact extends Component {
    constructor(props) {
        super(props)
        this.state = {
            formValues: {
                name: '',
                email: ''
            }
        }
    }

    handleChange(event) {
        let formValues = this.state.formValues;
        let name = event.target.name;
        let value = event.target.value;

        formValues[name] = value;
        this.setState({
            formValues
        });
    }

    handleSubmit(event) {
        event.preventDefault();
        console.log("NEW FORM VALUES " + this.state.formValues.name + " " + this.state.formValues.email);
        const {name, email} = this.state.formValues
        this.props.addContact({name, email});
    }

    render() {      
        return (
            <form onSubmit={this.handleSubmit.bind(this)}>
               <label> Name:
                   <input type="text" name="name" placeholder="Name" value={this.state.formValues["name"]} onChange={this.handleChange.bind(this)} />
               </label><br />
               <label> Email:
                   <input type="text" name="email" placeholder="Email" value={this.state.formValues["email"]} onChange={this.handleChange.bind(this)}/>
               </label><br />
                   <input className="btn btn-primary" type="submit" value="Submit" />
          </form>
        )
    }
}

FormContact.PropTypes = {
    data: PropTypes.arrayOf(
        PropTypes.object
    )
}

FormContact.defaultProps = {
    data: testData
}

class Contact extends Component {
    constructor(props) {
        super(props)
        this.state = {
            data: testData
        }
    }

     addContact(contact) {
         this.setState({data: this.state.data.concat(contact)});
     }


    render() {
        const renObjData = this.props.data.map( (anObjectMapped, index) => {
            return (<p key={index}>
                        Name: {anObjectMapped.name} < br/>
                        Email: {anObjectMapped.email} <br /></p>
            )
        });
        return (
            <div>
                <h1>CONTACT PAGE</h1>
            <FormContact data={this.state.data} addContact={this.addContact.bind(this)} />
                {renObjData}
            </div>
        )
    }
}


Contact.PropTypes = {
    data: PropTypes.arrayOf(
        PropTypes.object
    )
}

Contact.defaultProps = {
    data: testData
}


export default Contact;

【问题讨论】:

    标签: reactjs state forum


    【解决方案1】:

    您在这里看到的是有一个父容器,它将data 作为道具传递给表单组件。你已经有了Contact 组件,所以你可以让它保持数据状态。

    它的工作原理是您将在名为addContact 的联系人组件上编写一个函数,它将联系人作为参数,然后使用新联系人设置自己的状态 IE 通过设置将其连接到自己的数据数组状态。

    class Contact extends React.Component {
        constructor() {
          super();
          this.state = {
            data: testData
          }
        }
    
    
       addContact = (contact) => {
         this.setState({data: this.state.data.concat(contact)});
       };
    
    
    
      render() {
        const contacts = _.map(this.state.data, (value, index) => {
          return <li key={index + value}> {value.email}  {value.name} </li>
        })
        return (
         <div>
           <h1>CONTACT PAGE</h1>
           <FormContact data={this.state.data} addContact={this.addContact} />
           <h3> Contacts</h3>
           <ul>{contacts} </ul>
         </div>
       )
      }
    }
    

    然后在你的handleSubmit函数中你所要做的就是添加

    handleSubmit(event) {
      event.preventDefault();
      const {name, email} = this.state.formValues
      this.props.addContact({name, email})
    }
    

    这会将其推送到父组件中的数据数组中,然后一旦父组件更新,它将作为道具向下传递给表单组件。

    这是一个代码笔,显示了所有这些。 http://codepen.io/finalfreq/pen/VKPXoN

    更新:还在联系人中添加了如何显示数据,您可以轻松地将 lodash _.map 替换为 this.state.data.map(function(value, index)

    【讨论】:

    • 数据似乎在 this.setState({data: this.state.data.concat(contact)});
    • 必须添加 this.addContact.bind(this) 现在它正确指向数据。它现在将数据添加到我的对象数组但不更新屏幕上的打印值 - 只显示前 3 个联系人,而我添加的没有任何新联系人
    • 你能用最新的代码更新你的帖子,以便看看
    • const renObjData = this.props.data.map( (anObjectMapped, index) =&gt; { 那必须是this.state.data.map 而不是道具
    猜你喜欢
    • 1970-01-01
    • 2020-06-19
    • 2020-07-26
    • 2022-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    相关资源
    最近更新 更多