Как добавить два разных компонента по щелчку друг друга в react-native

#typescript #react-native #react-hooks #react-native-android #react-native-ios

Вопрос:

У меня есть компонент StatusBoxComponent , который имеет два статуса: Break-In и Break-out ,

Таким образом, изначально Break-In окно будет видно при открытии этого экрана.

Теперь я хотел, чтобы, когда я нажимаю Break-in на коробку, сразу под Break-out ней должна появиться коробка, и на этой Break-out коробке я снова хотел нажать вот эту, чтобы Break-in коробка была ниже этой. И этот процесс должен продолжаться.

 const AttendanceScreen = (props: any) => {

    const [inState, setInState] = useState([<View />]);
    
    const breakOutClick = () => {
        setInState([
            ...inState,
            <>
                <StatusBoxComponent
                    status={'Break-In'}
                    breakIn={breakInClick}      // Point 3
                />
                {inState}
            </>,
        ]);
    };

    const breakInClick = () => {
        setInState([
            ...inState,
            <>
                <StatusBoxComponent
                    status={'Break-Out'}
                    breakIn={breakOutClick}      // Point 2
                />
                {inState}
            </>,
        ]);
    };

    return (
        <>
            <StatusBoxComponent
                status={'Break-In'}
                breakIn={breakInClick}      // Point 1
            />
            {inState}
        </>
    );
};
 

Но, что происходит, когда я сначала нажимаю break-in , появляется одно break-out поле, но когда я нажимаю на это break-out , то вместо добавления нового поля ниже оно заменяет текущее поле. И когда вы нажимаете на начальное break-in поле, ниже добавляется более 1 break-in поля.

Я не знаю, где в моей логике я ошибаюсь.

Ответ №1:

Хранение компонентов внутри состояния, как правило, является плохой идеей, когда вы можете управлять своим состоянием с помощью сериализуемых значений.

 const AttendanceScreen = (props: any) => {

    const [statuses, setStatuses] = useState(['Break-In']);

    
    
    const breakOutClick = () => {
        setStatuses([
            ...statuses,
            'Break-In',
        ]);
    };

    const breakInClick = () => {
        setStatuses([
            ...statuses,
            'Break-Out',
        ]);
    };

    return (
        <>
            {statuses.map((status, index) => (
                 <StatusBoxComponent
                     key={index}
                     status={status}
                     breakIn={breakInClick}      // Point 1
                 />
            )}
        </>
    );
};
 

Комментарии:

1. setInState([ ...inState, 'Break-Out',]); получение ошибки здесь: Type 'string | Element' is not assignable to type 'Element'. Type 'string' is not assignable to type 'Element'.

2. @pratteekshaurya я обновил код. inState => statuses