我最近在探索" React -data-grid“,并试图在我的React应用程序中使用基本的过滤功能。这是我正在查看的他们的基本过滤示例:
http://adazzle.github.io/react-data-grid/docs/examples/column-filtering
他们在codesandbox中的示例代码:https://codesandbox.io/s/w6jvml4v45?from-embed
我将大多数代码工件示例复制到我的类组件中,并尝试为React的useState()找到等效的解决方案(我对React和useState显然在类中不可用非常陌生)。
我的代码针对这个论坛做了一些修改,并指向公共JSONPlaceholder网站,用测试数据模拟来自真实服务器的REST API调用。所以希望你能直接运行它。下面是我的App.js代码:
import React, { Component } from "react";
import ReactDataGrid from "react-data-grid";
import { Toolbar, Data } from "react-data-grid-addons";
import "./App.css";
import "bootstrap/dist/css/bootstrap.css";
const defaultColumnProperties = {
filterable: true,
width: 120,
editable: true
};
const columns = [
{ key: "id", name: "ID" },
{ key: "username", name: "Username" },
{ key: "email", name: "Email" }
].map(c => ({ ...c, ...defaultColumnProperties }));
function getRows(rows, filters) {
const selectors = Data.Selectors;
return selectors.getRows({ rows, filters });
}
class App extends Component {
constructor(props) {
super(props);
this.state = {
rows: [],
isLoaded: false,
filters: {},
setFilters: {}
};
}
componentDidMount() {
fetch("https://jsonplaceholder.typicode.com/users")
.then(res => res.json())
.then(json => {
this.setState({
isLoaded: true,
rows: json
});
});
}
onGridRowsUpdated = ({ fromRow, toRow, updated }) => {
this.setState(state => {
const rows = state.rows.slice();
for (let i = fromRow; i <= toRow; i++) {
rows[i] = { ...rows[i], ...updated };
}
return { rows };
});
};
render() {
// const [filters, setFilters] = useState({});
const filteredRows = getRows(this.state.rows, this.state.filters);
// Commenting ORIGINAL handleFilterChange example code temporarily
// const handleFilterChange = filter => filters => {
// const newFilters = { ...filters };
// if (filter.filterTerm) {
// newFilters[filter.column.key] = filter;
// } else {
// delete newFilters[filter.column.key];
// }
// return newFilters;
// };
// Temporarily rewrote handleFilterChange function for DEBUGGING purpose and not using arrow fucntions
// Used babeljs.io to generate non arrow based handleFilterChange function.
var handleFilterChange = function handleFilterChange(filter) {
debugger;
console.log("handleFilterChange(filter)" + filter);
return function(filters) {
debugger;
console.log("function(filters)" + filters);
var newFilters = { ...filters };
if (filter.filterTerm) {
newFilters[filter.column.key] = filter;
} else {
delete newFilters[filter.column.key];
}
return newFilters;
};
};
return (
<ReactDataGrid
columns={columns}
rowGetter={i => filteredRows[i]}
rowsCount={filteredRows.length}
minHeight={500}
toolbar={<Toolbar enableFilter={true} />}
onAddFilter={filter =>
this.setState({ setFilters: handleFilterChange(filter) })
}
onClearFilters={() => this.setState({ setFilter: {} })}
/>
);
}
}
export default App;根据上面代码示例中的注释,我使用babeljs.io生成了一个不基于箭头的handleFilterChange函数,并添加了一些日志和调试语句
出于某种原因,嵌套函数:
return function(filters) {
var newFilters = {
...filters
};
if (filter.filterTerm) {
newFilters[filter.column.key] = filter;
} else {
delete newFilters[filter.column.key];
}不会被调用。Chrome中的调试器没有命中断点,也没有打印出我添加的调试日志。
这个日志总是被调用:
console.log("handleFilterChange(filter)" + filter);内部函数中的日志永远不会被调用,我认为这就是问题所在?
console.log("function(filters)" + filters);当我在他们的示例中使用基于非箭头函数的handleFilterChange,并替换了他们的handleFilterChange代码时,它可以工作,所以我相信代码本身是好的,所有的调试日志都会出现在控制台中。内部函数也会被调用。我很乐意使用箭头函数,如果我能得到一点帮助来让它工作的话。
我还编写了一个不基于类的基本过滤器版本,但在从服务器加载相当大的JSON数据时遇到了问题。我没有进一步调查,但我认为这是一个时机问题。
由于这个问题,表被加载到浏览器中,我可以按下右上角的"Filter Rows“按钮。这将折叠搜索编辑框,我可以键入字母,但表格在键入字母时不会被动态过滤。
发布于 2021-04-13 00:08:34
handleFilterChange(filter) {
let newFilters = Object.assign({}, this.props.filters);
if (filter.filterTerm) {
newFilters[filter.column.key] = filter;
} else {
delete newFilters[filter.column.key];
}
this.setState({ filters: newFilters });
}https://stackoverflow.com/questions/55796062
复制相似问题