我使用的是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
方法(例如 handleCheckboxClick
和 handleRowClick
).
在 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:
关于javascript - Material-ui 表行 onClick 绕过复选框选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54531421/