【问题标题】:Data Changed but front-end did not updated数据已更改,但前端未更新
【发布时间】:2020-12-30 16:03:34
【问题描述】:

我设计了一个表格,它将读取一个对象数组和一个用于排序控制的下拉列表。

但是,当我在下拉列表中选择其他排序值时。前端表没有同时更新。会有延迟,请看下面的例子。

T0:默认按“名称”选择顺序 -> 前端正确(按“名称”排序)

T1: select order by "age" -> 前端不更新(还是按"name"排序)

T2: select order by "name" -> 前端更新(order by "age")

T3: select order by "age" -> 前端更新(order by "name")

我的对象数组

var data = [
    {
        key: 1,
        name: 'AAA',
        age: '10',
    },
    {
        key: 2,
        name: 'BBB',
        age: '8',
    },
    {
        key: 3,
        name: 'name',
        age: '12',
    },
]
const [listData, setListData] = useState(data);

下拉控件

const handleOrderChange = (value) => {
    setOrderValue(value);
};

useEffect(() => {
    console.log(orderValue.value); //match what I click
    switch (orderValue.value) {
        case 'name':
            listData.sort((a, b) => (a.name > b.name ? 1 : -1));
            break;
        case 'age':
            listData.sort((a, b) => (a.age> b.age? 1 : -1));
            break;
        default:
            console.log('Default');
    }
    console.log(listData); //match what I expected
}, [orderValue]);

前端

{/* Data */}
        {listData.map((item) => (
            <DataDetail
                key={item.key}
                name={item.name}
                age={item.age}
            ></DataDetail>
        ))}

【问题讨论】:

    标签: reactjs frontend


    【解决方案1】:

    你不应该像这样改变状态变量:

        switch (orderValue.value) {
                case 'name':
                    listData.sort((a, b) => (a.name > b.name ? 1 : -1));
                    break;
                case 'age':
                    listData.sort((a, b) => (a.age> b.age? 1 : -1));
                    break;
                default:
                    console.log('Default');
            }
    

    你应该使用:

    useEffect(() => {
        switch (orderValue.value) {
                case 'name':
                    const listDataCopy = [...listData]
                    listDataCopy.sort((a, b) => (a.name > b.name ? 1 : -1));
                    setListData(listDataCopy)
                    break;
                case 'age':
                    const listDataCopy = [...listData]
                    listDataCopy.sort((a, b) => (a.age> b.age? 1 : -1));
                    setListData(listDataCopy)
                    break;
                default:
                    console.log('Default');
            }
    }, [orderValue, listData, setListData]);
    

    【讨论】:

    • this 可能对你有用
    • 谢谢!!!解决方案工作。我会阅读你给我的链接。再次感谢!
    • 没问题,愉快的编码
    猜你喜欢
    • 2018-01-04
    • 2021-11-06
    • 2012-11-22
    • 2013-02-26
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多