为数据 table 的所有列构造状态对象以进行排序:React JS
Constructing state object for all the columns of a data table for sorting : React JS
需要构造一个有助于维护字段名和排序类型的状态对象(ascending/descending)。
我正在尝试通过采用列名和排序类型(asc 或 des)在服务器端进行排序的地方实现排序。
我正在维护一个数据组件 table,我在其中附加了一个点击处理程序,它基本上应该提供我点击的字段名称和排序类型。我可以对 fieldnam 进行硬编码,但是我将如何使用排序类型映射每一列。
我只需要将字段的名称和类型发送到后端,然后它就会给我排序的结果。我将如何使用 asc/desc
映射相应的列名称
有人可以帮我解决这个问题吗?
沙盒:https://codesandbox.io/s/misty-water-iutxl
import * as React from "react";
import ReactTable from "react-table";
import "react-table/react-table.css";
import Child from "./Child";
interface IState {
data: {}[];
columns: {}[];
selectedValues: {};
}
interface IProps {}
export default class App extends React.Component<IProps, IState> {
constructor(props: any) {
super(props);
this.state = {
data: [],
columns: [],
};
}
componentDidMount()
{
this.getColumnFilterValues();
this.getData();
}
getData = () =>{
let data = [
{ firstName: "Jack", status: "Submitted", age: "14" },
{ firstName: "Simon", status: "Pending", age: "15" },
{ firstName: "Pete", status: "Approved", age: "17" }
];
this.setState({data},()=> this.getColumns());
}
getColumnFilterValues = () =>{
let optionsForColumns = {
firstName: [
{ Jack: "4", checked: false },
{ Simon: "5", checked: false },
{ Pete: "10", checked: false }
],
status: [
{ Submitted: "5", checked: false },
{ Pending: "7", checked: false },
{ Approved: "15", checked: false }
]
}
this.setState({optionsForColumns});
}
sortHandler = (name) =>{
//Sort Handler, here I have to pass the field name and type of sorting
}
getColumns = () =>{
let columns = [
{
Header: () => (
<div>
<div style={{ position: "absolute", marginLeft: "10px" }}>
<Child
key="firstName"
name="firstName"
options={this.getValuesFromKey("firstName")}
handleFilter={this.handleFilter}
/>
</div>
<span onClick={()=>this.sortHandler("firstName")}>First Name</span>
</div>
),
accessor: "firstName",
sortable: false,
show: true,
displayValue: " First Name"
},
{
Header: () => (
<div>
<div style={{ position: "absolute", marginLeft: "10px" }}>
<Child
key="status"
name="status"
options={this.getValuesFromKey("status")}
handleFilter={this.handleFilter}
/>
</div>
<span onClick={()=>this.sortHandler("status")}>Status</span>
</div>
),
accessor: "status",
sortable: false
},
{
Header: () =>(
<span onClick={this.sort}>Age</span>
),
accessor: "age"
}
];
this.setState({ columns });
}
//Rendering the data table
render() {
const { data, columns } = this.state;
return (
<div>
<ReactTable
data={data}
columns={columns}
/>
</div>
);
}
}
排序类型将只是当前排序类型的反转。因此,您需要跟踪每个列的排序类型。之后,你可以做类似的事情;
// imagine sortingTypes are stored in the state like so:
state = {
sortingTypes: {
firstName: 'ASC',
lastName: '',
},
};
// in the onClick handler
sortHandler = (name) =>{
//Sort Handler, here I have to pass the field name and type of sorting
// Make a new sortingTypes object
const sortingTypes = Object.keys(this.state.sortingTypes).reduce((obj, key) => {
if (key === name) {
obj[key] = sortingTypes[key] === 'ASC' ? 'DESC' : 'ASC';
} else {
obj[key] = '';
}
return obj;
}, {});
// calling this.getColumns() in the setState callback function is not recommended.
// The getColumns function is also calling setState and caused the component to update
// twice while that is not needed.
this.setState({ sortingTypes }, () => this.getColumns());
}
编辑
在研究了 react-table 之后,我意识到您不必自己管理状态。只需设置 manual
和 onFetchData
属性,您就可以确切知道何时获取数据以及使用哪些排序选项;
<ReactTable
data={data}
columns={columns}
defaultPageSize={10}
loading={this.state.loading}
className="-striped -highlight"
onFetchData={(({ sorted }) => {
// here you can fetch data with the table state like `sorting`.
console.log(sorted && sorted[0] && sorted[0].id);
})}
manual
/>
有关详细信息,请参阅 React Table 文档中的 Server-side data 章节。
需要构造一个有助于维护字段名和排序类型的状态对象(ascending/descending)。
我正在尝试通过采用列名和排序类型(asc 或 des)在服务器端进行排序的地方实现排序。
我正在维护一个数据组件 table,我在其中附加了一个点击处理程序,它基本上应该提供我点击的字段名称和排序类型。我可以对 fieldnam 进行硬编码,但是我将如何使用排序类型映射每一列。
我只需要将字段的名称和类型发送到后端,然后它就会给我排序的结果。我将如何使用 asc/desc
映射相应的列名称有人可以帮我解决这个问题吗?
沙盒:https://codesandbox.io/s/misty-water-iutxl
import * as React from "react";
import ReactTable from "react-table";
import "react-table/react-table.css";
import Child from "./Child";
interface IState {
data: {}[];
columns: {}[];
selectedValues: {};
}
interface IProps {}
export default class App extends React.Component<IProps, IState> {
constructor(props: any) {
super(props);
this.state = {
data: [],
columns: [],
};
}
componentDidMount()
{
this.getColumnFilterValues();
this.getData();
}
getData = () =>{
let data = [
{ firstName: "Jack", status: "Submitted", age: "14" },
{ firstName: "Simon", status: "Pending", age: "15" },
{ firstName: "Pete", status: "Approved", age: "17" }
];
this.setState({data},()=> this.getColumns());
}
getColumnFilterValues = () =>{
let optionsForColumns = {
firstName: [
{ Jack: "4", checked: false },
{ Simon: "5", checked: false },
{ Pete: "10", checked: false }
],
status: [
{ Submitted: "5", checked: false },
{ Pending: "7", checked: false },
{ Approved: "15", checked: false }
]
}
this.setState({optionsForColumns});
}
sortHandler = (name) =>{
//Sort Handler, here I have to pass the field name and type of sorting
}
getColumns = () =>{
let columns = [
{
Header: () => (
<div>
<div style={{ position: "absolute", marginLeft: "10px" }}>
<Child
key="firstName"
name="firstName"
options={this.getValuesFromKey("firstName")}
handleFilter={this.handleFilter}
/>
</div>
<span onClick={()=>this.sortHandler("firstName")}>First Name</span>
</div>
),
accessor: "firstName",
sortable: false,
show: true,
displayValue: " First Name"
},
{
Header: () => (
<div>
<div style={{ position: "absolute", marginLeft: "10px" }}>
<Child
key="status"
name="status"
options={this.getValuesFromKey("status")}
handleFilter={this.handleFilter}
/>
</div>
<span onClick={()=>this.sortHandler("status")}>Status</span>
</div>
),
accessor: "status",
sortable: false
},
{
Header: () =>(
<span onClick={this.sort}>Age</span>
),
accessor: "age"
}
];
this.setState({ columns });
}
//Rendering the data table
render() {
const { data, columns } = this.state;
return (
<div>
<ReactTable
data={data}
columns={columns}
/>
</div>
);
}
}
排序类型将只是当前排序类型的反转。因此,您需要跟踪每个列的排序类型。之后,你可以做类似的事情;
// imagine sortingTypes are stored in the state like so:
state = {
sortingTypes: {
firstName: 'ASC',
lastName: '',
},
};
// in the onClick handler
sortHandler = (name) =>{
//Sort Handler, here I have to pass the field name and type of sorting
// Make a new sortingTypes object
const sortingTypes = Object.keys(this.state.sortingTypes).reduce((obj, key) => {
if (key === name) {
obj[key] = sortingTypes[key] === 'ASC' ? 'DESC' : 'ASC';
} else {
obj[key] = '';
}
return obj;
}, {});
// calling this.getColumns() in the setState callback function is not recommended.
// The getColumns function is also calling setState and caused the component to update
// twice while that is not needed.
this.setState({ sortingTypes }, () => this.getColumns());
}
编辑
在研究了 react-table 之后,我意识到您不必自己管理状态。只需设置 manual
和 onFetchData
属性,您就可以确切知道何时获取数据以及使用哪些排序选项;
<ReactTable
data={data}
columns={columns}
defaultPageSize={10}
loading={this.state.loading}
className="-striped -highlight"
onFetchData={(({ sorted }) => {
// here you can fetch data with the table state like `sorting`.
console.log(sorted && sorted[0] && sorted[0].id);
})}
manual
/>
有关详细信息,请参阅 React Table 文档中的 Server-side data 章节。