Javascript React Hooks状态未使用正确的输出进行更新
我在用鱼钩。我试图对从API获取的数据进行排序,并用新排序的数据更新状态Javascript React Hooks状态未使用正确的输出进行更新,javascript,reactjs,react-hooks,state,Javascript,Reactjs,React Hooks,State,我在用鱼钩。我试图对从API获取的数据进行排序,并用新排序的数据更新状态 const [runs, setRuns] = useState({ runs: [], }); const [altConcentrationRuns, setAltConcentrationRuns ] = useState({ altConcentrationRuns : [] }) async function handleRuns() { getRuns().then((resu
const [runs, setRuns] = useState({
runs: [],
});
const [altConcentrationRuns, setAltConcentrationRuns ] = useState({
altConcentrationRuns : []
})
async function handleRuns() {
getRuns().then((result) => {
setRuns(result.rows);
setFilteredRuns(result.rows);
//function to sort data according to column header/property
const sortRowsByProperty = (property, direction) => {
return result.rows.sort(function(a,b) {
var A = Object.keys(a)[0];
var B = Object.keys(b)[0];
if(direction == "ascending") {
return (a[A][property] - b[B][property]);
} else if(direction == "descending") {
return b[B][property] - a[A][property];
}
});
}
setAltConcentrationRuns(sortRowsByProperty('altConcentration', 'ascending'));
//not updating, only showing runs
setIsLoading(false);
});
}
useEffect(() => {
setIsLoading(true);
handleRuns();
}, []);
console.log('runs', altConcentrationRuns);
当我控制台记录我的输出时,我没有得到排序的数据,只有原始数据(result.rows)。我做错了什么
谢谢 我发现您的代码中有一个问题。您正在以错误的方式初始化您的状态
const [runs, setRuns] = useState([]);
const [altConcentrationRuns, setAltConcentrationRuns ] = useState([])
这是初始化状态的方式。问题在于你的排序功能。在JS中,要对项目进行排序,通常的做法是在
a
时返回-1
,在a==b
时返回0
,在a>b
时返回1
。通常可以忽略==
条件,只返回-1
或1
if(方向==“升序”){
返回a[a][property]
这可以进一步优化,但为了便于理解,请保持与代码相似。谢谢,但它仍然没有排序。我在其他数据上测试了我的函数,结果很好。这个答案实际上是不正确的@NadiaChibrikova,你能详细解释一下吗?您不需要返回
-1
、0
或1
,但这些值与需求中所需的负值、0正值对齐。我确实说过应该这样做,因为这是一个最佳实践。返回a[a][property]-b[b][property]
仅对数字有效,但从您的回答来看,排序函数似乎只能对-1、0和1有效,事实并非如此,你可以使用任何正数和负数你读了我其余的评论了吗?你能添加你在控制台中得到的日志吗?一个对象数组,它不是按altConcentration排序的,而是原始的获取数据数组(运行)一个屏幕截图:)altConcentration
确实是一个字符串,你不能对字符串进行子结构,所以你应该遵循@xdumain的建议。此外,排序会对原始数组进行变异,因此当它被排序时,它将被排序到所有位置