排序 Table 语义 UI React 不工作?
Sorting Table Semantic UI React not working?
大家好,我刚刚从网站上复制了来自 React Semantic Ui https://react.semantic-ui.com/collections/table/#variations-sortable 的数据表代码,一切正常,除了降序排序不起作用,当我第一次点击它按升序排序,但是当我再次点击时(控制台打印降序)但是 table 中没有任何变化。
import _ from 'lodash'
import React from 'react'
import { Table } from 'semantic-ui-react'
const tableData = [
{ name: 'John', age: 15, gender: 'Male' },
{ name: 'Amber', age: 40, gender: 'Female' },
{ name: 'Leslie', age: 25, gender: 'Other' },
{ name: 'Ben', age: 70, gender: 'Male' },
]
function exampleReducer(state, action) {
switch (action.type) {
case 'CHANGE_SORT':
if (state.column === action.column) {
return {
...state,
data: state.data.reverse(),
direction:
state.direction === 'ascending' ? 'descending' : 'ascending',
}
}
return {
column: action.column,
data: _.sortBy(state.data, [action.column]),
direction: 'ascending',
}
default:
throw new Error()
}
}
function TableExampleSortable() {
const [state, dispatch] = React.useReducer(exampleReducer, {
column: null,
data: tableData,
direction: null,
})
const { column, data, direction } = state
return (
<Table sortable celled fixed>
<Table.Header>
<Table.Row>
<Table.HeaderCell
sorted={column === 'name' ? direction : null}
onClick={() => dispatch({ type: 'CHANGE_SORT', column: 'name' })}
>
Name
</Table.HeaderCell>
<Table.HeaderCell
sorted={column === 'age' ? direction : null}
onClick={() => dispatch({ type: 'CHANGE_SORT', column: 'age' })}
>
Age
</Table.HeaderCell>
<Table.HeaderCell
sorted={column === 'gender' ? direction : null}
onClick={() => dispatch({ type: 'CHANGE_SORT', column: 'gender' })}
>
Gender
</Table.HeaderCell>
</Table.Row>
</Table.Header>
<Table.Body>
{data.map(({ age, gender, name }) => (
<Table.Row key={name}>
<Table.Cell>{name}</Table.Cell>
<Table.Cell>{age}</Table.Cell>
<Table.Cell>{gender}</Table.Cell>
</Table.Row>
))}
</Table.Body>
</Table>
)
}
export default TableExampleSortable
也许减速器不喜欢它的状态被直接操纵的事实:state.data.reverse()
,所以我试图通过
解决它
使用 lodash 方法进行排序和克隆 data: _.reverse(_.clone(state.data))
。
不使用 lodash data: state.data.slice().reverse()
这两种方式似乎都有效。
大家好,我刚刚从网站上复制了来自 React Semantic Ui https://react.semantic-ui.com/collections/table/#variations-sortable 的数据表代码,一切正常,除了降序排序不起作用,当我第一次点击它按升序排序,但是当我再次点击时(控制台打印降序)但是 table 中没有任何变化。
import _ from 'lodash'
import React from 'react'
import { Table } from 'semantic-ui-react'
const tableData = [
{ name: 'John', age: 15, gender: 'Male' },
{ name: 'Amber', age: 40, gender: 'Female' },
{ name: 'Leslie', age: 25, gender: 'Other' },
{ name: 'Ben', age: 70, gender: 'Male' },
]
function exampleReducer(state, action) {
switch (action.type) {
case 'CHANGE_SORT':
if (state.column === action.column) {
return {
...state,
data: state.data.reverse(),
direction:
state.direction === 'ascending' ? 'descending' : 'ascending',
}
}
return {
column: action.column,
data: _.sortBy(state.data, [action.column]),
direction: 'ascending',
}
default:
throw new Error()
}
}
function TableExampleSortable() {
const [state, dispatch] = React.useReducer(exampleReducer, {
column: null,
data: tableData,
direction: null,
})
const { column, data, direction } = state
return (
<Table sortable celled fixed>
<Table.Header>
<Table.Row>
<Table.HeaderCell
sorted={column === 'name' ? direction : null}
onClick={() => dispatch({ type: 'CHANGE_SORT', column: 'name' })}
>
Name
</Table.HeaderCell>
<Table.HeaderCell
sorted={column === 'age' ? direction : null}
onClick={() => dispatch({ type: 'CHANGE_SORT', column: 'age' })}
>
Age
</Table.HeaderCell>
<Table.HeaderCell
sorted={column === 'gender' ? direction : null}
onClick={() => dispatch({ type: 'CHANGE_SORT', column: 'gender' })}
>
Gender
</Table.HeaderCell>
</Table.Row>
</Table.Header>
<Table.Body>
{data.map(({ age, gender, name }) => (
<Table.Row key={name}>
<Table.Cell>{name}</Table.Cell>
<Table.Cell>{age}</Table.Cell>
<Table.Cell>{gender}</Table.Cell>
</Table.Row>
))}
</Table.Body>
</Table>
)
}
export default TableExampleSortable
也许减速器不喜欢它的状态被直接操纵的事实:state.data.reverse()
,所以我试图通过
使用 lodash 方法进行排序和克隆
data: _.reverse(_.clone(state.data))
。不使用 lodash
data: state.data.slice().reverse()
这两种方式似乎都有效。