#javascript #css #reactjs #overlay #mobx-react
#javascript #css #reactjs #наложение #mobx-реагировать
Вопрос:
Я пытаюсь отобразить индикатор загрузки поверх формы (чтобы наложить его), но мне трудно это сделать…
Я хочу показывать индикатор загрузки при нажатии кнопки корзина / минус или плюс. Я использую React.js Мобкс. У меня есть логический флаг, но чего трудно добиться, чтобы фактически разместить индикатор загрузки поверх формы (без искажения стиля …)
Исходный код корзины:
import React, { useEffect, useContext } from "react";
import { Container, Row, Col } from "react-bootstrap";
import PromotionalCode from "./PromotionalCode";
import { observer } from "mobx-react-lite";
import { RootStoreContext } from "../../app/stores/rootStore";
import CartBody from "./CartBody";
import CartSummary from "./CartSummary";
import BasicSpinner from "../../app/common/spinners/BasicSpinner";
import Section from "../../app/common/Page/Section";
import TextContainer from "../../app/common/Page/TextContainer";
const Cart = () => {
const rootStore = useContext(RootStoreContext);
const {
cart,
total,
discount,
subtotal,
loadingCart,
loadCartOnSignIn,
loadGuestCart,
isChangingQuantity,
} = rootStore.cartStore;
const { isLoggedIn } = rootStore.userStore;
useEffect(() => {
if (isLoggedIn) {
loadCartOnSignIn();
} else {
loadGuestCart();
}
}, [loadCartOnSignIn, loadGuestCart]);
if (loadingCart)
return (
<div className="mt-5">
<BasicSpinner />
</div>
);
return (
<Section className="checkout p-0">
<TextContainer style={{ padding: "2rem 2rem 0 2rem" }}>
<h2 className="font-weight-bold">Cart</h2>
<p>The competition tickets currently added in the cart.</p>
</TextContainer>
<Container className="cart pt-0">
{loadingCart ? (
<BasicSpinner />
) : (
<div style={isChangingQuantity ? { position: "relative" } : {}}>
{cart?.cartItems amp;amp; cart.cartItems.length !== 0 ? (
<>
<div className="cart__contents">
<div className="cart__contents__heading-container">
<h2>Items in your bag</h2>
</div>
<div className="cart__contents__table-wrapper">
<table className=" table cart__contents__table-wrapper__table">
<thead>
<tr>
<th scope="col">Description</th>
<th scope="col"></th>
<th scope="col"></th>
<th scope="col">Quantity</th>
<th scope="col">Price</th>
</tr>
</thead>
<CartBody />
</table>
</div>
</div>
<Container className="mt-5 ">
<Row className="justify-content-between cart__discount-and-total">
<Col md={5} className="cart__discount-and-total__discount">
{/* <PromotionalCode /> */}
</Col>
<Col className="cart__discount-and-total__total" md={6}>
<CartSummary
total={total}
subtotal={subtotal}
discount={discount.toString()}
/>
</Col>
</Row>
</Container>
</>
) : (
<div>There is no items in the cart yet.</div>
)}
</div>
)}
</Container>
</Section>
);
};
export default observer(Cart);
Желаемый результат выглядит примерно так:
Возможно ли это вообще?
Ответ №1:
Вы можете использовать абсолютное позиционирование для наложения и счетчика. Просто отобразите их внутри вашей формы, внизу.
.form {
// use relative on your form
position: relative;
}
.overlay {
position: absolute;
// this will stretch overlay to fill width and height of form
top: 0;
right: 0;
bottom: 0;
left: 0;
background-color: rgba(0, 0, 0, 0.1); // some transparent grey color
}
.spinner {
position: absolute;
// this will place spinner in center of form
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
Комментарии:
1. Вы потрясающие! Это сработало как шарм. Спасибо. 🙂