Состояние компонента Select из AntD

Я пишу проект на React + TS. Проект - дерево элементов, в котором можно посмотреть характеристики элемента.введите сюда описание изображения

В первом табе находится просто немного информации, во втором - селект. Код выглядит следующим образом:

import { Tabs } from "antd"
import type { TabsProps } from 'antd';
import { useAppSelector } from "../../store/hooks";
import { Properties } from "../../types/types";
import { SelectComponent } from "../Select/Select";
import styled from "styled-components";

const Container = styled.div`
    padding: 10px 0 0 10px;
    display: flex;
    flex-direction: column;
`
const Text = styled.p`
    margin: 0;
    font-size: 16px;
`

export const TreeOptions = () => {
    const { itemProperties }: { itemProperties: Properties[] | [] } = useAppSelector(state => state.tree)

    const items: TabsProps['items'] = itemProperties.map((item, i) => ({
        key: item.id,
        label: item.tabname,
        children: item.editable !== true ?
            <Container>
                {item.options.map((option, i) => <Text key={i}>{option}</Text>)}
            </Container> :
            <Container>
                <SelectComponent options={item} />
            </Container>
    }))

    return <Tabs items={items} />
}

Сам компонент Select выглядит следующим образом:

import { Select } from "antd"
import { useState } from "react";
import styled from "styled-components";

const StyledSelect = styled(Select)`
    width: 100%;
    max-width: 300px;
`

export const SelectComponent = (options: any) => {
    const [selectedValue, setSelectedValue] = useState<string | undefined>(undefined)

    return (
        <StyledSelect  
            value={selectedValue} 
            options={options.options.options.map((item: string) => ({ value: item, label: item }))}
        />
    )
}

Проблема в том, что у всех элементов Select не отдельные локальные state, а один на всех. Я в упор не понимаю почему. Я пытался задавать уникальные key, но это не помогло. Почему это могло произойти и как это можно исправить? На всякий случай, оставлю свой код тут
Буду очень благодарен за помощь и подсказки


Ответы (1 шт):

Автор решения: Owlly

Проблема, заключается в том, что компонент SelectComponent принимает пропсы неправильно. Вы передаёте весь объект options в качестве пропса, но не извлекаете его корректно внутри компонента. Из-за этого у всех SelectComponent не сохраняется уникальный стейт.

export const TreeOptions = () => {
    const { itemProperties }: { itemProperties: Properties[] | [] } = useAppSelector(state => state.tree)

    const items: TabsProps['items'] = itemProperties.map((item) => ({
        key: item.id,
        label: item.tabname,
        children: item.editable !== true ?
            <Container>
                {item.options.map((option, i) => <Text key={i}>{option}</Text>)}
            </Container> :
            <Container>
                <SelectComponent key={item.id} options={item.options} />
            </Container>
    }))

    return <Tabs items={items} />
}

В компоненте SelectComponent:

export const SelectComponent = ({ options }: { options: string[] }) => {
    const [selectedValue, setSelectedValue] = useState<string | undefined>(undefined)

    return (
        <StyledSelect  
            value={selectedValue} 
            onChange={setSelectedValue}
            options={options.map((item: string) => ({ value: item, label: item }))}
        />
    )
}
→ Ссылка