当前位置:首页 > React

react实现级联

2026-01-26 15:08:31React

实现级联选择器的基本思路

级联选择器通常用于处理具有层级关系的数据,例如省市区选择。React中可以通过状态管理和组件联动实现这一功能。

数据结构的组织

采用嵌套结构或扁平化结构存储级联数据。嵌套结构更适合展示父子关系:

const data = [
  {
    id: 1,
    name: '北京',
    children: [
      { id: 11, name: '海淀区' },
      { id: 12, name: '朝阳区' }
    ]
  }
]

状态管理方案

使用useState或useReducer管理当前选择的各级数据:

const [selectedValues, setSelectedValues] = useState({
  level1: null,
  level2: null,
  level3: null
});

组件联动实现

创建多个关联的选择器组件,下级选择器根据上级选择结果动态渲染:

function Cascader({ data }) {
  const [selected, setSelected] = useState({});

  const handleChange = (level, value) => {
    setSelected(prev => ({
      ...prev,
      [level]: value,
      // 清空下级选择
      ...Object.fromEntries(
        Object.keys(prev)
          .filter(key => parseInt(key.replace('level', '')) > parseInt(level.replace('level', '')))
          .map(key => [key, null])
      )
    }));
  };

  return (
    <div>
      <Select 
        options={data} 
        onChange={(value) => handleChange('level1', value)} 
      />

      {selected.level1 && (
        <Select
          options={data.find(item => item.id === selected.level1)?.children || []}
          onChange={(value) => handleChange('level2', value)}
        />
      )}
    </div>
  );
}

性能优化建议

对于大数据量的级联选择,可采用以下优化方案:

  • 虚拟滚动技术处理长列表
  • 异步加载下级数据
  • 使用React.memo避免不必要的渲染

完整示例代码

import React, { useState } from 'react';

const Cascader = ({ data }) => {
  const [selected, setSelected] = useState({
    province: null,
    city: null,
    district: null
  });

  const handleProvinceChange = (value) => {
    setSelected({
      province: value,
      city: null,
      district: null
    });
  };

  const handleCityChange = (value) => {
    setSelected(prev => ({
      ...prev,
      city: value,
      district: null
    }));
  };

  const currentProvince = data.find(p => p.id === selected.province);
  const currentCity = currentProvince?.children?.find(c => c.id === selected.city);

  return (
    <div className="cascader">
      <select 
        value={selected.province || ''} 
        onChange={(e) => handleProvinceChange(e.target.value)}
      >
        <option value="">选择省份</option>
        {data.map(province => (
          <option key={province.id} value={province.id}>
            {province.name}
          </option>
        ))}
      </select>

      {selected.province && (
        <select
          value={selected.city || ''}
          onChange={(e) => handleCityChange(e.target.value)}
        >
          <option value="">选择城市</option>
          {currentProvince.children.map(city => (
            <option key={city.id} value={city.id}>
              {city.name}
            </option>
          ))}
        </select>
      )}

      {selected.city && (
        <select
          value={selected.district || ''}
          onChange={(e) => setSelected(prev => ({...prev, district: e.target.value}))}
        >
          <option value="">选择区县</option>
          {currentCity.children.map(district => (
            <option key={district.id} value={district.id}>
              {district.name}
            </option>
          ))}
        </select>
      )}
    </div>
  );
};

第三方库推荐

对于复杂场景,可以考虑以下成熟方案:

react实现级联

  • antd Cascader组件
  • rc-cascader
  • react-cascader

这些库提供了丰富的功能如异步加载、搜索过滤、自定义渲染等。

标签: 级联react
分享给朋友:

相关文章

react如何遍历

react如何遍历

遍历数组或对象的方法 在React中,遍历数组或对象通常用于渲染列表或动态生成内容。以下是几种常见的遍历方法: 使用map遍历数组map是遍历数组并返回新数组的高阶函数,适合渲染列表。 con…

react如何拓展

react如何拓展

React 拓展方法 使用高阶组件(HOC) 高阶组件是一种复用组件逻辑的方式,通过接收一个组件并返回一个新组件实现功能拓展。例如,为组件添加日志功能: function withLogging…

如何启动react

如何启动react

安装Node.js 确保系统已安装Node.js(建议使用LTS版本),可通过官网下载并安装。安装完成后,在终端运行以下命令验证版本: node -v npm -v 创建React项目 使用官方工具…

如何提高react

如何提高react

优化性能 使用React.memo对组件进行记忆化处理,避免不必要的重新渲染。对于类组件,可以使用PureComponent来达到类似效果。 利用useMemo缓存计算结果,避免重复计算。对于函数或…

react如何发布

react如何发布

发布React应用的步骤 构建生产版本 使用以下命令生成优化后的生产版本代码,代码会被压缩并移除开发环境中的调试工具: npm run build 构建完成后会生成build文件夹,包含所有静态资源…

react如何配置

react如何配置

配置React项目的基本步骤 安装Node.js和npm 确保系统已安装Node.js(包含npm)。可通过命令行检查版本: node -v npm -v 创建React项目 使用官方工具Creat…