反应是编辑所有数组对象,而不是只编辑一个数组对象

时间:2019-09-16 20:39:11

标签: reactjs

当前,用户可以输入名字,姓氏和员工ID。提交时,它将渲染具有第一个,最后一个和员工ID的员工迭代。

问题是当您单击“编辑”时,它会编辑数据,但会编辑雇员迭代中每个对象的所有字段。

如何修复代码,以便在迭代中仅编辑该特定对象。

主页组件

........
class Login extends Component {
  constructor(props) {
    super(props);
    this.state = {
      activeTab: '3',
      firstName: '',
      lastName: '',
      employeeID: '',
      employees: [],
      Edit: false,
      updatedFirst: '',
      updatedLast:'',
      updatedEmployeeID: ''
    };
  }
  toggle = (tab) => {
    if(this.state.activeTab !== tab){
      this.setState({
        activeTab: tab
      })
    }
  }
  onSubmit = (e) => {
      e.preventDefault();
      const {firstName, lastName, employeeID} = this.state
      const ourForm ={
          firstName: firstName,
          lastName: lastName,
          employeeID: employeeID,
        // we need an id to so that it can be edited properly
      }
      this.setState({
          employees: [...this.state.employees,ourForm]
      }, () => {
          console.log(this.state.employees)
      })
  }
  onChange = (e) => {
      e.preventDefault()
    // e.preventDefault();
    this.setState({
        [e.target.name]: e.target.value,
    });
  }
  updatedChange = (e) => {
    e.preventDefault()
  // e.preventDefault();
    this.setState({
        [e.target.name]: e.target.value,
    });
  }

  onEdit = (e) => {
      e.preventDefault();
      this.setState({
          Edit: !this.state.Edit
      })
  }

  onReset = (e) => {
      e.preventDefault();
      this.setState({
          firstName: '',
          lastName: '',
          employeeID: ''
      })
  }
  render(){
    return (
            ......
                <MyForm 
                    onSubmit={this.onSubmit} 
                    onChange={this.onChange}
                    onReset={this.onReset}
                    firstName={this.state.firstName}
                    lastName={this.state.lastName}
                    employeeID={this.state.employeeID}
                    />
              </Col> 
            </Row>
          </TabPane>
        </TabContent>
        </Container>

        <List
            employees={this.state.employees}
            Edit={this.state.Edit}
            onEdit ={this.onEdit}
            onChange={this.onChange}
            updatedEmployeeID={this.state.updatedEmployeeID}
            updatedFirst={this.state.updatedFirst}
            updatedLast={this.state.updatedLast}
            />
      </div>
    );
  }
}
export default Login;

Form.js

import React, {Component} from 'react';
import { Col, Form, FormGroup, Label, Input, Button } from 'reactstrap';
const MyForm = (props) => {
    return(
        <Form style={{ margin: '30px 0px'}}>
        <FormGroup row>
          <Label for="firstName"  sm={2} size="sm">First Name:</Label>
          <Col sm={10}>
            <Input type="text" onChange={props.onChange} value={props.firstName} name="firstName" id="exampleEmail" placeholder="Enter First Name"/>
          </Col>
        </FormGroup>
        <FormGroup row>
          <Label for="lastName" sm={2} size="sm">Last Name:</Label>
          <Col sm={10}>
            <Input type="text" onChange={props.onChange} value={props.lastName} name="lastName" id="exampleEmail2" placeholder="Enter Last Name" />
          </Col>
        </FormGroup>
        <FormGroup row>
          <Label for="Employee ID" sm={2} size="sm">Employee ID:</Label>
          <Col sm={5}>
            <Input type="text" onChange={props.onChange} value={props.employeeID} name="employeeID" id="exampleEmail2" placeholder="Enter Employee ID" />
          </Col>
        </FormGroup>
        <FormGroup row>
            <Col sm={12}>
                <div className="float-right">
                    <Button onClick={props.onSubmit} size="lg" style={{ margin: '0px 5px'}} color="secondary">Add</Button> 
                    <Button onClick={props.onReset} size="lg"  style={{ margin: '0px 5px'}}color="warning">Reset</Button>
                </div>
            </Col>
        </FormGroup>
        <hr></hr>
        <FormGroup row>
            <Col sm={4}>
                <Input type="text"  name="search" id="exampleEmail2" placeholder="Search" />   
            </Col>

            <Col sm={8}>
                <Label for="sort" sm={2} size="sm">Sort:</Label>
                <Button onClick={props.onSubmit} size="lg" style={{ margin: '0px 5px'}} color="secondary">First Name</Button>   
                <Button onClick={props.onSubmit} size="lg" style={{ margin: '0px 5px'}} color="secondary">Last Name</Button>  
                <Button onClick={props.onSubmit} size="lg" style={{ margin: '0px 5px'}} color="secondary">ID</Button>  
            </Col>


        </FormGroup>
      </Form>
    )
}
export default MyForm;

列出组件

import React, {Component, Fragment} from 'react';
import { Col, Form, FormGroup, Label, Input, Button } from 'reactstrap';

const List = (props) => {
    return(
        <Fragment>
        {props.employees.map( (item, i) => (
            <div style={{ margin: '40px 0px'}} key={i}>
                <hr style={{ border:'1px dashed #000'}}></hr>
                <div className="float-right">
                    <Button onClick={props.onEdit}  size="lg" style={{ margin: '0px 5px'}} color="secondary">{props.Edit ? 'Save': 'Edit'}</Button> 
                    <Button  size="lg"  style={{ margin: '0px 5px'}}color="secondary">Delete</Button>
                </div>
                <FormGroup row>
                    <Col sm={5}>

                        {props.Edit ? (
                             <Input type="text" onChange={props.onChange} value={ props.updatedFirst ? props.updatedFirst : item.firstName } name="updatedFirst" placeholder="Enter First Name"/>
                        ):(
                           <div>
                          {props.updatedFirst ? props.updatedFirst : item.firstName } 
                           </div>
                        )}

                    </Col>
                </FormGroup>
                <FormGroup row>
                    <Col sm={5}>

                        {props.Edit ? (
                             <Input type="text" onChange={props.onChange} value={ props.updatedEmployeeID ? props.updatedEmployeeID : item.employeeID} name="updatedEmployeeID" placeholder="Enter EmployeeID"/>
                        ):(
                           <div>
                          {props.updatedEmployeeID ? props.updatedEmployeeID : item.employeeID} 
                           </div>
                        )}

                    </Col>
                </FormGroup>
                <FormGroup row>
                    <Col sm={5}>
                    {props.Edit ? (
                             <Input type="text" onChange={props.onChange} value={ props.updatedLast ? props.updatedLast: item.lastName} name="updatedLast" placeholder="Enter Last Name"/>
                        ):(
                           <div>
                          {props.updatedLast ? props.updatedLast : item.lastName} 
                           </div>
                    )}
                    </Col>
                </FormGroup>
            </div>
        ))}
    </Fragment>
    )
}

export default List;

2 个答案:

答案 0 :(得分:2)

以下示例显示了如何传递处理程序并相应地设置状态。

在很大程度上,我将逻辑和表示分离开来,使用React.memo,表示组件是纯组件。

var conn = (SqlConnection)this.Database.GetDbConnection();
conn.AccessToken = new AzureServiceTokenProvider()
                      .GetAccessTokenAsync("https://database.windows.net/")
                      .Result;

答案 1 :(得分:-1)

我认为onSubmit无法正确更新员工。您不应该在setState中使用this.state。

this.state inside setState ReactJS

尝试一下。

this.setState(prevState => ({
      employees: [...prevState.employees, ourForm]
  }, () => {
      console.log(this.state.employees)
  }))