可排序 Headers 语义 UI
Sortable Headers Semantic UI
我正在尝试使用 https://react.semantic-ui.com/collections/table/#variations-sortable
获取我的 table 列 sortable
但我对如何设置要映射的数据有点迷茫。本质上,我不知道如何像他们的示例那样将我的数据放入 tableData 中,然后能够像他们在示例中那样进行排序。
我觉得它必须是非常简单的东西,我想多了。下面是我的代码,其中设置了列,当您单击排序箭头时可以正常工作,但数据没有任何变化。
import React, { Component } from 'react';
import {
Table,
Button,
} from 'semantic-ui-react';
import firebase from 'firebase';
import Router from 'next/router';
import _ from 'lodash';
export default class TransactionListingSLice extends Component {
static editForm(path) {
Router.push(path);
}
constructor(props) {
super(props);
this.state = {
transactions: [],
column: null,
direction: null,
};
}
componentDidMount() {
this.getTransactions();
}
getTransactions() {
const returnData = [];
const {
listType,
} = this.props;
firebase
.firestore()
.collection(listType)
.get()
.then((transactions) => {
const data = transactions.docs.map((doc) => {
const docData = doc.data();
return {
id: doc.id,
activeRevision: docData.activeRevision,
};
});
const fbPromises = [];
_.each(data, (doc) => {
fbPromises.push(
firebase
.firestore()
.collection(listType)
.doc(doc.id)
.collection('Revisions')
.doc(doc.activeRevision)
.get()
.then((formData) => {
returnData.push(
_.merge({}, doc, formData.data()),
);
}),
);
});
if (!_.isEmpty(fbPromises)) {
Promise.all(fbPromises).then(() => {
this.setState({ transactions: returnData });
});
}
});
}
handleSort = clickedColumn => () => {
const { column, data, direction } = this.state;
if (column !== clickedColumn) {
this.setState({
column: clickedColumn,
data: _.sortBy(data, [clickedColumn]),
direction: 'ascending',
});
return;
}
this.setState({
data: data.reverse(),
direction: direction === 'ascending' ? 'descending' : 'ascending',
});
}
render() {
const { transactions } = this.state;
const {
listType,
} = this.props;
const { column, direction } = this.state;
console.log('-------');
console.log(transactions);
console.log('----END----');
const path = (listType === 'BuyerTransactions') ? 'buy' : 'sell';
return (
<div>
<Table sortable compact singleLine>
<Table.Header>
<Table.Row>
<Table.HeaderCell
sorted={column === 'Primary' ? direction : null}
onClick={this.handleSort('Primary')}
>
Primary Name
</Table.HeaderCell>
<Table.HeaderCell
sorted={column === 'Transaction' ? direction : null}
onClick={this.handleSort('Transaction')}
>
Transaction ID
</Table.HeaderCell>
<Table.HeaderCell
sorted={column === 'Form' ? direction : null}
onClick={this.handleSort('Form')}
>
Active Form
</Table.HeaderCell>
<Table.HeaderCell
sorted={column === 'Step' ? direction : null}
onClick={this.handleSort('Step')}
>
Active Step
</Table.HeaderCell>
<Table.HeaderCell
sorted={column === 'Name' ? direction : null}
onClick={this.handleSort('Name')}
>
Seller Name
</Table.HeaderCell>
</Table.Row>
</Table.Header>
<Table.Body>
{transactions
&& transactions.map(
transaction => transaction && (
<Table.Row key={transaction.id}>
{_.has(transaction.involvedParties, 'prime') && (
<Table.Cell>{transaction.involvedParties.prime}</Table.Cell>
)
}
<Table.Cell>{transaction.id}</Table.Cell>
<Table.Cell>{transaction.activeForm}</Table.Cell>
<Table.Cell>{transaction.activeStep}</Table.Cell>
<Table.Cell>HERE</Table.Cell>
<Table.Cell>
<Button
color="grey"
onClick={() => TransactionListingSLice.editForm(`/app/${path}/${transaction.id}`)}
>
Edit
</Button>
</Table.Cell>
</Table.Row>
),
)}
</Table.Body>
</Table>
</div>
);
}
}
在渲染函数中,您使用状态中的交易字段,但在 handleSort 中,您试图对数据字段进行排序。我认为这是主要问题 ;)
我正在尝试使用 https://react.semantic-ui.com/collections/table/#variations-sortable
获取我的 table 列 sortable但我对如何设置要映射的数据有点迷茫。本质上,我不知道如何像他们的示例那样将我的数据放入 tableData 中,然后能够像他们在示例中那样进行排序。
我觉得它必须是非常简单的东西,我想多了。下面是我的代码,其中设置了列,当您单击排序箭头时可以正常工作,但数据没有任何变化。
import React, { Component } from 'react';
import {
Table,
Button,
} from 'semantic-ui-react';
import firebase from 'firebase';
import Router from 'next/router';
import _ from 'lodash';
export default class TransactionListingSLice extends Component {
static editForm(path) {
Router.push(path);
}
constructor(props) {
super(props);
this.state = {
transactions: [],
column: null,
direction: null,
};
}
componentDidMount() {
this.getTransactions();
}
getTransactions() {
const returnData = [];
const {
listType,
} = this.props;
firebase
.firestore()
.collection(listType)
.get()
.then((transactions) => {
const data = transactions.docs.map((doc) => {
const docData = doc.data();
return {
id: doc.id,
activeRevision: docData.activeRevision,
};
});
const fbPromises = [];
_.each(data, (doc) => {
fbPromises.push(
firebase
.firestore()
.collection(listType)
.doc(doc.id)
.collection('Revisions')
.doc(doc.activeRevision)
.get()
.then((formData) => {
returnData.push(
_.merge({}, doc, formData.data()),
);
}),
);
});
if (!_.isEmpty(fbPromises)) {
Promise.all(fbPromises).then(() => {
this.setState({ transactions: returnData });
});
}
});
}
handleSort = clickedColumn => () => {
const { column, data, direction } = this.state;
if (column !== clickedColumn) {
this.setState({
column: clickedColumn,
data: _.sortBy(data, [clickedColumn]),
direction: 'ascending',
});
return;
}
this.setState({
data: data.reverse(),
direction: direction === 'ascending' ? 'descending' : 'ascending',
});
}
render() {
const { transactions } = this.state;
const {
listType,
} = this.props;
const { column, direction } = this.state;
console.log('-------');
console.log(transactions);
console.log('----END----');
const path = (listType === 'BuyerTransactions') ? 'buy' : 'sell';
return (
<div>
<Table sortable compact singleLine>
<Table.Header>
<Table.Row>
<Table.HeaderCell
sorted={column === 'Primary' ? direction : null}
onClick={this.handleSort('Primary')}
>
Primary Name
</Table.HeaderCell>
<Table.HeaderCell
sorted={column === 'Transaction' ? direction : null}
onClick={this.handleSort('Transaction')}
>
Transaction ID
</Table.HeaderCell>
<Table.HeaderCell
sorted={column === 'Form' ? direction : null}
onClick={this.handleSort('Form')}
>
Active Form
</Table.HeaderCell>
<Table.HeaderCell
sorted={column === 'Step' ? direction : null}
onClick={this.handleSort('Step')}
>
Active Step
</Table.HeaderCell>
<Table.HeaderCell
sorted={column === 'Name' ? direction : null}
onClick={this.handleSort('Name')}
>
Seller Name
</Table.HeaderCell>
</Table.Row>
</Table.Header>
<Table.Body>
{transactions
&& transactions.map(
transaction => transaction && (
<Table.Row key={transaction.id}>
{_.has(transaction.involvedParties, 'prime') && (
<Table.Cell>{transaction.involvedParties.prime}</Table.Cell>
)
}
<Table.Cell>{transaction.id}</Table.Cell>
<Table.Cell>{transaction.activeForm}</Table.Cell>
<Table.Cell>{transaction.activeStep}</Table.Cell>
<Table.Cell>HERE</Table.Cell>
<Table.Cell>
<Button
color="grey"
onClick={() => TransactionListingSLice.editForm(`/app/${path}/${transaction.id}`)}
>
Edit
</Button>
</Table.Cell>
</Table.Row>
),
)}
</Table.Body>
</Table>
</div>
);
}
}
在渲染函数中,您使用状态中的交易字段,但在 handleSort 中,您试图对数据字段进行排序。我认为这是主要问题 ;)