将值设置为状态 React js

Posted

技术标签:

【中文标题】将值设置为状态 React js【英文标题】:Set value to state React js 【发布时间】:2020-10-01 05:15:03 【问题描述】:

我需要一点帮助。

我是新手,所以我卡在这里。我分享了一个sandbox 框链接。包含一个表。如下

|玩具 |可用颜色 |可用成本 |

现在一切正常。但我想将表格的数据保存如下

detail 状态应包含表的行值列表,columnsValues 应包含Color AvailableCost Available 的复选框值

示例: this.state.detail点赞

detail: [
  
      toy   : ...
      color : ...
      cost  : ...
  
  
      toy   : ...
      color : ...
      cost  : ...
  
  ...
  ...
  ...
]

this.state.columnsValues点赞

columnsValues: 
  color : boolean
  cost  : boolean

请任何专家帮助我。过去几个小时我一直在苦苦挣扎。

谢谢。

沙盒链接:https://codesandbox.io/s/suspicious-microservice-qd3ku?file=/index.js

【问题讨论】:

看起来您已经将this.state.detail 中的所需内容保存为this.state.dataSource 抱歉问了些愚蠢的问题。但是dataSource 没有我在表格行中输入的值。 你没有任何初始状态,你为什么不设置呢? 我说的是我们在行文本框中输入的值。我们从初始状态中得到了什么? @Rich 我非常接近你的解决方案。 【参考方案1】:

只需粘贴此代码即可。

检查你的控制台,你会得到你想要的输出。

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"));

【讨论】:

感谢您的解决方案。 :) 很高兴有帮助:)。我必须这样做,因为我告诉过你我会在 2 小时内回复你?? 无论如何感谢您的关注。但是当我们删除一行(右侧的减号图标)然后添加另一行并尝试更改该行的值时,您的代码会出错。现在我正在检查相同的内容。如果可能,请检查一次。谢谢你。 :) 抱歉回复晚了。但是我今天有点忙。所以,今天帮不了你。 没关系。没问题。如果可能,请查看此link 一次。看起来很简单,但我还没有找到任何解决方案。谢谢。【参考方案2】:

这不是一个确切的答案,但只是作为一个大方向 - 您需要在 state 中捕获当前编辑的行内容的值,然后您可以将其添加到最终列表中。这是假设一旦提交,您不想修改最终列表。

首先,有一个初始状态,存储当前正在编辑的行中的值

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

其次,当输入框中的值发生变化时,您必须更新currentData状态变量中的相应属性。我看到你已经有了handleInputChange 函数

例如,对于toy对应的输入框,你会这样做

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

在函数本身中,您将更新 currentData 状态变量,例如:

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

最后,当你按下添加时,在你的handleAddFunction,你想做两件事:

1) 在状态下使用currentData,这会保存您当前的值并将它们推送到dataSourcedetails 数组中

2) 将currentData 恢复为空白状态,准备跟踪下一行的更新。

  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
      
    );
  ;

【讨论】:

感谢您的帮助。我会查一下。 :)

以上是关于将值设置为状态 React js的主要内容,如果未能解决你的问题,请参考以下文章

如何将值从组件传递给道具并设置状态

如何使用 redux 为 react js 设置加载状态

在 React 中使用动态键设置状态 [重复]

如何在 react.js ES6 中使用道具设置状态

如何在 React.js 中刷新页面后保持状态?

React JS - 切换布尔值