【发布时间】:2021-08-11 16:43:42
【问题描述】:
我有一个问题,我的状态仅在第二次点击时设置。我一直在阅读有关提升我试图实现的状态的信息,但我仍然遇到与此按钮相同的问题。状态传递有多个组件,也许这就是我可以使用一些帮助了解如何解决此问题的问题我会尝试以最简单的方式概述:
我有我的父表组件:
const TableView = ({...all the props}) => {
const [sort, setSortBy] = useState({
sortBy: "",
order: "",
});
const handleOnsortChange = (values) => {
setSortBy(values);
trimData(items.sort(sorter), pageNumber, 50);
};
// sort function
const sorter = (a, b) => { ...}
return (
<Table>
<TableHeader handleOnsortChange={handleOnsortChange} sort={sort} />
...
)
表头组件:
const TableHeader = ({ handleOnsortChange, sort }) => {
const onSortChange = (value) => {
handleOnsortChange(value);
};
return (
<thead className="payroll-list-header">
<tr>
<th>
<span>Name</span> <SortView onChange={onSortChange} type={"fullName"} sort={sort} />
<div className="arrow"></div>
</th> ...
)
分拣机组件:
const SortView = ({ onChange, type, sort: { sortBy, order } }) => {
const onClick = (order) => {
onChange({ sortBy: type, order });
};
return (
<div className="sort">
<div onClick={() => onClick("asc")} className="icon-up">
<Octicon
icon={TriangleUp}
className={`${order === "asc" && sortBy == type ? "active" : ""}`}
></Octicon>
</div>
<div onClick={() => onClick("desc")} className="icon-down">
<Octicon
icon={TriangleDown}
className={`${order === "desc" && sortBy == type ? "active" : ""}`}
></Octicon>
</div>
</div>
);
};
更新:
TrimData & sorter 函数:在这些函数之外,sort 的状态会更新,但在我控制台 sort 内部时它是空的。
//sort providers
const sorter = (a, b) => {
const nameA = a.FullName.toUpperCase();
const nameB = b.FullName.toUpperCase();
let compare = 0;
if (sort.sortBy === "fullName") {
if (nameA > nameB) {
compare = 1;
} else if (nameA < nameB) {
compare = -1;
}
if (sort.order === "asc") {
return compare;
} else if (sort.order === "desc") {
return compare * -1;
}
};
const trimData = (items, pageNumber, rows) => {
const pages = items.length > 0 ? Math.ceil(items.length / rows) : 1;
const trimStart = (pageNumber - 1) * rows;
const trimEnd = trimStart + rows;
const trimedData = items.slice(trimStart, trimEnd);
setEndRange(trimEnd);
setTrimedData(trimedData);
setNumberOfPages(pages);
};
您可以看到sort 被传递到排序组件并在父组件中设置。我试过在后代组件中设置它,但这没有帮助。也通过setSortBy 提供了相同的结果。我希望这不是一个大代码块,有人可以向初级开发人员提供建议:)
【问题讨论】:
-
你确定状态保持不变,不是排序本身没有发生吗?这可能是因为初始排序已经是您尝试将其更改为的。
-
排序的哪一部分不起作用?您提供的代码仅显示排序表“标题”。 “标题” (
Octicon) 是否显示正确的order和sortBy值?如果是这样,则sort值的状态设置正确。实际排序本身不起作用吗?如果是这样,请提供有关trimData正在做什么以及items是什么的详细信息。我之所以问,是因为在我看来,一切都在以一种应该正确更新的方式传递下去。 -
进一步调查后,我意识到状态正在设置,但由于某种原因,更新后的状态没有反映在我的辅助函数中。即
trimData和sorter。我会将它们添加到问题中
标签: javascript reactjs react-hooks state