개발 이야기/Front-end

React 복습

sonoa 2023. 4. 15. 10:51
반응형

React Props 복습

// App.jsx

import React, { useState } from "react";

import Home from "./component/Home";
import Clip from "./component/Clip";

function App() {
  const [news, setNews] = useState([]);

  //{"status":"OK",

  console.log("handler up news:", news);

  const fecthNewsHandler = async () => {
    const response = await fetch(
      `https://api.nytimes.com/svc/search/v2/articlesearch.json?q=election&api-key=trSbmSW4LczL0n7jtUVEYGEaGjne1QQn`
    );
    const data = await response.json();
    const transformedNews = data.response.docs.map((newsData) => {
      return {
        id: newsData._id,
        title: newsData.abstract,
        date: newsData.pub_date,
      };
    });
    setNews(transformedNews);
    console.log(transformedNews);
    console.log("handler down news:", news);
    console.log("news[0]", news[0]);
  };

  const person = [
    {
      name: "huisu",
      age: 31,
    },
  ];

  return (
    <>
      <section>
        <button onClick={fecthNewsHandler}>Search</button>
      </section>

      {/* 반복문을 사용해서 props 안에 있는 데이터를 꺼내서 뿌려야한다.  */}
      <Home person={person} />
      <Clip />
    </>
  );
}

export default App;

// map 의 retrun을 아예 <Home news={news[i]} 이런식으로는 안되는건가 ? />
// Home.jsx
import React from "react";

import Age from "./Age";

const Home = (props) => {
  console.log(props.person[0].age);
  const age = props.person[0].age;

  return (
    <div>
      <h1>Home</h1>

      <ul>
        <li>name: {props.person[0].name}</li>
        <Age age={age} />
        <li>ID: {}</li>
        <li>Title: {}</li>
        <li>Date: {}</li>
        <li>
          <button>Clip</button>
        </li>
      </ul>
    </div>
  );
};

export default Home;
// Age.jsx
import React from "react";

const Age = (props) => {
  console.log(props.age);
  return (
    <div>
      <li>{props.age}</li>
    </div>
  );
};

export default Age;

React useEffect 복습

  • 리액트의 메인 업무는 UI를 렌더링 하는 것인데, side effects는 그외 모든 일들을 말한다.
  • useEffect(()⇒}{}, [dependencies]);
import React, { useState, useEffect } from "react";

import Login from "./components/Login/Login";
import Home from "./components/Home/Home";
import MainHeader from "./components/MainHeader/MainHeader";

function App() {
  const [isLoggedIn, setIsLoggedIn] = useState(false);

  useEffect(() => {
    const storedUserLoggedInInformation = localStorage.getItem("isLoggedIn");

    if (storedUserLoggedInInformation === "1") {
      setIsLoggedIn(true);
    }
  }, []);

  const loginHandler = (email, password) => {
    // We should of course check email and password
    // But it's just a dummy/ demo anyways
    localStorage.setItem("isLoggedIn", "1");
    setIsLoggedIn(true);
  };

  const logoutHandler = () => {
    localStorage.removeItem("isLoggedIn");
    setIsLoggedIn(false);
  };

  return (
    <React.Fragment>
      <MainHeader isAuthenticated={isLoggedIn} onLogout={logoutHandler} />
      <main>
        {!isLoggedIn && <Login onLogin={loginHandler} />}
        {isLoggedIn && <Home onLogout={logoutHandler} />}
      </main>
    </React.Fragment>
  );
}

export default App;

종속성으로 추가할 항목 및 추가하지 않을 항목

  • effect 함수에서 사용하는 "모든 것"을 종속성으로 추가해야 함을 배웠습니다. 즉, 거기에서 사용하는 모든 상태 변수와 함수를 포함합니다.
  • 맞는 말이지만 몇 가지 예외가 있습니다. 다음 사항을 알고 있어야 합니다.
  • 여러분은 상태 업데이트 기능을 추가할 필요가 없습니다. (지난 강의에서 했던 것처럼 setFormIsValid 사용): React는 해당 함수가 절대 변경되지 않도록 보장하므로 종속성으로 추가할 필요가 없습니다.
  • 여러분은 또한 "내장" API 또는 함수를 추가할 필요가 없습니다 fetch(), 나 localStorage 같은 것들 말이죠 (브라우저에 내장된 함수 및 기능, 따라서 전역적으로 사용 가능): 이러한 브라우저 API/전역 기능은 React 구성 요소 렌더링 주기와 관련이 없으며 변경되지 않습니다.
  • 여러분은 또한 변수나 함수를 추가할 필요가 없습니다. 아마도 구성 요소 외부에서 정의했을 겁니다 (예: 별도의 파일에 새 도우미 함수를 만드는 경우): 이러한 함수 또는 변수도 구성 요소 함수 내부에서 생성되지 않으므로 변경해도 구성 요소에 영향을 주지 않습니다 (해당 변수가 변경되는 경우, 또는 그 반대의 경우에도 구성 요소는 재평가 되지 않습니다)
  • 간단히 말해서: effect 함수에서 사용하는 모든 "것들"을 추가해야 합니다. 구성 요소(또는 일부 상위 구성 요소)가 다시 렌더링 되어 이러한 "것들"이 변경될 수 있는 경우.그렇기 때문에 컴포넌트 함수에 정의된 변수나 상태, 컴포넌트 함수에 정의된 props 또는 함수는 종속성으로 추가되어야 합니다!
  • 예시

1. import { useEffect, useState } from 'react';
2.  
3. let myTimer;
4.  
5. const MyComponent = (props) => {
6.   const [timerIsActive, setTimerIsActive] = useState(false);
7.  
8.   const { timerDuration } = props; // using destructuring to pull out specific props values
9.  
10.   useEffect(() => {
11.     if (!timerIsActive) {
12.       setTimerIsActive(true);
13.       myTimer = setTimeout(() => {
14.         setTimerIsActive(false);
15.       }, timerDuration);
16.     }
17.   }, [timerIsActive, timerDuration]);
18. };

이 예에서:

  • timerIsActive종속성으로 추가되었습니다. 왜냐하면 구성 요소가 변경될 때 변경될 수 있는 구성 요소 상태이기 때문이죠(예: 상태가 업데이트 되었기 때문에)
  • timerDuration종속성으로 추가되었습니다. 왜냐하면 해당 구성 요소의 prop 값이기 때문입니다 - 따라서 상위 구성 요소가 해당 값을 변경하면 변경될 수 있습니다(이 MyComponent 구성 요소도 다시 렌더링 되도록 함).
  • setTimerIsActive종속성으로 추가되지 않습니다. 왜냐하면 예외 조건이기 때문입니다: 상태 업데이트 기능을 추가할 수 있지만 React는 기능 자체가 절대 변경되지 않음을 보장하므로 추가할 필요가 없습니다.
  • myTimer종속성으로 추가되지 않습니다. 왜냐하면 그것은 구성 요소 내부 변수가 아니기 때문이죠. (즉, 어떤 상태나 prop 값이 아님) - 구성 요소 외부에서 정의되고 이를 변경합니다(어디 에서 든). 구성 요소가 다시 평가되도록 하지 않습니다.
  • setTimeout종속성으로 추가되지 않습니다 왜냐하면 그것은 내장 API이기 때문입니다. (브라우저에 내장) - React 및 구성 요소와 독립적이며 변경되지 않습니다.
반응형

'개발 이야기 > Front-end' 카테고리의 다른 글

JavaScript Function  (0) 2023.04.29
Destructuring & Arrow Functions  (0) 2023.04.24
TypeScript 복습  (0) 2023.04.14
Next.js #2  (0) 2023.04.13
React Styling  (0) 2023.04.08