react "devextreme-react/data-grid"中怎么判断组件<DataGrid>中onSelectionChanged事件是操作者点击行触发,还是dataSource自动刷新的,如果是用户点击行触发的才执行后续操作,怎么实现
时间: 2024-09-12 21:13:56 浏览: 60
在`devextreme-react/data-grid`组件中,想要区分`onSelectionChanged`事件是由用户点击行触发还是由于数据源自动刷新,你需要在事件处理函数内部检查几个关键点:
1. **event.isDefaultPrevented()**:如果事件默认行为被阻止了(通常是通过`event.preventDefault()`),那么这个事件可能是由用户手动操作引起的。
2. **event.fromEvent()**:DevExtreme提供了一个`fromEvent`方法,可以获取原始的DOM事件。你可以比较当前的事件和之前记录的是否一致,如果不一致,说明是用户新的选择。
3. **grid.getDataSource().getModifiedDataCount()**:检查数据源是否有修改,如果没有,那可能就是用户点击行导致的。
4. **grid.getDataSource().isServerPaging() && grid.getDataSource().isServerSorting()**: 如果数据源有服务器分页或排序并且发生了改变,这通常意味着数据源刷新,而不是用户操作。
结合以上策略,你可以创建一个自定义的筛选函数,例如:
```jsx
handleSelectionChanged = (event) => {
if (!event.isDefaultPrevented()) {
const previousSelectedRows = this.previousSelectedRows;
const currentSelectedRows = event.target.getSelectedRows();
// 检查是否来自用户点击
if (
!Array.isArray(previousSelectedRows) ||
!previousSelectedRows.length ||
!isEqual(currentSelectedRows, previousSelectedRows)
) {
// 用户操作
this.executeUserAction(event);
} else {
// 数据源更新
console.log('Selection changed due to data source refresh.');
}
// 更新缓存
this.previousSelectedRows = currentSelectedRows;
}
}
executeUserAction = (event) => {
// 执行针对用户选中行的操作
// ...
}
```
记住在初次渲染或数据源初始化后设置`this.previousSelectedRows`为空数组。
阅读全文