const 변수, 상수명 = {
  키 : 값,
  키 : '값',
  '키 키' : 값
  // 키는 공백이 없어야하며 있어야 할 경우 따옴표로 감싸 문자열로 넣어준다
}

객체를 선언할 때에는 { } 문자 안에 원하는 값을 넣어줌

하나의 이름에 여러 종류의 값을 넣을 수 있음

 

const dust = {
  name : 'dust',
  color : 'black',
  shape : 'circle',
};

console.log(dust.name);
// dust
console.log(dust.color);
// black

개발자도구 콘솔찍었을 때

 

function print(info){
  const text = '${info.name}는 ${info.color},${info.shape}'
  console.log(text);
}

 

 

객체 비구조화 할당 

위에서 객체의 값을 조회할 때 마다 info.를 입력했는데 객체 비구조화 할당 문법을 사용하면 더욱 짧고 가독성을 높일 수 있다

const dust = { name: 'dust', color : 'black', shape : 'circle'};
const { name, color, shape } = dust;

console.log(name);    // dust
console.log(color);   // black
console.log(shape);   // circle

// 또는

const dust = { name: 'dust', color : 'black', shape : 'circle'};
const { name : a, color : b, shape : c } = dust;
// 객체의 속성명과는 다른 이름의 변수에 할당 할 수 있다

console.log(a)       // dust
console.log(b)       // black
console.log(c)       // circle
const dust = {
  name : 'dust',
  color : 'black',
  shape : 'circle',
}

function print(info){
  const { name, color, shape } = info;
  // ✔객체에서 값을 추출하여 새로운 상수로 선언✔
  console.log(name + '는 ' + color, shape);
}
print(dust);
// dust는 black, circle

 

 

let { x = 5, y = 2 } = { 1 }; 
// 1이 x에 대입, y에는 들어갈 값이 없기 때문에 그대로 나옴
// x = 1, y = 2

let { x = 5, y = 2 } = { 10, 20 };
// x = 10, y = 20

 

let number = { x: 10, y: 20 };
let { x, y } = number;

function print({ x, y, z }){
  console.log(x); 
  console.log(y); 
  console.log(z); 
}

print(number);
// 10
// 20
// undefined

// ---------------------------------------
// z에 기본값을 주고 싶을 때

function print({ x, y, z = 30 }){
  console.log(x); 
  console.log(y); 
  console.log(z);
}
print(number);
// 10
// 20
// 30

 

 

 

객체안에 함수 넣기

const dust = {
  name : 'dust',
  active : '팔랑팔랑',
  move : function move(){
  // 함수가 객체 안에 들어가게 되면 this는 자신이 속한 객체를 가르킨다
  // 함수를 선언 할 때 함수명은 필수가 아님
  // ex) move : function() { ~
  
  // 객체 안에 화살표 함수는 x ==> this는 자신이 속한 객체를 가르키지만 화살표 함수는 그렇지 않기 때문
    console.log(this.name + "는 " + this.active);
  }
};

dust.move();
// dust는 팔랑팔랑

 

 

const

  const dust = {
    name: "dust",
    color: "black",
    shape: "circle",
    active: "팔랑팔랑",
    move: function move() {
      console.log(this.name + "는 " + this.active);
    },
  };
  
  
  dust.name = "dust2";
  console.log(dust.name);
  // dust2

우짜다 보니 콘솔에 dust.name 을 수정하고 봤는데 값이 변경되길래 const인데.. . 상수인데 왜 값이 바뀌지 .. .? 

해서 찾아봄

 

상수로 변수를 선언할 때 사용,

const는 할당된 값의 바인딩 변경을 못하게 막는 것이지 바인딩 된 값의 변경을 막는 것이 아니다

 

...? 뭔말일까..

const dust = {
  name: 'dust'
};

dust.name = 'test';
// dust --> test
// 이런식으로 변경은 가능

// ------------------------------------------------

const dust = {
  name : 'dust'
};

dust = {
  name : 'test'
};
// dust --> ! 오류 !

이런 속성이라고 한다

 

참고

https://velog.io/@hemtory/JSConstLetIIFE

 

JS - const, let, 즉시 실행 함수

JS const, let, 즉시 실행 함수

velog.io

 

 

 

 

배열 비구조화 할당 

 

기존

const animal = ["고양이", "강아지", "햄스터", "다람쥐"];

// 변수에 담기
const cat = animal[0];
const dog = animal[1];
const ham = animal[2];
const squirrel = animal[3];

값을 꺼내려면 귀찮고, 가독성이 좋지않음

 

 

비구조화 할당

const [cat, dog, ham] = ["고양이", "강아지", "햄스터"];

// 기본값 지정
const [cat, dog, ham, rabbit = "토끼" ] = ["고양이", "강아지", "햄스터"];
const animal = ["강아지", "고양이", "햄스터"];
const [dog, cat, ham, rabbit = "토끼"] = animal;
// 위에 예시는 되는데 왜 얘는 안될까
// 확인하기

// 배열에 변수와 값을 추가하고 싶을 때
animal[3] = "토끼";

const animal = ["고양이", "강아지", "햄스터", "다람쥐"];
const [ a, b, ...rest ] = animal;
// 여기서 rest 는 원하는 텍스트를 입력해주면 됨
// 객체 안에 있는 값을 추출하여 변수 or 상수로 바로 선언
// ... 지시자 사용 시 분해하고 남은 변수들을 따로 배열로 담을 수 있다

console.log(a);   // 고양이
console.log(b);   // 강아지
console.log(rest) // ['햄스터', '다람쥐'];

 

function Array(){
  return { 1, 2, 3, 4, 5 };
}

{ a, , , , e } = Array();

console.log(a); // 1
console.log(e); // 5

원하는 배열 요소만 가져올 수 있다

컴포넌트 내부에서 변경할 수 있는 값

 

state

클래스형 컴포넌트에서 사용

클래스형 컴포넌트에서 state는 객체형식

 

props는 부모 컴포넌트에서 설정하여 자식 컴포넌트로 전달 또는 바깥의 컴포넌트에서 감싸고 있는 컴포넌트를 표현함

props 읽기 전용이라고 생각하면 쉽다, 변경하려면 부모 컴포넌트에서 !

 

 

 

useState

함수형 컴포넌트에서 사용

함수형 컴포넌트에서 useState는 객체가 아니어도 상관x

함수 호출 시 배열을 반환함

const Main = () => {

    const [message, setMessage] = useState('');
    // 첫번째 원소는 현재상태, 두번째 원소는 상태를 바꾸어주는 세터함수
    const [test, setTest] = useState('');
    // ex) 이름도 자유롭게 설정할 수 있다
    
    const [state, setState] = useState({
      key1: value,
      key2: value
    });
    
    setState({ ...state, key: value});
    // 값 추가
}

 

 

예시

const [on, setOn] = useState(false);
const lightSwitch = () => setOn(on => !on);

return (
  <>
    <button onClick={lightSwitch}> ON / OFF </button>
  <>
);

 

https://min-ji07.tistory.com/entry/React-class-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8?category=926976 

 

'개발 > React' 카테고리의 다른 글

[React] e.target.name 계산된 속성명  (0) 2022.04.21
[React] Popup 불러오기  (0) 2022.04.18
[React] 페이지 이동, props 렌더링  (2) 2022.04.01
[React] 컴포넌트  (0) 2022.04.01

페이지 이동

import meno from './memo';
// 이동할 페이지를 import 해줌

const Home = () => {
  return(
      <div>
      	<!-- a 태그도 Link 태그로 변경해야함 / 변경전 -->
        <a href="/memo" title="메모장">
          메모장
        </a>
        <!-- 변경후 -->
        <Link href="/memo">
          메모장
        </Link>
      </div>
  )
};

export default Home;

 

 

페이지 불러오기

import React from 'react';
import SubMain from './sub_main';

const Main = () => {
  return (
    <>
      <div>메인화면</div>
      <div>메모장만들기</div>
      <!-- sub_main 페이지를 불러옴 -->
      <SubMain />;
    </>
  )
};

export default Main;


<!-- sub_main.tsx -->
<!-- 해당 페이지를 위에서 불러옴 -->
function subMain() {
  return <div>서브메인</div>;
}

 

 

예시 화면 

 

컴포넌트 속성

import React from "react";
import SubMain from "./sub_main";

const Main = () => {
  return (
    <div>
      <div>메인화면</div>
      <div>메모장만들기</div>
      <!-- name -->
      <SubMain name="react" />
    </div>
  );
};

export default Main;
// sub_main.tsx
import React from "react";

const subMain = (props) => {
  return <div>서브메인, {props.name}</div>;
  <!-- 서브메인, react -->
};

 

 

 

props.children

const Main = () => {
  return (
    <div>
      <div>메인화면</div>
      <div>메모장만들기</div>
      <SubMain name="react">리액트</SubMain>
    </div>
  );
};
const subMain = (props) => {
  return (
    <div>
      <div>서브메인, {props.name}</div>
      <div>props children의 값은 {props.children}</div>
      <!-- props children의 값은 리액트 -->
    </div>
  );
};

 

 

내부 값을 바로 추출하기

const Main = () => {
  return (
    <div>
      <div>메인화면</div>
      <div>메모장만들기</div>
      <SubMain name="react">리액트</SubMain>
    </div>
  );
};
const subMain = (props) => {
  const { name, children } = props;
  return (
    <div>
      <div>react, {name}</div>
      <!-- react, react -->
      <div>props children의 값은 {children}</div>
      <!-- props children의 값은 리액트 -->
    </div>
  );
};

subMain.defaultProps = {
  name: "dust",
  // Main 인라인에 name이 없으면 dust가 출력됨
};

 

 

더 간편하게

const subMain = ({ name, children }) => {
  return (
    <div>
      <div>react, {name}</div>
      <!-- Main에 인라인이 없을경우 dust, 있을경우 react -->
      <div>props children의 값은 {children}</div>
      <!-- props children의 값은 리액트 -->
    </div>
  );
};

'개발 > React' 카테고리의 다른 글

[React] Popup 불러오기  (0) 2022.04.18
[React] state, useState  (0) 2022.04.05
[React] 컴포넌트  (0) 2022.04.01
[React] JSX  (0) 2022.03.31

함수형 컴포넌트

// 함수형 컴포넌트
function App(){
  const name = '리액트';
  return <div className="react">{name}</div>;
}

장점

클래스형 컴포넌트보다 선언하기 훨씬 쉬움

클래스형 컴포넌트보다 메모리 자원 사용이 적음

프로젝트를 배포할 때 파일 크기가 더 작음

 

단점

state와 라이프사이클 api 사용이 불가능함 --> 리액트 v16.8업데이트(Hooks기능 도입) 이후 해결됨, 

(공식으로 함수형 컴포넌트와 Hooks를 사용하도록 권장)

 

클래스형 컴포넌트

 // 클래스형 컴포넌트
 import React, { Component } from 'react';
 
 class App extends Component {
   render(){
     const name = 'react';
     return <div className="react">{name}</div>;
   }
 }

장점

state 기능 및 라이프사이클 기능 사용 가능 / 임의 메서드 정의가능

 

render 함수가 꼭 있어야 하고 보여주어야 할 jsx를 반환함

 

화살표 함수

function() 을 사용했을 때 this 는 종속된 객체

화살표 함수의 this 는 자신이 종속된 인스턴스 (값을 연산하여 바로 반환해야 할 때 가독성을 높일 수 있음)

'개발 > React' 카테고리의 다른 글

[React] state, useState  (0) 2022.04.05
[React] 페이지 이동, props 렌더링  (2) 2022.04.01
[React] JSX  (0) 2022.03.31
[React] 기초 공부  (1) 2022.03.29

Javascript XML의 약자 JSX

리액트로 개발할 때 사용되며 공식적인 js 문법은 아님

브라우저에서 실행하기 전 babel을 사용하여 js 형태의 코드로 변환된다

 

부모 요소로 감싸는 형태여야 함

const Test = () => {
  return (
    // 부모 div
    <div>
      <p>내용</p>
    </div>
  )
}
const Test = () => {
  return (
    // 이런식으로도 가능하다(Fragment 태그)
    <>
      <p>내용</p>
    </>
  )
}

 

오류 예시

const Test = () => {
  return(
  // 부모 요소가 없음
    <div>내용</div>
    <div>내용</div>
  );
}

 

 

 

JSX 내에서 자바스크립트 표현식 작성시 {중괄호} 로 감싸주기

import React from 'react';

const Test = () => {
  const name = 'dust';
  return (
    <div>{name}</div>
    // 중괄호로 감싸주기
    // dust
  );
}

export default Test;

 

 

 

class --> className

import React from 'react';

const Test = () => {
  const name = 'dust';
  return (
    <div className="title">{name}</div>
    // class는 className으로 변경
  );
}

export default Test;

 

 

 

삼항연산자

import React from 'react';

const Test = () => {
  const name = 'dust';
  return (
    <div>
      {name === 'dust' ? (<h1>먼지</h1>) : (<h1>not 먼지</h1>)}
      <!-- { 조건 '내용' ? (true) : (false) } --> 
      <!-- { 조건 '내용' ? (true) : null }  -- null일경우 값을 null로 설정 -->
      <!-- <h1>먼지</h1> -->
      <div className="title">{name}</div>
    </div>
  );
}

export default Test;

+ &&({ 조건 '내용' ? (true) : null } 일 경우 사용)

import React from 'react';
import Popup from './Popup';
// Popup 렌더링, Popup 파일내용은 일단 제외

const Test = () => {
  // Popup
  const [popup, handlePopup] = useState(true);
  // useState(false); 일 경우 비활성화

  const name = 'dust';
  return (
    <div>
      {name === 'dust' ? (<h1>먼지</h1>) : (<h1>not 먼지</h1>)}
      <div className="title">{name}</div>
      {popup && <Popup />}
      <!-- popup 출력시 Popup 렌더링 -->
    </div>
  );
}

export default Test;
import React from 'react';
import Popup from './Popup';

const Test = () => {
  const [popup, handlePopup] = useState(false);
  
  var status = 'info';
  // 상태값

  const name = 'dust';
  return (
    <div>
      {name === 'dust' ? (<h1>먼지</h1>) : (<h1>not 먼지</h1>)}
      <div className="title">{name}</div>
      {popup && <Popup />}
      <!-- 상태값 변경에 따른 결과 출력 -->
      {
        { 
          info : <div>info</div>,
          menu : <div>menu</div>,
          shop : <div>shop</div>
        }[status]
      }
    </div>
  );
}

export default Test;

참고

https://codingapple.com/unit/react-if-else-patterns-enum-switch-case/

 

리액트에서 자주쓰는 if문 작성패턴 5개 - 코딩애플 온라인 강좌

(리액트 강좌 전체 메뉴) 딱히 설명할 부분이 없어서 글로 진행합니다. JSX 안에서 혹은 그냥 일반 코드작성시 if문을 쓸 때가 매우 매우많습니다. 지금까지는 삼항연산자만 주구장창 사용했는데

codingapple.com

 

 

 

태그는 꼭 닫기

import React from 'react';
import Popup from './Popup';
import Sub from './sub';

const Test = () => {
  const [popup, handlePopup] = useState(false);
  // 팝업 비활성화

  const name = 'dust';
  return (
    <div>
      {name === 'dust' ? (<h1>먼지</h1>) : (<h1>not 먼지</h1>)}
      <div className="title">{name}</div>
      {popup && <Popup />}
      <!-- Popup파일 / 닫기 -->
      <div>
        <input />
        <Sub />
        <!-- 태그 닫기 -->
      </div>
    </div>
  );
}

export default Test;

 

 

 

화살표 함수는 뭘까,,

import React from 'react';

const Test = () => {
// function Test(){} --> const Test = () => {}

  const [number, setNumber] = useState({ number: 0, fixedNumber: 0 });
  
  return (
    <div className="btn-set">
        <button
          type="button"
          onClick={() => {
            setNumber({
              number: number.number + 1,
              fixedNumber: 0,
            });
          }}>
          <!-- 함수 선언이랑 비슷한 느낌 -->
          <!-- onClick function(){} -> onClick{() => {}} -->
          <!-- 객체인경우 괄호로 감싸서 표현 -->
          플러스
        </button>
        <button
          type="button"
          onClick={() => {
            setNumber({
              number: number.number - 1,
              fixedNumber: 0,
            });
          }}>
          마이너스
        </button>
      </div>
  );
}

export default Test;

 

 

 

 

참고

https://min-ji07.tistory.com/entry/React-%EA%B8%B0%EC%B4%88-1?category=926976 

 

[React] 기초 공부

import React from 'react'; // 프로젝트를 만들 때 node_modules 디렉토리가 같이 생성됨 -> node_modules 디렉토리에 react 모듈이 설치됨 // react를 불러와서 사용할 수 있게 해줌 // 이런식으로 모듈을 불러..

min-ji07.tistory.com

! JSX, useState, useCallback, useEffect !

'개발 > React' 카테고리의 다른 글

[React] 페이지 이동, props 렌더링  (2) 2022.04.01
[React] 컴포넌트  (0) 2022.04.01
[React] 기초 공부  (1) 2022.03.29
mac React 개발환경 설정  (0) 2022.03.29

+ Recent posts