Как вызвать API в условном выражении с помощью React

#reactjs

Вопрос:

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

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

 import React from 'react';
import { Modal } from 'react-bootstrap';
import FormResolveDispute from '../forms/form-resolve-dispute';
import { useGetAllMovementsByTiersQuery } from '../../services/EventApi';

const ModalResolveEvent = (props: any) => {
const {show, onClose, dispute} = props;
if (show) {
    const {mouvement} = useGetAllMovementsByTiersQuery(
        {
            qp: new URLSearchParams({
                eventId: dispute.id,
            }).toString(),
        },
        {
            selectFromResult: ({data}) => ({
                movement: data?.items || [],
            }),
        }
    );
    return data;
}
return (
    <>
        <Modal show={show} onHide={onClose} centered={true} scrollable={true}>
            <Modal.Header closeButton>
                <Modal.Title className="text-title">
                    Test
                </Modal.Title>
            </Modal.Header>
            <Modal.Body>
                <FormResolveDispute
                    mvts={mouvement}
                    submitCallback={onClose}
                />
            </Modal.Body>
        </Modal>
    </>
   );
 };

 export default ModalResolveEvent;
 

здесь я проверяю, стоит ли show true звонить

  if (show) {
   const {movement} = useGetAllMovementsByTiersQuery(
    {
        qp: new URLSearchParams({
            eventId: dispute.id,
        }).toString(),
    },
    {
        selectFromResult: ({data}) => ({
            movement: data?.items || [],
        }),
    }
);
return movement;
 

}

и я хотел бы внедрить движение в FormResolveDispute компонент.

    <FormResolveDispute mvts={movement} submitCallback={onClose} />
 

Но у меня есть следующее сообщение об ошибке

 TS2304: Cannot find name 'movement'.
 

Я хотел бы получить движение, сгенерированное в кондитонале, чтобы отправить его обратно в FormResolveEvent

Не могли бы вы сказать мне, в чем проблема или есть ли другой способ ?

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

1. TS2304: Cannot find name 'movement'. Это потому, что движение находится внутри области, которую вы должны осознавать. На мой взгляд, вы можете сохранить движение до состояния.

2. @edhi.uchiha Спасибо за ваш ответ, но как реализовать это изменение ?

Ответ №1:

Пожалуйста, попробуйте это.

 // create initial state
const [movement, setMovement] = useState([]);

if (show) {
const { movement } = useGetAllMovementsByTiersQuery(
    {
        qp: new URLSearchParams({
            eventId: dispute.id,
        }).toString(),
    },
    {
        selectFromResult: ({data}) => ({
            movement: data?.items || [],
        }),
    }
   );

// set state
setMovement(movement);
}
 

Таким образом, в этом компоненте реквизит движения-это получить из состояния

 <FormResolveDispute
     mvts={movement}
     submitCallback={onClose}
     />
 

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

1. спасибо за ответ, но модификация выдает мне сообщение об ошибке: крючок реакции» useGetAllMovementsByTiersQuery » не может быть вызван внутри обратного вызова. Крючки реакции должны вызываться в компоненте функции реакции или пользовательской функции крюка реакции. Я думаю, что крючок реакции нельзя использовать в условных

2. Вы используете класс или функциональный компонент ?

3. функциональный компонент

4. хм, но проблема не в том, что крючок используется в условном