You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在React.js中通过下拉框实现数据排序?组件传值方案咨询

实现下拉框控制数据排序的方案

要在保持Dropdown和DisplayData组件独立的前提下实现排序功能,核心思路是将共享状态提升到父组件App.js,通过React单向数据流传递状态和回调,具体步骤如下:

1. 改造父组件App.js

把排序状态和数据排序逻辑放在App组件中,作为两个子组件的中间协调者:

import { useState } from 'react';
import DropDown from './DropDown';
import DisplayData from './DisplayData';

// 原始数据抽离到父组件(也可单独存文件,提升维护性)
const rawRecords = [
    { SR: 1, Name: 'Aakash', Age: 25 },
    { SR: 4, Name: 'Zahir', Age: 32 },
    { SR: 3, Name: 'Mohan', Age: 23 },
    { SR: 2, Name: 'Parul', Age: 42 },
    { SR: 9, Name: 'Himanshu', Age: 18 },
];

function App() {
    // 管理排序类型状态,默认升序
    const [sortType, setSortType] = useState('lowtohigh');

    // 根据排序类型处理数据(浅拷贝原数组避免修改原始数据)
    const sortedRecords = [...rawRecords].sort((a, b) => {
        return sortType === 'lowtohigh' ? a.Age - b.Age : b.Age - a.Age;
    });

    // 接收Dropdown的选择事件,更新排序状态
    const handleSortChange = (e) => {
        setSortType(e.target.value);
    };

    return (
        <div className="App">
            {/* 传递当前排序值和回调给Dropdown */}
            <DropDown sortType={sortType} onSortChange={handleSortChange} />
            {/* 传递排序后的数据给DisplayData */}
            <DisplayData data={sortedRecords} />
        </div>
    );
}

export default App;

2. 修改Dropdown组件(受控组件)

让Dropdown只负责接收父组件的状态和回调,专注于选择交互,不管理内部状态:

const DropDown = ({ sortType, onSortChange }) => {
    return (
        <>
            <select value={sortType} onChange={onSortChange}>
                <option value="lowtohigh">Age: Low to High</option>
                <option value="hightolow">Age: High to Low</option>
            </select>
        </>
    );
};

export default DropDown;

3. 修改DisplayData组件(纯展示组件)

移除内部的数据定义,改为接收父组件传入的数据,专注于渲染逻辑:

const DisplayData = ({ data }) => {
    return (
        <>
            <table>
                {/* 添加表头提升表格可读性 */}
                <tr>
                    <th>SR</th>
                    <th>Name</th>
                    <th>Age</th>
                </tr>
                {data.map((rec, index) => (
                    <tr key={index}>
                        <td>{rec.SR}</td>
                        <td>{rec.Name}</td>
                        <td>{rec.Age}</td>
                    </tr>
                ))}
            </table>
        </>
    );
};

export default DisplayData;

方案优势

  • 组件职责清晰:Dropdown仅处理选择交互,DisplayData仅负责数据渲染,各自保持独立可复用性
  • 遵循单向数据流:状态由父组件统一管理,子组件通过props接收数据和回调,避免组件间直接耦合

内容的提问来源于stack exchange,提问作者kapildevsharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 12:45:37