react cart
11275 단어 React
상품 일람 페이지의 각 상품에 대한 설명 페이지(Proiducts.js)와 이 설명 페이지를 눌렀을 때의 상세 페이지(상세 자료.js), 마우스가 멈췄을 때 나타나는 단추를 눌렀을 때의 모드(Modals.js)에 대해 설명합니다.
상품 설명을 클릭한 후 나타나는 버튼을 통해 상품 이미지의 패턴을 표시합니다.
react-phone-e-commerce-project/src/components/Products.js
| import React, { Component } from "react"; |
|:--|
| import styled from "styled-components"; |
| import { Link } from "react-router-dom"; |
| import { ProductConsumer } from "../context"; |
| export default class Product extends Component { |
| render() { |
| const { id, title, img, price, inCart } = this.props.product; |
state와props의 차이점https://qiita.com/kyrieleison/items/78b3295ff3f37969ab50
| return ( |
| <ProductWrapper className="col-9 mx-auto col-md-6 col-lg-3 my-3"> |
| <div className="card"> |
| <ProductConsumer> |
| {value => { |
| return ( |
| <div |
| className="img-container p-5" |
| onClick={() => value.handleDetail(id)} |
| > |
| <Link to="/details"> |
| <img src={img} alt="" className="card-img-top" /> |
| </Link> |
| <button |
| className="cart-btn" |
| disabled={inCart ? true : false} |
| onClick={() => { |
| value.addToCart(id); |
| value.openModal(id); |
| }} |
| > |
| {inCart ? ( |
| <p className="text-capitalize mb-0" disabled> |
| in cart |
| </p> |
| ) : ( |
| <i className="fas fa-cart-plus" /> |
| )} |
| </button> |
| </div> |
| ); |
| }} |
| </ProductConsumer> |
| <div className="card-footer d-flex justify-content-between"> |
| <p className="align-self-center mb-0">{title}</p> |
| <h5 className="text-blue font-italic mb-0"> |
| <span className="mr-1">$</span> |
| {price} |
| </h5> |
| </div> |
| </div> |
| </ProductWrapper> |
| ); |
| } |
| } |
| |
| const ProductWrapper = styled.div` |
| .card { |
| border-color: transparent; |
| transition: all 1s linear; |
| } |
| .card-footer { |
| background: transparent; |
| border-top: transparent; |
| transition: all 1s linear; |
| } |
| &:hover { |
| .card { |
| border: 0.04rem solid rgba(0, 0, 0, 0.2); |
| box-shadow: 2px 2px 5px 0px rgba(0, 0, 0, 0.2); |
| } |
| .card-footer { |
| background: rgba(247, 247, 247); |
| } |
| } |
| .img-container { |
| position: relative; |
| overflow: hidden; |
| } |
| .card-img-top { |
| transition: all 1s linear; |
| } |
| .img-container:hover .card-img-top { |
| transform: scale(1.2); |
| } |
| .cart-btn { |
| position: absolute; |
| bottom: 0; |
| right: 0; |
| padding: 0.2rem 0.4rem; |
| background: var(--lightBlue); |
| border: none; |
| color: var(--mainWhite); |
| font-size: 1.4rem; |
| border-radius: 0.5rem 0 0 0; |
| transform: translate(100%, 100%); |
| transition: all 1s ease-in-out; |
| } |
| .img-container:hover .cart-btn { |
| transform: translate(0, 0); |
| } |
| .cart-btn:hover { |
| color: var(--mainBlue); |
| cursor: pointer; |
| } |
| `; |
react-phone-e-commerce-project/src/components/Modals.js에서| import React, { Component } from "react"; |
|:--|
| import { ProductConsumer } from "../context"; |
| import { ButtonContainer } from "./Button"; |
| import { Link } from "react-router-dom"; |
| export default class Details extends Component { |
| render() { |
| return ( |
| <ProductConsumer> |
| {value => { |
| const { |
| id, |
| company, |
| img, |
| info, |
| price, |
| title, |
| inCart |
| } = value.detailProduct; |
데이터를 저장하다.| return ( |
| <div className="container py-5"> |
| {/* title */} |
| <div className="row"> |
| <div className="col-10 mx-auto text-center text-slanted text-blue my-5"> |
| <h1>{title}</h1> |
| </div> |
| </div> |
| {/* end of title */} |
| <div className="row"> |
| <div className="col-10 mx-auto col-md-6 my-3"> |
| <img src={img} className="img-fluid" alt="" /> |
| </div> |
| {/* prdoduct info */} |
| <div className="col-10 mx-auto col-md-6 my-3 text-capitalize"> |
| <h1>model : {title}</h1> |
| <h4 className="text-title text-uppercase text-muted mt-3 mb-2"> |
| made by : <span className="text-uppercase">{company}</span> |
| </h4> |
| <h4 className="text-blue"> |
| <strong> |
| price : <span>$</span> |
| {price} |
| </strong> |
| </h4> |
| <p className="text-capitalize font-weight-bold mt-3 mb-0"> |
| some info about product : |
| </p> |
| <p className="text-muted lead">{info}</p> |
| {/* buttons */} |
| <div> |
| <Link to="/"> |
| <ButtonContainer>back to products</ButtonContainer> |
| </Link> |
| <ButtonContainer |
| cart |
| disabled={inCart ? true : false} |
| onClick={() => { |
| value.addToCart(id); |
| value.openModal(id); |
| }} |
| > |
| {inCart ? "in cart" : "add to cart"} |
{inCart ? "in cart": "add to cart"}만약 쇼핑 카트 안에 있다면, 그에게 "in cart"쇼핑 카트 안에 있다고 말해라
쇼핑카트에 없으면'add to cart'가 있다고 전해주세요.
| </ButtonContainer> |
| </div> |
| </div> |
| </div> |
| </div> |
| ); |
| }} |
| </ProductConsumer> |
| ); |
| } |
| } |
이 파일 종료다음은 모드.
react-phone-e-commerce-project/src/components/Modal.js
| import React, { Component } from "react"; |
|:--|
| import styled from "styled-components"; |
이 styled-components.https://qiita.com/taneba/items/4547830b461d11a69a20
인용하다
| import { ProductConsumer } from "../context"; |
| import { ButtonContainer } from "./Button"; |
| import { Link } from "react-router-dom"; |
| export default class Modal extends Component { |
| render() { |
| return ( |
| <ProductConsumer> |
src/context입니다.js에서 호출되지만 src/context.단지 js에게 내용을 선언했을 뿐이다.불러내서 고기를 붙이다.
이런 인상.
| {value => { |
| const { modalOpen, closeModal } = value; |
| const { img, title, price } = value.modalProduct; |
| if (!modalOpen) { |
| return null; |
| } else { |
| return ( |
| <ModalContainer> |
| <div className="container"> |
| <div className="row"> |
| <div |
| className="col-8 mx-auto col-md-6 col-lg-4 p-5 text-center text-capitalize" |
| id="modal" |
| > |
| <h5>item added to cart</h5> |
| <img src={img} className="img-fluid" alt="" /> |
| <h5>{title}</h5> |
| <h5 className="text-muted">price : ${price}</h5> |
| <Link to="/"> |
| <ButtonContainer |
| onClick={() => { |
| closeModal(); |
| }} |
| > |
| Continue Shopping |
| </ButtonContainer> |
| </Link> |
| <Link to="/cart"> |
| <ButtonContainer |
| cart |
| onClick={() => { |
| closeModal(); |
| }} |
| > |
쇼핑 카트 정보의 페이지에 나타나든 상품 페이지에 머무르든 모두 모드를 한 번 닫아야 한다.| Go To Cart |
| </ButtonContainer> |
| </Link> |
| </div> |
| </div> |
| </div> |
| </ModalContainer> |
| ); |
| } |
| }} |
| </ProductConsumer> |
| ); |
| } |
| } |
| |
| const ModalContainer = styled.div` |
| position: fixed; |
| top: 0; |
| left: 0; |
| right: 0; |
| bottom: 0; |
| background: rgba(0, 0, 0, 0.3); |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| #modal { |
| background: var(--mainWhite); |
| } |
| `;
Modalのcss設計
Reference
이 문제에 관하여(react cart), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/da05506960/items/2b03578837d6ce4cad1f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)