• 로그인
  • 장바구니에 상품이 없습니다.

home2 게시판 React 게시판 리액트 로딩중 표시 질문입니다.

리액트 로딩중 표시 질문입니다.

  • 이 주제에는 3개 답변, 2명 참여가 있으며 codingapple4 년 전에 전에 마지막으로 업데이트했습니다.
4 글 보임 - 1 에서 4 까지 (총 4 중에서)
  • 글쓴이
  • #9973

    강성구
    참가자

    function App() {

      const [shoes, setShoes] = useState(Data);
      const [show, setShow] = useState(true);

      return (
        <div className="App">
        
          <Navbar bg="light" expand="lg" className="">
            <Navbar.Brand href="#home">Australia Travel</Navbar.Brand>
            <Navbar.Toggle aria-controls="basic-navbar-nav" />
            <Navbar.Collapse id="basic-navbar-nav">
              <Nav className="mr-auto">
                <Nav.Link as={Link} to="/">Home</Nav.Link>
                <Nav.Link as={Link} to="/detail">Detail</Nav.Link>
                <NavDropdown title="Dropdown" id="basic-nav-dropdown">
                  <NavDropdown.Item href="#action/3.1">Action</NavDropdown.Item>
                  <NavDropdown.Item href="#action/3.2">
                    Another action
                  </NavDropdown.Item>
                  <NavDropdown.Item href="#action/3.3">Something</NavDropdown.Item>
                  <NavDropdown.Divider />
                  <NavDropdown.Item href="#action/3.4">
                    Separated link
                  </NavDropdown.Item>
                </NavDropdown>
              </Nav>
            </Navbar.Collapse>
          </Navbar>
          
          {/* 매칭되는것들을 다 보여주기때문에 exact이용 */}
          {/* exact 정확하게 이름에 해당하는 페이지것만 가져옴 */}
          {/* 이 안에 지저분한것들을 모두 컴포넌트화 시키면 더 깔끔해질것임 */}
              
         {/* ---메인페이지--- */}
          <Route exact path="/">
            <Jumbotron className="background">
              <h1>30% Season OFF</h1>
              <p>
                This is a simple hero unit, a simple jumbotron-style component for
                calling extra attention to featured content or information.
              </p>
            </Jumbotron>

            <div className="arrangeBtn">
              <button onClick={( ) => {

                let list = shoes.sort((a, b) => {
                  return a.price - b.price;
                });
                
                setShoes([...list]) // 깊은 복사를 함

              } } width="100%" className="btn" style={{border:"3px solid red",padding:"10px 20px"}}> 가격 낮은순으로 정렬 </button>
             </div>

            {/* 신발 설명 */}
            <div className="container">
              <div className="row">
                {
                  shoes.map( (a, i) => 
                    return <Compo shoes={shoes[i]} i={i} key={i} /> 
                  })  
                }
              </div> 
              <button className="btn btn-primary" onClick={() => {

     

                /////////로딩중입니다라는 알림창
                setShow(true);
                <Loading></Loading>
                axios.get('https://codingapple1.github.io/shop/data2.json')
                .then( (result) => { /* ajax로 가져온 자료 출력 성공하면 then */
                  ////////// 로딩중 UI 삭제
                  setShow(false);
                  <Loading></Loading>
                  setShoes( [...shoes, ...result.data] )
                 
                }) 
                .catch( () => { /* ajax로 가져온 자료 출력 실패하면 catch */
                  //////////// 로딩중 UI 삭제
                  setShow(false);
                  <Loading></Loading>
                  console.log('실패했어요ㅜㅜ');
                }) 
          
             
             }}> 더보기 </button>
            </div>
          </Route>
        
          <Route path="/detail/:id">
            <Detail shoes={shoes}/>
          </Route>

        </div>
      );
    }

    function Compo(props) {

      useEffect(() => {
        console.log('Compo의 useEffect');
        return (
          console.log("Compo의 useEffect의 return문")
        );
      }, [])

      return (
        <>
         
          <div className="col-md-4"> 
         
            <img src={"https://codingapple1.github.io/shop/shoes" + (props.shoes.id+1) +".jpg"} width="100%"/>
            <h4> {props.shoes.title} </h4>
            <p> {props.shoes.content} & {props.shoes.price}원 </p>
          </div>
        </>
      );
    }

    function Loading(props) {
      return (
        <div>
          <h2>{show === true? 로딩중입니다 : null}</h2>
        </div>
      )
    }

    export default App;

     

    위와 같이 state를 만들고

    Loading 컴포넌트를 만들어 show값이 true인지 false인지에따라  로딩중인지 null인지를 파악해보는 코드를 나름짜봤습니다.

    그전것들과 약간 뒤틀리면 응용이 힘드네요ㅜ  

    .then()부분과 .catch()부분 그리고 컴포넌트 부분이 맞는지 확신이 안들어 질문 남깁니다.

    감사합니다

    #9976

    codingapple
    키 마스터

    <Loading></Loading> 이라는 것도 HTML이기 때문에

    버튼 onclick 속성안에다가 HTML 집어넣으면 안보일듯요 

    <Loading></Loading> 이걸 다른 적절한 곳으로 옮기면 괜찮겠네요 

     

    #9977

    강성구
    참가자

    onClick버튼을 누른 뒤 then() 나오기 전 사이에 '로딩중입니다' 라는 표시가 떠야하는데 다른데로 옮겨야한다면 어디로 옮겨야하는지 감이 안잡힙니다.  setShow(true)와 함께 옮겨야하나요?

     

    then()안의 setShow(false);
                  <Loading></Loading>

    catch()안의 setShow(false);
                  <Loading></Loading>

    는 적절한건가요?

    감사합니다.

    #9978

    codingapple
    키 마스터

    <button onclick="<Loading></Loading>"> 이렇게 html을 작성하는 경우는 없으니까

     

    <button></button>

    <Loading></Loading>

    이렇게 버튼 바깥에 아무데나 두시면 될듯요 그리고 <Loading></Loading> 이거는 show라는 state가 true일 때만 보여달라고 if문을 작성을 잘 하면 되겠습니다 

4 글 보임 - 1 에서 4 까지 (총 4 중에서)
  • 답변은 로그인 후 가능합니다.

About

현재 월 700명 신규수강중입니다.

  (09:00~20:00) 빠른 상담은 카톡 플러스친구 코딩애플 (링크)
  admin@codingapple.com
  이용약관
ⓒ Codingapple, 강의 예제, 영상 복제 금지
top

© Codingapple, All rights reserved. 슈퍼로켓 에듀케이션 / 서울특별시 강동구 고덕로 19길 30 / 사업자등록번호 : 212-26-14752 온라인 교육학원업 / 통신판매업신고번호 : 제 2017-서울강동-0002 호 / 개인정보관리자 : 박종흠