CSS 파일

.module.css로 파일 저장

 

 

Exampe.module.css

.container {
  background-color: aqua;
  width: 60%;
  height: 300px;
}

.message {
  background-color: brown;
}

 

Example.js

import React from 'react';
import styles from './Example.module.css'

const Example = () => {

    console.log("styles:" ,styles);
    return (
        <div className={styles.container}>
            <h1 className={styles.message}>css 스타일 입히기</h1>
            <p>CSS Module</p>
        </div>
    );
};

export default Example;

 

css 파일을 불러오기 위해 import 해줌

 

import styles from './Example.module.css'

이 때 객체를 하나 전달받는데 CSS Module에서 사용한 클래스 이름과 해당이름을 

고유화한 값이 키-값 형태로 들어 있다.

 

-> [파일 이름]_[클래스 이름]_[해시 값]

console.log(styles)를 통해 알아보자

파일이름(Example)_클래스 이름(container)_해시 값(3696j)

 

이렇게 CSS를 불러와서 사용할 때 자동으로 만들어지는데

이는, 컴포넌트 스타일 클래스 이름이 중첩되는 현상을 방지하기 위함이다.

 

 

CSS 적용

 

클래스를 적용하기 싶은 JSX 엘리먼트에

 

classname={styles.클래스이름} 지정

<div className={styles.container}>
<h1 className={styles.message}>css 스타일 입히기</h1>
     <p>CSS Module</p>
</div>

 

전역적으로 사용하고 싶으면

 

:global .container {
  background-color: aqua;
  width: 60%;
  height: 300px;
}

앞에 :global 입력

 

<div className="container">
<h1 className={styles.message}>css 스타일 입히기</h1>
    <p>CSS Module</p>
 </div>

클래스 이름은 평상시 처럼 문자열로 입력

 

 

 

'react' 카테고리의 다른 글

useEffect  (0) 2020.12.12
styled-components 설치 (css 사용)  (0) 2020.12.09
JSX 문법  (0) 2020.12.08
e.target 활용하기  (0) 2020.12.07
리엑트의 이벤트(Event)  (0) 2020.12.07
import React, { useState } from 'react';

const Info = () => {

    const [name , setName] = useState("");
    const [nickname, setNickname] = useState("");

    const onChangeName = (e) =>
    setName(e.target.value)
     console.log("렌더링이 완료 되었습니다.");
    console.log({name}); 

    const onChangeNickName = (e) =>
    setNickname(e.target.value)
    return (
        <div>
            <h1>이름 :{name}</h1>
            <h1>닉네임 : {nickname}</h1>

            <input type="text" value={name} onChange={onChangeName} />
            <input type="text" value={nickname} onChange={onChangeNickName} />
        </div>
    );
};

export default Info;

onChange 이벤트

 

이름 칸에 입력을 하면 console에 값이 나오게 했다.

 

근데 닉네임 칸에 값을 입력했는데,

console에 값이 나온다..

 

왜?

 

화살표 함수 말고

function 으로 하니깐 다시 괜찮아짐

function onChangeName(e){
        
        setName(e.target.value)
        console.log("렌더링이 완료 되었습니다.");
    console.log({name}); 

    }

 

알고보니

 

 const onChangeName = (e) => 
    setName(e.target.value)
     console.log(" name 렌더링.");
    console.log({name}); 

------------------------------------------
const onChangeName = (e) => {
    setName(e.target.value)
     console.log(" name 렌더링.");
    console.log({name}); 

};

중괄호를 안했다.. 중괄호를 하면

렌더링할 때 name 칸에 입력한 것만 (자기 것만 렌더링 된다.)

 

그리고 이렇게 중괄호를 하면

 

렌더링 될 때 마다 특정 작업을 수행하지 않는다.

 

ㅇㅇ를 입력했는데,  아직 작업은 o 만하고 있다.

 

 


UseEffect

렌더링 될 때마다 특정 작업을 수행한다.

 

 useEffect(() => {
        console.log("렌더링 완료")
        console.log({name, nickname});
    });

 

 

 


 

마운트 될 때만 실행하고 싶을 때

useEffect에서 설정한 함수를 컴포넌트가 화면에 맨 처음 렌더링 될 때만 실행하고,

업데이트될 때는 실행하지 않으려면 함수의 두번째 파라미터로 빈 배열을 넣어주면 된다.

 

useEffect(() => {
        console.log("렌더링 완료")
        console.log({name, nickname});
    } ,[]);

인풋을 수정해도 컴포넌트가 처음 나타날 때만 콘솔에 문구가 나타나고,

그 이후에는 나타나지 않는다.

 

 


특정 값이 업데이트 될때만 실행하고 싶을 때

 

useEffect의 두번 째 파라미터로 전달되는 배열 안에 검사하고 싶은 값을 넣어준다.

useEffect(() => {
        console.log("렌더링 완료")
        console.log({name, nickname});
    } ,[name]);

name 인풋을 수정 할 때 콘솔에 작업이 수행 된다.

'react' 카테고리의 다른 글

react 컴포넌트 스타일링- css Module  (0) 2020.12.15
styled-components 설치 (css 사용)  (0) 2020.12.09
JSX 문법  (0) 2020.12.08
e.target 활용하기  (0) 2020.12.07
리엑트의 이벤트(Event)  (0) 2020.12.07

1. 설치

 

 npm install --save styled-components

 

 

2. 자동완성

 

 

 

 

3. 참고

 

https://styled-components.com/

 

styled-components

Visual primitives for the component age. Use the best bits of ES6 and CSS to style your apps without stress 💅🏾

styled-components.com

 

'react' 카테고리의 다른 글

react 컴포넌트 스타일링- css Module  (0) 2020.12.15
useEffect  (0) 2020.12.12
JSX 문법  (0) 2020.12.08
e.target 활용하기  (0) 2020.12.07
리엑트의 이벤트(Event)  (0) 2020.12.07

감싸인 요소

 

 

컴포넌트에 여러 요소가 있다면 반드시 부모 요소 하나로 감싸야 합니다.

 

function App() {
  

  return (
    <div>
     <h1>메인 화면</h1>
    </div>
  );
}


export default App;

 

<div> 태그로 감싸져있기 때문에 오류가 발생하지 않는다.

 

리엑트 컴포넌트에서 왜 하나의 요소로 감싸야 할까?

※ Virtual DOM에서 컴포넌트 변화를 감지해 낼 때 효율적으로 비교할 수 있도록

컴포넌트 내부는 하나의 DOM 트리 구조로 이루어져야하는 규칙이 있기 때문이다.

 

function App() {
  

  return (
    <Fragment>
     <h1>메인 화면</h1>
    </Fragment>
  );
}


export default App;

 

 

 

리엑트 v16이상 부터 도입 된 Fragment 를 사용 해도 되고

function App() {
  

  return (
    <>
     <h1>메인 화면</h1>
    <>
  );
}
export default App;

 

이렇게도 표현 할 수 있다.

 


자바스크립트 표현

JSX는 단순히 DOM 요소를 렌더링하는 기능만 있는 것이 아니라, 자바스크립트 표현식을 쓸 수도 있다.

자바스크립트 표현식을 작성하려면 JSX 내부에 코드를 { } 로 감싸면 된다.

 

 

※렌더링 :사용자 화면에 뷰를 보여주는 것

 

 

function App() {
  
 const name = '리엑트';
  return (
    <>
     <h1>오늘 할 일 : {name} 공부하기</h1>
      
    <>
  );
}
export default App;

 


If 문 대신 삼항 연산자

 

JSX 내부의 자바스크립트 표현식에서 if 문을 사용 할 수 없다

하지만 조건에 따라 렌더링 할 때는 JSX 밖에서 if문을 사용하여 사전에 값을 설정하거나,

{ } 안에 삼항 연산자(조건부 연산자) 를 사용하면 된다.

 

삼항 연산자 사용법

A ? B : C  

 

=> A가 true 면 B의 값을 반환하고 false 면 C의 값을 반환한다.

 

js

handleButtonClick = () => {
        this.setState({
            clicked : true,
            validated : this.state.password ==='0000'
        })
    }
    render(){
    return (
        <div>
            <input 
                type="password"
                value={this.state.password}
                onChange={this.handleChange}
                className={this.state.clicked ? 
                    (this.state.validated ? 'success' : 'failure') : ''}
                    />
                    <button onClick={this.handleButtonClick}>검증하기</button>
        </div>
    );
}
};

css

.success {
  background-color: lightgreen;
}

.failure {
  background-color: lightcoral;
}

 

 


인라인 스타일링

리엑트에서 DOM 요소에 스타일을 적용할 때는 문자열 형태로 넣는 것이 아니라 객체 형태로

넣어주어야 한다.

-문자가 포함되는 이름은 -문자를 없애고 카멜 표기법으로 작성해야한다.

 

ex)

background-color  -> backgroundColor

font-size -> fontSize

font-weight -> fontWeight

 

 

const Test = () => {
    
    
        const name = 'react';
        const style = {
            backgroundColor : 'blue',
            color : 'aqua',
            fontSize : '48px',
            padding: '16px'
        }
        return (
            <div style={style}>
            {name}
            </div>
            
        );
    };
    
  

export default Test;

 

'react' 카테고리의 다른 글

useEffect  (0) 2020.12.12
styled-components 설치 (css 사용)  (0) 2020.12.09
e.target 활용하기  (0) 2020.12.07
리엑트의 이벤트(Event)  (0) 2020.12.07
함수형 컴포넌트 useState 사용  (0) 2020.12.07

 

객체 안에 key를 [ ] 로 감싸면 그 안에 넣은 레퍼런스가 

가리키는 실제 값이 key 값으로 사용 된다.

 

const name = 'cony';
const object = {
[name] : 'value'

};

 

class  EventPractice extends Component {
    
    state = {
        username : '',
        message: ''
    }

    
    handleChange =(e) =>{
        this.setState({
            [e.target.name]: e.target.value
        });
    }

    handleClick = () =>{
        const {username} = this.state;
        alert(username + ':'+this.state.message);
        this.setState({
            username : '',
            message:''
        });
    }
    render(){
    const {message} = this.state;
    return (
        <div>
            <h1>이벤트 연습</h1>
            <input
                type="text"
                name="username"
                placeholder="사용자 명"
                value= {this.state.username}
                onChange={this.handleChange}
                />
            <input
                type="text"
                name="message"
                placeholder="아무거나 입력하세요"
                value= {message}
                onChange={this.handleChange}
                />
                <button onClick= {this.handleClick}>확인</button>
        </div>
    );
}
};

export default EventPractice;

 

 

input 태그가 2개 이기 때문에

 

각 객체를 담은 setState에 [e.target.name] 으로 값을 담는다.

 

handleChange =(e) =>{
        this.setState({
            [e.target.name]: e.target.value
        });
    }

'react' 카테고리의 다른 글

styled-components 설치 (css 사용)  (0) 2020.12.09
JSX 문법  (0) 2020.12.08
리엑트의 이벤트(Event)  (0) 2020.12.07
함수형 컴포넌트 useState 사용  (0) 2020.12.07
state , useState 사용하기  (0) 2020.12.07
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
  <button onclick="alert('executed')">클릭 </button>
</body>
</html>

html 파일에서  onclick 이벤트를 사용할 때

" " 사이에 자바스크립트를 실행하도록 코드를 작성한다.

 

 

리엑트에서의 이벤트도 비슷하지만 조금 차이가 있다.

 

 

const Say = () => {
   const [message , setMessage] = useState('');
   const onClickEnter = () => setMessage('안녕하세요');
   const onClickLeave = () => setMessage('안녕히 가세요!');

   
   const [color, setColor] = useState('black');

   
    return (
        <div>
            <button onClick={onClickEnter}>입장</button> 
            <button onClick={onClickLeave}>퇴장</button>  
            <h1 style={ {color}}>{message}</h1>      

            <button onClick={ () => setColor('red')}>빨간색</button>
            <button onClick={ () => setColor('green')}>초록색</button>
            <button onClick={ () => setColor('blue')}>파란색</button>
        </div>
    );
};

 

리엑트에서의 이벤트 사용

  • 이벤트 이름은 카멜 표기법으로 사용 

  : HTML의 onclick은 리엑트에서 onClick 이다

 

  • 이벤트에 실행할 자바스크립트 코드 대신 함수 형태의 값을 전달한다.

: HTML은 큰 따옴표 안테 실행할 코드를 넣었지만, 리엑트는 함수 형태의 객체를 전달한다.

 

화살표 함수 문법으로 함수를 만들어도 되고 랜더링 외부에 미리 만들어서 전달해도 된다.

 

화살표 함수

class  EventPractice extends Component {
    
    state = {
        message: ''
    }

    render(){
    const {message} = this.state;
    return (
        <div>
            <h1>이벤트 연습</h1>
            <input
                type="text"
                name="message"
                placeholder="아무거나 입력하세요"
                value= {message}
                onChange={
                    (e) => this.setState({
                        message: e.target.value
                    })
                }
                />
                <button onClick= {
                    () => {
                        alert(message);
                        this.setState({
                            message:''
                        });
                    }
                }>확인</button>
        </div>
    );
}
};

 

랜더링 외부 함수

 

class  EventPractice extends Component {
    
    state = {
        message: ''
    }

    constructor(props){
        super(props);
        this.handleChange = this.handleChange.bind(this);
        this.handleClick = this.handleClick.bind(this);
    }
    handleChange(e){
        this.setState({
            message: e.target.value
        });
    }

    handleClick(){
        alert(this.state.message);
        this.setState({
            message:''
        });
    }
    render(){
    const {message} = this.state;
    return (
        <div>
            <h1>이벤트 연습</h1>
            <input
                type="text"
                name="message"
                placeholder="아무거나 입력하세요"
                value= {message}
                onChange={this.handleChange}
                />
                <button onClick= {this.handleClick}>확인</button>
        </div>
    );
}
};

 

※ 함수가 호출 될 때 this는 호출 부에 따라 결정 되므로,

클래스의 임의 메서드가 특정 HTML 요소의 이벤트로 등록되는 과정에서 

메서드와 this의 관계가 끊어져 버린다.

이 때문에 임의 메서드가 이벤트로 등록되어도 

this를 컴포넌트 자신으로 제대로 가리키기 위해서는

메서드를 this와 바인딩 하는 작업이 필요하다

 

만약 바인딩 하지 않으면 this가 undefined를 가리키게 된다

constructor 함수에서 함수를 바인딩 하는 작업을 한다.

 

 

Property Initializer Syntax 메서드

 

※메서드 바인딩은 생성자 메서드에서 하는 것이 정석이다.

하지만 이 작업은 불편하다. 새 메서드를 만들 때 마다 constuctor도 수정해야 하기 때문이다.

이때 바벨의 transform-class-properties 문법을 사용하여

화살표 함수 형태로 메서드를 정의 하면 편리하다.

 

class  EventPractice extends Component {
    
    state = {
        message: ''
    }

    
    handleChange =(e) =>{
        this.setState({
            message: e.target.value
        });
    }

    handleClick = () =>{
        alert(this.state.message);
        this.setState({
            message:''
        });
    }
    render(){
    const {message} = this.state;
    return (
        <div>
            <h1>이벤트 연습</h1>
            <input
                type="text"
                name="message"
                placeholder="아무거나 입력하세요"
                value= {message}
                onChange={this.handleChange}
                />
                <button onClick= {this.handleClick}>확인</button>
        </div>
    );
}
};

export default EventPractice;

 

 

  • DOM 요소에만 이벤트를 설정할 수 있다.

: div , button , input , form , span 등 DOM 요소에는 이벤트를 설정 할 수 있지만

우리가 직접 만든 컴포넌트에는 이벤트를 자체적으로 설정 할 수 없다.

'react' 카테고리의 다른 글

JSX 문법  (0) 2020.12.08
e.target 활용하기  (0) 2020.12.07
함수형 컴포넌트 useState 사용  (0) 2020.12.07
state , useState 사용하기  (0) 2020.12.07
클래스형 컴포넌트  (0) 2020.12.07

useState 를 사용하기에 앞서 

많이 활용하고 있는 

 

배열 비구조화 할당 에 대해 살펴보자

 

function App() {
  const array = [10,20];
  const one = array[0];
  const two = array[1];

  return (
    <div className="App">
       <h1>{one}</h1>    {/* 10 */}
      <h1>{two}</h1>    {/* 20 */}
    </div>
  );
}

export default App;

array 안에 있는 값을 one과 two에 담아 주는 코드이다.

 

위 코드에 배열 구조화 할당을 사용하면 다음과 같이 표현 할 수 있다.

 

function App() {
  const array = [10,20];
  const [one , two] = array;

  return (
    <div className="App">
       <h1>{one}</h1>    {/* 10 */}
      <h1>{two}</h1>    {/* 20 */}
    </div>
  );
}

export default App;

 

배열 비구조화 할당 문법을 사용하면 useState 사용 방법을 쉽게 이해 할 수 있다.

 

 

 


useState 사용하기

 

import React, { useState } from 'react';

const Say = () => {
   const [message , setMessage] = useState('');
   const onClickEnter = () => setMessage('안녕하세요');
   const onClickLeave = () => setMessage('안녕히 가세요!');

   return (
        <div>
            <button onClick={onClickEnter}>입장</button> 
            <button onClick={onClickLeave}>퇴장</button>  
            <h1>{message}</h1>      
        </div>
    );
};

export default Say;

useState 함수의 인자에는 상태의 초깃값을 넣어준다.

 

원래는 다음과 같이 

const messageState = useState('');
const message = messageState[0];
const setMessage = messageState[1];

위에서 언급한 배열 비구조화 할당을 통해 각 원소를 추출하였다.

 

또한 ,

클래스 컴포넌트에서의 state 초깃값은 객체 형태를 넣어 주어야 하는데

useState에서는 반드시 객체가 아니어도 상관 없다.

 

값의 형태는 자유다. 숫자, 문자열, 객체, 배열 등등

 

 

 

 

함수를 호출하면 배열이 반환 되는데 

배열의 첫번째 요소는 현재 상태이고,

두번째 요소는 상태를 바꾸어 주는 함수이다. 

(이 함수를 setter 함수라고 부른다)

 

 

const [message , setMessage] = useState('');

message -> 현재상태

setMessage -> 상태를 바꾸어 주는 함수 

 

 

 


useState 여러 번 사용하기

const Say = () => {
   const [message , setMessage] = useState('');
   const onClickEnter = () => setMessage('안녕하세요');
   const onClickLeave = () => setMessage('안녕히 가세요!');

   
   const [color, setColor] = useState('black');
    return (
        <div>
            <button onClick={onClickEnter}>입장</button> 
            <button onClick={onClickLeave}>퇴장</button>  
            <h1 style={ {color}}>{message}</h1>      
            
            <button onClick={ () => setColor('red')}>빨간색</button>
            <button onClick={ () => setColor('green')}>초록색</button>
            <button onClick={ () => setColor('blue')}>파란색</button>
        </div>
    );
};

 

'react' 카테고리의 다른 글

e.target 활용하기  (0) 2020.12.07
리엑트의 이벤트(Event)  (0) 2020.12.07
state , useState 사용하기  (0) 2020.12.07
클래스형 컴포넌트  (0) 2020.12.07
JSX란?  (0) 2020.12.06

리엑트에서 state컴포넌트 내부에서 바뀔 수 있는 값을 의미한다.

 

리엑트에는 두 가지 종류의 state가 있다.

 

  • 클래스형 컴포넌트가 지니고 있는 state
  • 함수형 컴포넌트에서 useState라는 함수를 통해 사용하는 state

 

 

클래스형 컴포넌트의 state

 

import React, { Component } from 'react';

class Counter extends Component {
    constructor(props){
        super(props);
        // state의 초기 값 설정하기
        this.state = {
            number : 0
        };
    }

    render(){
        const { number} = this.state; 
        // state를 조회 할 때는 this.state로 조회합니다.
        return (
        <div>
            <h1>{number}</h1>
            <button onClick={ () => {
        //this.setState를 사용하여 state에 새로운 값을 넣을 수 있습니다.
                this.setState({number: number+1});
            }}> +1 </button>
        </div>
    );
    }
};

export default Counter;

 

 

컴포넌트에 state를 설정할 때는 다음과 같이 constructor 메서드를 작성하여 설정한다.

 

 constructor(props){
        super(props);
        // state의 초기 값 설정하기
        this.state = {
            number : 0
        };
    }

 

컴포넌트의 생성자 메서드인데 , 클래스 컴포넌트에서 constructor를 작성 할 때는

반드시 super(props)를 호출해 주어야 한다.

 

이 함수가 호출 되면 현재 클래스형 컴포넌트가 상속 받고 있는 

리엑트의 Component 클래스가 지닌 생성자 함수를 호출해 준다.

 

그 다음에 this.state 값에 초깃값을 설정 해준다.

컴포넌트의 state는 객체 형식이어야 한다.

 

 

render(){
        const { number} = this.state; 
        // state를 조회 할 때는 this.state로 조회합니다.
        return (
        <div>
            <h1>{number}</h1>
            <button onClick={ () => {
        //this.setState를 사용하여 state에 새로운 값을 넣을 수 있습니다.
                this.setState({number: number+1});
            }}> +1 </button>
        </div>
    );
    }

 

render 함수에서 현재 state를 조회할 때는 this.state를 조회하면 된다.

 

함수 내부에서는 this.setState 라는 함수를 사용 했는데 이 함수가 state 값을

바꿀수 있게 해준다.

 


state를 constructor에서 꺼내기

앞에서 state의 초깃값을 지정하기 위해 counstructor 메서드를 선언했는데,

또 다른 방식으로 state의 초깃값을 지정해 줄 수 있다.

 

import React, { Component } from 'react';

class Counter extends Component {
   state = {
       number:0
   };

    render(){
        const { number} = this.state; 
        // state를 조회 할 때는 this.state로 조회합니다.
        return (
        <div>
            <h1>{number}</h1>
            <button onClick={ () => {
                //this.setState를 사용하여 state에 새로운 값을 넣을 수 있습니다.
                this.setState({number: number+1});
            }}> +1 </button>
        </div>
    );
    }
};

export default Counter;

이렇게 하면 constructor 메서드를 선언하지 않고도 state 초깃값을

설정 할 수 있다.

 

 

 

객체 대신 함수 인자 전달하기

import React, { Component } from 'react';

class Counter extends Component {
   state = {
       number:0
   };

    render(){
        const { number} = this.state; 
        // state를 조회 할 때는 this.state로 조회합니다.
        return (
        <div>
            <h1>{number}</h1>
            <button onClick={ () => {
                //this.setState를 사용하여 state에 새로운 값을 넣을 수 있습니다.
                this.setState(prevState => {
                    return{

                        number : prevState.number+1
                    };
                });
             }}> +1 </button>
        </div>
    );
            }
};

export default Counter;

버튼 onclick 속성에

 

 onClick={ () => {
                this.setState({number: number+1});
            }}
   
            
 

this.state 객체 대신

 onClick={ () => {
           this.setState(prevState => {
                    return{
                    number : prevState.number+1
                    };
                });
             }} 

함수 인자를 넣어 줄 수 있다.

'react' 카테고리의 다른 글

리엑트의 이벤트(Event)  (0) 2020.12.07
함수형 컴포넌트 useState 사용  (0) 2020.12.07
클래스형 컴포넌트  (0) 2020.12.07
JSX란?  (0) 2020.12.06
react 설치하기  (0) 2020.12.04

컴포넌트를 선언하는 방식은 두 가지 입니다.

하나는 함수형 컴포넌트이고, 또 다른 하나는 클래스형 컴포넌트 입니다.

 

 

함수형 컴포넌트

function App() {

  const name = "리엑트";
  return (
    <div>
      {name}
    </div>
  );
}

export default App;

클래스형 컴포넌트

class App extends Component {
  render(){
    const name = "리엑트";
    return (
      <div>
        {name}
      </div>
    );
  }
    
}

export default App;

 

클래스형 컴포넌트에서는 render 함수가 꼭 있어야 하고,

그 안에서 보여 주어야 할 JSX를 반환해야 합니다.

 

두 컴포넌트의 역할은 똑같습니다.

 

다만 차이점은 , 

클래스형 컴포넌트는 state 기능 및 라이프사이클 기능을 사용 할 수 있고

임의 메서드를 정의 할 수 있습니다. 

 

 


예제

 

  • 함수형 컴포넌트
import React, { Component, useState } from 'react';




const  EventPractice = () => {
    
    const [username , setUsername] = useState('');
    const [message , setMessage] = useState('');

    
    const handleChange =(e) =>{
       setUsername(e.target.value);
       setMessage(e.target.value);
    }

    const handleClick = () =>{
        const {username} = this.state;
        //비구조화 할당
        alert(username + ':'+this.state.message);
        setMessage('');
        setUsername('');
    }
    
    
    return (
       
        <div>
            <h1>이벤트 연습</h1>
            <input
                type="text"
                name="username"
                placeholder="사용자 명"
                value= {username}
                onChange={handleChange}
                />
            <input
                type="text"
                name="message"
                placeholder="아무거나 입력하세요"
                value= {message}
                onChange={handleChange}
                />
                <button onClick= {handleClick}>확인</button>
        </div>
    );

};

export default EventPractice;

 

 

 

  • 클래스형 컴포넌트
class  EventPractice extends Component {
    
    state = {
        username : '',
        message: ''
    }

    
    handleChange =(e) =>{
        this.setState({
            [e.target.name]: e.target.value
        });
    }

    handleClick = () =>{
        const {username} = this.state;
        //비구조화 할당
        alert(username + ':'+this.state.message);
        this.setState({
            username : '',
            message:''
        });
    }
    render(){
    const {message} = this.state;
    //비구조화 할당
    return (
        <div>
            <h1>이벤트 연습</h1>
            <input
                type="text"
                name="username"
                placeholder="사용자 명"
                value= {this.state.username}
                onChange={this.handleChange}
                />
            <input
                type="text"
                name="message"
                placeholder="아무거나 입력하세요"
                value= {message}
                onChange={this.handleChange}
                />
                <button onClick= {this.handleClick}>확인</button>
        </div>
    );
}
};

export default EventPractice;

'react' 카테고리의 다른 글

리엑트의 이벤트(Event)  (0) 2020.12.07
함수형 컴포넌트 useState 사용  (0) 2020.12.07
state , useState 사용하기  (0) 2020.12.07
JSX란?  (0) 2020.12.06
react 설치하기  (0) 2020.12.04

JSX 란?

JSX는 자바스크립트의 확장 문법이며 XML과 매우 비슷하게 생겼다.

이런 형식으로 작성한 코드는 브라우저에서 실행되기 전에 코드가 번들링 되는 과정에서

바벨을 사용하여 일반 자바스크립트 형태의 코드로 변환 된다.

 

 

function App() {


  return (
    <div>
      Hello <b>react</b>
    </div>
  );
}

 

이렇게 작성된 코드는 다음과 같이 변환 된다.

 

function App() {
  return 
   React.createElement("div", null, "Hello", React.createElement("b" , null ,"react"));
  
}

 

컴포넌트를 랜더링할 때마다 JSX 코드를 작성하는 것이 아니라 위 코드처럼 React.createElement 함수를 사용하면

매우 불편하다

 

그래서 JSX를 사용하면 매우 편하게 UI를 랜더링 할 수 있다.

 

 

랜더링 : 사용자 화면에 뷰를 보여 주는 것

 

위와 같이

HTML 코드를 작성하는 것과 비슷하기 때문에 JSX를 사용하는 편이 가독성이 높고 작성하기 쉽다.

 

 


 

JSX는 HTML 태그를 사용 할 뿐 아니라 컴포넌트도 JSX 안에서 작성 할 수 있다.

 

 

src/index.js

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';

ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById('root')
);

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

 

ReactDOM.render =

 

컴포넌트를 페이지에 렌더링하는 역할을 하며 , react-dom 모듈을 불러와 사용 할 수 있다.

이 함수의 첫번째 파라미터에는 페이지에 렌더링할 내용을 JSX 형태로 작성하고

두 번째 파라미터에는 해당 JSX를 렌더링할 docuement 내부 요소를 설정한다.

 

여기서는 id가 root인 요소 안에 렌더링을 하도록 설정!

'react' 카테고리의 다른 글

리엑트의 이벤트(Event)  (0) 2020.12.07
함수형 컴포넌트 useState 사용  (0) 2020.12.07
state , useState 사용하기  (0) 2020.12.07
클래스형 컴포넌트  (0) 2020.12.07
react 설치하기  (0) 2020.12.04

+ Recent posts