【问题标题】:React js Material UI Switch Component in loop循环中的React js Material UI切换组件
【发布时间】:2019-04-28 09:59:58
【问题描述】:

我正在尝试制作考勤系统,我正在使用 React Material UI 中的开关组件(参考:https://material-ui.com/api/switch/)。

如何在循环中循环切换组件,以便每个切换按钮切换都像每个表格行一样?下面是我的代码块。有什么帮助吗?目前,当我切换一个开关时,循环内的所有开关都会自动切换。

constructor(props) {
    super(props);
    this.state = {
        checkedB: false,
    }
    this.handleClassChange = this.handleClassChange.bind(this);
}

handleChange = name => event => {
    this.setState({ [name]: event.target.checked });
};

 {

  this.state.students.map((post, i) => (
  <TableRow key={i} className="tblFont">
  <TableCell scope="row">
  {post.ROLLNO}
  </TableCell>
  <TableCell>
  {post.STNAME}
  </TableCell>
  <TableCell>
      <Switch key={this.state[i]}
         checked={this.state.i}
         onChange={this.handleChange('checkedB')}
         value="checkedB"
         color="primary"
      />
  </TableCell>
</TableRow>
    ))
}

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    遍历数组并为每个 Switch 创建状态。例如{ switch-0: false, switch-1: false, ...}

    setDynamicSwitchState = (list) => {
    
      if (!list) {
        return
      }
    
      const switchState = {};
    
      list.forEach((item, index) => {
        switchState['switch-' + index] = false;
      });
    
      this.setState({
        switchState: switchState
      })
    }
    

    在你的handleChange

    handleChange = (index, event, checked) => {
    
      const list = Object.assign({}, this.state.switchState);
    
      list['switch-' + index] = checked;
    
      this.setState({
        switchState: list
      })
    }
    

    Working Demo

    【讨论】:

    • 谢谢。但是,当学生人数更多(例如 100 人)时,这种逻辑就会引发错误。错误:超过最大更新深度。当组件在 componentWillUpdate 或 componentDidUpdate 中重复调用 setState 时,可能会发生这种情况。 React 限制了嵌套更新的数量以防止无限循环。知道如何解决这个问题。
    • 你在做这个onChange={this.handleChange('checkedB')}吗?导致在渲染中调用函数时抛出该错误
    • 非常感谢,朱尼厄斯。忘记改开关组件事件了,现在改了开关组件事件,效果很好。
    猜你喜欢
    • 2020-08-19
    • 1970-01-01
    • 2018-04-01
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-31
    • 2021-12-30
    相关资源
    最近更新 更多