Set value to state React js

前端 未结 2 468
一向
一向 2021-01-24 02:58

I need a bit of help.

I am new to react, so I have stuck here. I have shared a sandbox box link. That Contains a Table. as below

| Toy | Color Avail

相关标签:
2条回答
  • 2021-01-24 03:36

    This isn't an exact answer, but just as a general direction - you need something in the state to capture the values of the currently edited row contents, that you can then add to the final list. This is assuming once committed, you don't want to modify the final list.

    Firstly, have an initial state that stores the values in the current row being edited

    this.state = {
      currentData: {
        toy: '',
        color: '', 
        ..other props in the row
      }
      ...other state variables like dataSource etc
    }
    

    Secondly, when the value in an input box is changed, you have to update the corresponding property in the currentData state variable. I see that you already have a handleInputChange function

    For eg, for the input box corresponding to toy, you'd do

     <input onChange={e => handleInputChange(e, 'toy')} ...other props />
    

    and in the function itself, you'd update the currentData state variable, something like:

    handleInputChange = (e, property) => {
      const data = this.state.currentData 
      data[property] = e.target.value
      this.setState({ currentData: data })
    }
    

    Finally, when you press add, in your handleAddFunction, you want to do two things:

    1) use the currentData in state, that's been saving your current values and push them into the dataSource or details array

    2) restore the currentData to the blank state, ready to track updates for the next row.

      handleAdd = () => {
        const { count, dataSource } = this.state;
        const newData = {
          key: count,
          ...this.state.newData,
        };
        this.setState({
          dataSource: [...dataSource, newData],
          count: count + 1, 
          currentData: {
            toy: '', 
            // other default values
          }
        });
      };
    
    
    0 讨论(0)
  • 2021-01-24 03:49

    just paste this code it is working .

    check your console you'll get your desired output .

    import React from "react";
    import ReactDOM from "react-dom";
    import "antd/dist/antd.css";
    import "./index.css";
    import { Table, Checkbox, Input } from "antd";
    import { PlusCircleOutlined, MinusCircleOutlined } from "@ant-design/icons";
    
    const { Column } = Table;
    
    class ToyTable extends React.Component {
      constructor(props) {
        super(props);
        this.state = {
          dataSource: [
            {
              key: 0,
              toy: "asdf",
              color: "black",
              cost: "23"
            }
          ],
          count: 0,
          colorSwitch: false,
          costSwitch: false,
          columnsValues: {
            color: true,
            cost: true
          },
          detail: []
        };
      }
    
      componentDidMount(){
        const count = this.state.dataSource.length;
        this.setState({
          count
        })
      }
    
      handleAdd = () => {
        const { dataSource } = this.state;
        let count = dataSource.length;
        const newData = {
          key: count,
          toy: "",
          color: "",
          cost: ""
        };
        this.setState({
          dataSource: [...dataSource, newData],
          count
        });
      };
      handleDelete = key => {
        const dataSource = [...this.state.dataSource];
        this.setState({ dataSource: dataSource.filter(item => item.key !== key) });
      };
      onChangecolor = (e, record) => {
        let dataSource = this.state.dataSource;
        let key = record.key;
        dataSource[key].color = e.target.value;
        this.setState({
          dataSource
        });
      };
      onChangeCost = (e, record) => {
        let dataSource = this.state.dataSource;
        let key = record.key;
        dataSource[key].cost = e.target.value;
        this.setState({
          dataSource
        });
      };
      onChangeToy = (e, record) => {
        console.log("I am inside handleInputChange", e.target.value, record);
        let dataSource = this.state.dataSource;
        let key = record.key;
        dataSource[key].toy = e.target.value;
        this.setState({
          dataSource
        });
      };
    
      checkColor = e => {
        this.setState({ colorSwitch: e.target.checked });
      };
    
      checkCost = e => {
        this.setState({ costSwitch: e.target.checked });
      };
      render() {
        const { dataSource } = this.state;
        console.log(dataSource);
    
        return (
          <Table bordered pagination={false} dataSource={dataSource}>
            <Column
              title="Toy"
              align="center"
              key="toy"
              dataIndex="toy"
              render={(text, record) => (
                <Input
                  component="input"
                  className="ant-input"
                  type="text"
                  value={record.toy}
                  onChange={e => this.onChangeToy(e, record)}
                />
              )}
            />
    
            <Column
              title={() => (
                <div className="row">
                  Color Available
                  <div className="col-md-5">
                    <Checkbox size="small" onChange={this.checkColor} />
                  </div>
                </div>
              )}
              align="center"
              dataIndex="color"
              render={(text, record) => (
                <Input
                  disabled={!this.state.colorSwitch}
                  value={record.color}
                  onChange={e => this.onChangecolor(e, record)}
                  component="input"
                  className="ant-input"
                  type="text"
                />
              )}
            />
    
            <Column
              title={() => (
                <div className="row">
                  Cost Available
                  <div className="col-md-5">
                    <Checkbox size="small" onChange={this.checkCost} />
                  </div>
                </div>
              )}
              align="center"
              dataIndex="color"
              render={(text, record) => (
                <Input
                  disabled={!this.state.costSwitch}
                  value={record.cost}
                  onChange={e => this.onChangeCost(e, record)}
                  component="input"
                  className="ant-input"
                  type="text"
                />
              )}
            />
    
            <Column
              render={(text, record) =>
                this.state.count !== 0 && record.key + 1 !== this.state.count ? (
                  <MinusCircleOutlined
                    onClick={() => this.handleDelete(record.key)}
                  />
                ) : (
                  <PlusCircleOutlined onClick={this.handleAdd} />
                )
              }
            />
          </Table>
        );
      }
    }
    
    ReactDOM.render(<ToyTable />, document.getElementById("container"));
    
    0 讨论(0)
提交回复
热议问题