#javascript #reactjs #axios
Вопрос:
Моя цель-запустить модальное всплывающее окно во время нажатия кнопки. У меня возникли проблемы с вызовом API Axios функции, содержащей модал. Процесс вызова API был приведен ниже:
Во-первых: Это кнопка, на которой выполняется запрос на публикацию Axios (AddToCart) (работает нормально)
<button className="button is-primary" onClick={addToCart}>
ADD TO CART
</button>
Во-вторых: Это запрос Axios post, который вызывает модальное всплывающее окно (пример()) (работает нормально)
const addToCart = () => {
Axios.post(
//standard backend API call is made here
)
.then((res) => {
console.log("post called")
Example(); //I want to launch my modal when this state is reached
})
.catch((err) => {
if (err.response amp;amp; err.response.status === 401) {
setIsLoggedIn(false);
}
});
В-третьих: Это модальный, который я хотел бы всплывать, но у меня возникли проблемы с отображением функции (проблема)
https://react-bootstrap.github.io/components/modal/
function Example() {
const [show, setShow] = useState(false);
const handleClose = () => setShow(false);
const handleShow = () => setShow(true);
return (
<>
<Button variant="primary" onClick={handleShow}>
Launch demo modal
</Button>
<Modal show={show} onHide={handleClose}>
<Modal.Header closeButton>
<Modal.Title>Modal heading</Modal.Title>
</Modal.Header>
<Modal.Body>Woohoo, you're reading this text in a modal!</Modal.Body>
<Modal.Footer>
<Button variant="secondary" onClick={handleClose}>
Close
</Button>
<Button variant="primary" onClick={handleClose}>
Save Changes
</Button>
</Modal.Footer>
</Modal>
</>
);
}
render(<Example />);
Я получаю следующую ошибку:
Line 38:3: 'render' is not defined no-undef
Как я могу правильно отобразить свое модальное всплывающее окно?
Ответ №1:
Вместо того, чтобы иметь show
состояние в вашем Example
компоненте, получите эти данные в реквизите. Кроме того, вы также захотите передать некоторые обратные вызовы компоненту, чтобы иметь возможность реагировать на определенные события (например, нажать «Закрыть» или «Сохранить изменения»).
Я бы сделал следующее:
const Example = ({ show, onClose, onSave }) => (
<Modal show={show} onHide={onClose}>
<Modal.Header closeButton>
<Modal.Title>Modal heading</Modal.Title>
</Modal.Header>
<Modal.Body>Woohoo, you're reading this text in a modal!</Modal.Body>
<Modal.Footer>
<Button variant="secondary" onClick={onClose}>
Close
</Button>
<Button variant="primary" onClick={onSave}>
Save Changes
</Button>
</Modal.Footer>
</Modal>
)
Таким образом, вы всегда можете отобразить Example
компонент в каком-либо родительском компоненте и отобразить его условно, например так:
const SomeParentComponent = () => {
const [showExample, setShowExample] = useState(false)
const addToCart = () => {
Axios.post("http://example.com/api/add-to-cart")
.then((res) => {
console.log("post called")
setShowExample(true)
})
.catch((err) => {
if (err.response amp;amp; err.response.status === 401) {
setIsLoggedIn(false);
}
})
}
return (
<>
<button className="button is-primary" onClick={addToCart}>
ADD TO CART
</button>
<Example
show={showExample}
onClose={() => setShowExample(false)}
onSave={() => setShowExample(false)}
/>
</>
)
}
Комментарии:
1. Спасибо после изменения того, как я определил свои состояния, мой модал отлично запустился после нажатия кнопки. Есть идеи, почему модал находится в обычном HTML-тексте, а не отформатирован, как в ссылке React-Bootstrap?
2. Я рад слышать, что мое решение сработало! Что касается новой проблемы, мне придется взглянуть на обновленный код. Если вы не сможете решить эту проблему, пожалуйста, создайте новый вопрос, и я буду рад помочь снова.
3. Звучит хорошо, я также добавлю скриншот, который еще больше прояснит мою проблему
4. Просто добавлен отдельный вопрос, касающийся импорта форматирования React-Boostrap