javascript - 对数据进行排序并在 UI 上渲染无法使用 React hooks

标签 javascript reactjs

我是新手,我想创建一个可以按价格(工资)排序的列表。我的 api 响应是假设 -

[
    {
        "id":1,
        "name": "Person 1",
        "salary": 300
    },
    {
        "id":2,
        "name": "Person 2",
        "salary": 100
    },
    {
        "id":3,
        "name": "Person 3",
        "salary": 200
    }
]

我正在尝试使用钩子(Hook) useStateuseEffect 来获取数据并填充 UI

const salary = () => {

    const [salaryState, setsalaryState] = useState([]);
    const [load, setLoad] = useState(false);
    const [geterror, setError] = useState('');

    useEffect(() => {
        axios.get('https://apiCall')
        .then(response => {
            setsalaryState(response.data);
            setLoad(true);
        })
        .catch(error => {
            setError(error.message);
            console.log('error', geterror);
        })
    },[]);

    const handleSalrySort = () => {
        var sortAsc = salaryState.sort((a,b) => {
            return parseFloat(a.salary) - parseFloat(b.salary)
        });
        setsalaryState(sortAsc);
        console.log('sortAsc', sortAsc);
    }

    if(load){
        return (
            <div className="container-fluid pt-3">
                <div onClick={handleSalrySort}>Salary - Low to High</div>
                {
                    salaryState.map((sal,index) => {
                        return(
                            <div>
                                Person : {sal.name}
                                Salary: {sal.salary}
                            </div>      
                        )
                    })
                }
            </div>
        )
    }else{
        return(
            <div></div>
        )
    }
}

使用handleSalrySort函数后,我可以更新状态salaryState,但它没有反射(reflect)在UI上。你能帮我吗?

最佳答案

数组是引用类型。因此,您需要使用map、slice等来获取新的数据副本。否则,React不会检测到数据已更改,因为它指向相同的内存引用。

我使用了 slice() 方法。要按 DESC 顺序排序,应返回 b-a

 const handleSalrySort = () => {
    var sortAsc = salaryState.slice().sort((a, b) => {
      return parseFloat(b.salary) - parseFloat(a.salary);
    });
    setsalaryState(sortAsc);
    console.log("sortAsc", sortAsc);
  };

关于javascript - 对数据进行排序并在 UI 上渲染无法使用 React hooks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59308907/

相关文章:

javascript - JavaScript 中的函数如何被视为变量?

javascript - 从 Jquery 数据表中的 <tr> 标签获取 id

javascript - 一旦单个元素换行,其余元素也会换行

javascript - React HOC 与辅助类?

javascript - 类型错误 : readonly assignment error with React application in Safari

javascript - 制作购物车

javascript - 切换复选框时无法启用/禁用文本框

javascript - React router - 在我刷新浏览器之前页面不会呈现

html - 具有绝对位置的父级内部高度自动

javascript - 从 TypeScript 生成 PropType