javascript - Material-ui 表行 onClick 绕过复选框选择

标签 javascript reactjs material-ui

我使用的是material-ui数据表进行排序。这在每一行上都包含一个复选框。我已经做到每一行都返回一个链接的点击。

但是,我不希望复选框充当单击,而是希望它充当复选框并将行添加到选中状态。但是当点击复选框时,行链接被返回。

我需要从行链接中排除该单元格或以某种方式排除复选框。

https://codesandbox.io/s/rlkv87vor4

这是我尝试过的逻辑:

点击处理程序

if (event.target.classList.contains('selectCheckbox')) {
  return console.log('checkbox select');
  } else {
  return console.log('row link');
}

在我的demo 行链接总是在点击复选框时返回。

<TableCell padding="checkbox">
  <Checkbox className="selectCheckbox" checked={isSelected} />
</TableCell>

最佳答案

处理此问题的最直接方法是为复选框和行设置两个单独的 handleClick 方法(例如 handleCheckboxClickhandleRowClick ).

handleCheckboxClick 中,您可以调用 event.stopPropagation(); 以防止调用 handleRowClick

因此 EnhancedTable 的以下部分将从:

  handleClick = (event, id) => {
    if (event.target.classList.contains("selectCheckbox")) {
      console.log("checkbox select");
    } else {
      console.log("row link");
    }

    const { selected } = this.state;
    const selectedIndex = selected.indexOf(id);
    let newSelected = [];

    if (selectedIndex === -1) {
      newSelected = newSelected.concat(selected, id);
    } else if (selectedIndex === 0) {
      newSelected = newSelected.concat(selected.slice(1));
    } else if (selectedIndex === selected.length - 1) {
      newSelected = newSelected.concat(selected.slice(0, -1));
    } else if (selectedIndex > 0) {
      newSelected = newSelected.concat(
        selected.slice(0, selectedIndex),
        selected.slice(selectedIndex + 1)
      );
    }

    this.setState({ selected: newSelected });
  };
...
<TableRow
  hover
  onClick={event => this.handleClick(event, n.id)}
  role="checkbox"
  aria-checked={isSelected}
  tabIndex={-1}
  key={n.id}
  selected={isSelected}
>
  <TableCell className="selectCheckbox" padding="checkbox">
    <Checkbox
      onClick={event => this.handleClick(event, n.id)}
      className="selectCheckbox"
      checked={isSelected}
    />
  </TableCell>

类似于以下内容:

  handleCheckboxClick = (event, id) => {
    event.stopPropagation();
    console.log("checkbox select");
    const { selected } = this.state;
    const selectedIndex = selected.indexOf(id);
    let newSelected = [];

    if (selectedIndex === -1) {
      newSelected = newSelected.concat(selected, id);
    } else if (selectedIndex === 0) {
      newSelected = newSelected.concat(selected.slice(1));
    } else if (selectedIndex === selected.length - 1) {
      newSelected = newSelected.concat(selected.slice(0, -1));
    } else if (selectedIndex > 0) {
      newSelected = newSelected.concat(
        selected.slice(0, selectedIndex),
        selected.slice(selectedIndex + 1)
      );
    }

    this.setState({ selected: newSelected });
  };
  handleRowClick = (event, id) => {
    console.log("row link");
  };
...
<TableRow
  hover
  onClick={event => this.handleRowClick(event, n.id)}
  role="checkbox"
  aria-checked={isSelected}
  tabIndex={-1}
  key={n.id}
  selected={isSelected}
>
  <TableCell className="selectCheckbox" padding="checkbox">
    <Checkbox
      onClick={event =>
        this.handleCheckboxClick(event, n.id)
      }
      className="selectCheckbox"
      checked={isSelected}
    />

这是一个展示这种方法的 CodeSandbox:

Edit Material demo

关于javascript - Material-ui 表行 onClick 绕过复选框选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54531421/

相关文章:

javascript - jquery - 使用 event.stopPropagation()

javascript - 从字符串中取出数字

javascript - 如何将 2015 年 8 月 16 日星期日 00 :00:00 GMT+0200 (W. 欧洲夏令时间) 转换为 16.08.2015

reactjs - Cookie 未存储在浏览器中

javascript - 过滤json数据并使用过滤后的数据绘制nvd3图表

reactjs - 无法读取未定义的属性 'render'

javascript - 使用 (ES6) 计算属性名称更新嵌套对象

reactjs - Material 用户界面 : how to center vertically TextField and ButtonGroup

css - 与 Material-UI 1 Grid 相同宽度的列

reactjs - Material -UI/React : How to correctly add notification button with Badge to AppBar?