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

React渲染JSON数组元素全部显示在单行,如何实现每行渲染一个值?

问题原因

你当前的写法直接把types数组整体放到JSX中渲染,React会自动将数组转为逗号拼接的字符串,同时你遍历的是最外层的dummyData数组(该数组仅包含1个district对象),所以只会生成1个选项容器,所有类型自然都挤在同一行。

修复方案

调整遍历逻辑,先拿到types数组再对其内部的每个值单独遍历渲染,同时修正数组map的参数顺序(map第一个参数是当前遍历元素,第二个才是索引),修改后的代码如下:

import React, { useState } from "react";
import './category.css';
import { IoMdArrowDropdown } from 'react-icons/io';
import { GoTriangleUp } from 'react-icons/go';
import dummyData from '../../../json_data/dummy_data.json'

const SearchBox = () => {
    const [open, setOpen] = useState(false);
    const [dropDownValue, setDropDownValue] = useState(null);

    const onSelect = (value) => {
        setDropDownValue(value);
        setOpen(!open);
    };

    // 先取出types数组,如果dummyData有多条district数据,可以根据自己的需求筛选后再取types
    const typeList = dummyData[0]?.types || [];

    return (
        <div className="box_category">
            <div className="category_caption">Categories</div>
            <div className="block_drop">
                <div className="category_dropdown">
                    <div className="category_box">            
                        {dropDownValue === null ? "Enter Category" : dropDownValue}                     
                    </div>
                    <div className="category_dropIcon" onClick={() => setOpen(prev => !prev)}>
                        {open ? <GoTriangleUp size={"22px"} /> : <IoMdArrowDropdown size={"30px"} />}
                    </div>
                </div>
                <div className={open ? "category_option" : "category_option_block"}>
                    {/* 遍历types数组的每个值,单独渲染选项 */}
                    {typeList.map((typeItem, index) => (
                        <div 
                            key={index} 
                            className="select_options" 
                            onClick={() => onSelect(typeItem)}
                        >
                            {typeItem}
                        </div>
                    ))}
                </div>
            </div>
        </div>
    );
}

export default SearchBox;
补充说明

如果你的dummyData后续会包含多个district对象,需要先遍历所有district,再每个district下遍历对应的types列表即可,示例如下:

{dummyData.map((districtItem, districtIndex) => (
  <div key={districtIndex}>
    <div className="district_title">{districtItem.district}</div>
    {districtItem.types.map((typeItem, typeIndex) => (
      <div 
        key={typeIndex} 
        className="select_options" 
        onClick={() => onSelect(typeItem)}
      >
        {typeItem}
      </div>
    ))}
  </div>
))}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 02:27:03