【问题标题】:Ant Design Dynamic Data does not binds to SelectAnt Design 动态数据不绑定到 Select
【发布时间】:2022-01-09 13:16:24
【问题描述】:

我正在为一个学校项目使用 react。动态数据不绑定到 Ant Design 的 Options,react js。结果是一个空的选项列表。实际上,数据来自外部 API。出于测试目的,我为数据分配了状态变量。数据以二维数组的形式出现,所以我对数据进行了两次映射。

结果是:

import { useEffect, useState } from "react";
import { Select } from "antd";
const { Option } = Select;

const Complete = () => {
    const [list, setPersons] = useState([
        [
            {
                id: 1,
                personName: "Owan",
            },
            {
                id: 2,
                personName: "More",
            },
            {
                id: 3,
                personName: "Jaila",
            },
            {
                id: 4,
                personName: "Eerov",
            },
        ],
        [
            {
                id: 5,
                personName: "Rell",
            },
            {
                id: 6,
                personName: "Juko",
            }
        ]
    ]);


    

    useEffect(() => {
        console.log(list);
    }, []);

    return (
        <Select
            showSearch
            style={{ width: 200 }}
            placeholder="Select a person"
            optionFilterProp="children"
            
            filterOption={(input, option) =>
                option.children.toLowerCase().indexOf(input.toLowerCase()) >= 0
            }
        >
            {list.map((l) => {

                l.map((person) => {
                    console.log(person);
                    <Option value={person.id}>
                        {person.personName}
                    </Option>;
                });
            })}
        </Select>
    );
};

export default Complete;

【问题讨论】:

    标签: reactjs react-hooks antd


    【解决方案1】:

    您只需要使用 ES6 功能更新小的脚本即可将 二维数组合并为单个数组

    {[].concat(...list).map((l) => <Option value={l.id}>{l.personName}</Option>)}
    

    这里是完整的脚本:

    import { useEffect, useState } from "react";
    import { Select } from "antd";
    const { Option } = Select;
    
    const Complete = () => {
        const [list, setPersons] = useState([
            [
                {
                    id: 1,
                    personName: "Owan",
                },
                {
                    id: 2,
                    personName: "More",
                },
                {
                    id: 3,
                    personName: "Jaila",
                },
                {
                    id: 4,
                    personName: "Eerov",
                },
            ],
            [
                {
                    id: 5,
                    personName: "Rell",
                },
                {
                    id: 6,
                    personName: "Juko",
                }
            ]
        ]);
    
    
        
    
        useEffect(() => {
            console.log(list);
        }, []);
    
        return (
            <Select
                showSearch
                style={{ width: 200 }}
                placeholder="Select a person"
                optionFilterProp="children"
                
                filterOption={(input, option) =>
                    option.children.toLowerCase().indexOf(input.toLowerCase()) >= 0
                }
            >
                {[].concat(...list).map((l) => <Option value={l.id}>{l.personName}</Option>)}
            </Select>
        );
    };
    
    export default Complete;
    

    访问实时示例demo

    【讨论】:

      【解决方案2】:

      试试下面的代码:

      import { useEffect, useState } from "react";
      import { Select } from "antd";
      const { Option } = Select;
      
      const Complete = () => {
        const [list, setPersons] = useState([
          [
            {
              id: 1,
              personName: "Owan"
            },
            {
              id: 2,
              personName: "More"
            },
            {
              id: 3,
              personName: "Jaila"
            },
            {
              id: 4,
              personName: "Eerov"
            }
          ],
          [
            {
              id: 5,
              personName: "Rell"
            },
            {
              id: 6,
              personName: "Juko"
            }
          ]
        ]);
      
        useEffect(() => {
          console.log(list);
        }, [list]);
      
        return (
          <Select
            showSearch
            style={{ width: 200 }}
            placeholder="Select a person"
            optionFilterProp="children"
            filterOption={(input, option) =>
              option.children.toLowerCase().indexOf(input.toLowerCase()) >= 0
            }
          >
            {list.map((l) => (
              <>
                {l.map((person) => (
                  <Option value={person.id}>{person.personName}</Option>
                ))}
              </>
            ))}
          </Select>
        );
      };
      
      export default Complete;
      

      【讨论】:

      • 您好,谢谢您的回答,我想知道您所做的更改,除了在useEffect中添加“列表”。我刚刚在我的代码中添加了它,它不起作用。实际上,我之前尝试过。
      • 检查这个沙盒。 codesandbox.io/embed/…用户在map方法中返回括号()不是{}花括号
      • 顺便说一句,我看你用过, > 在 {list.map((l) => (..... 为什么会这样?
      • 很高兴为您提供帮助!
      • reactjs.org/docs/fragments.html 阅读本文,不要忘记点赞谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-23
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      • 2018-12-10
      相关资源
      最近更新 更多