ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 1205. react
    스타터스 백엔드 3기 2022. 12. 5. 17:39

    하루입니다.

    FileTest.js,ConstructorTest.js,Book.js,EventComponent.js, EventComponent2.js,Loginform.js, Loop.js

    variabletest.html - public에 만든다.

     


     

    리뷰

    • html, css, js, jquery는 하나의 html 파일 안에서 유기적으로 움직일 수 있다.
    • 제이쿼리는 자바스크립트의 라이브러리, 리액트는 자바스크립트의 프레임워크이다. 
    • 라이브러리는 남이 구현한 코드를 필요하면 가져다 쓰는 것.
    • 프레임워크는 형식에 맞게 사용해야 한다. 규칙을 지켜야 한다.
    • 리액트 : index.html을 통해 화면이 보여진다. index.js에서 리액트 컴포넌트를 모은다.
    • 만약 리액트를 하고 싶다면 처음부터 방향을 잡고 시작해야 한다. 
    • 또한 리액트에서는 jquery 등장할 일이 없다. jquery는 dom을 제어하고 이벤트를 처리하기 때문이다. 리액트는 html을 리턴하는 게 아닌 jsx를 리턴하기에 dom이 없다. 글고 리액트는 미리 태그를 만들고, 변수 값만 바꾸는 식으로 진행한다.
    • node 서버 중단하고 싶으면 ctrl C 누르면 된다. 

     

     

    JSX

    • jsx는 JS의 확장된 문법이지만 브라우저가 바로 실행 가능한 코드는 아니기에 Babel(컴파일러)을 사용해서 브라우저가 이해할 수 있는코드로 변환시킨다.
    • React.createElement의 매개변수로 활용된다.

     

     

    컴포넌트

    • 리액트는 화살표함수를 좋아한다.
    • 유명함수, 무명함수(화살표함수), Class
    유명함수 화살표함수 클래스
    function A () {
        return (<div> ... </div>);
    }
    const A = () => {
     return (<div> ... </div>);
    }
    class A extends React.Component {
        render() {
             return (<div> ... </div>);
        }
    }
    매개변수 받을 때는 매개변수명 param, p, props 등 ... 상관 없다.   props라는 이름으로 데이터를 받아야 한다.
    this 사용한다.

     

     

    시험

    내일 15개 사지선다

    과제 1개

    과제 2개 (도전과제)

    반드시 시간 안에 제출해야 함

     

     


     

     

    리액트 컴포넌트를 외부파일에서 사용하기

    class ConstructorTest extends React.Component {

    }
    class ConstructorTest extends React.Component {

    }
    export default A export {B}
    import A from './FileTest' import {B} from './FileTest'
    import A, { B, C } from './FileTest';         와 같은 형태 많이 사용한다.

     

    내가 만든 컴포넌트는 A인데, 외부에서 사용할 때는 B로 사용해도 된다는 뜻이다. as는 Alias의 약어로 별명이라는 뜻.

    A의 기본적인 이름은 A지만, B로도 사용 가능하다. 

     

     

     


     

     

    오늘은 class C extends React.Component { } 위주로 배운다.

    • class는 변수, 함수, 메소드 등을 정의 가능하다. 
    • React.Component를 상속했을 때 자동으로 포함되는 메소드가 있다. 
    • 상속 자동 포함 메소드 1. render() - 화면 렌더링 요소 정의, 매개변수 없다.
    • 상속 자동 포함 메소드 2. constructor(props) - <컴포넌트 />가 생성될 때 호출되며, <컴포넌트 />를 저장한다.
    •                                      초기 변수 정의가 가능하며, props라는 매개변수를 받는다.
    // react class component의 뼈대
    
    import React from "react";
    class Book extends React.Component {
    
        constructor(props) {
            super(props);
        }
    
        render() {
            return (<div></div>);
        }
    }
    
    export default Book;

     

     

     

     

    • constructor 밖에서 선언한 변수는 현재 객체의 모든 함수에서 사용 가능하다.
    • constructor 안에서 선언한 this.변수는 현재 객체의 모든 함수에서 사용 가능하다.
    • render() {} 내부에서 변수 사용하고 싶다면 반드시 this 붙여야 한다. 그냥 title이라고 하면 render()의 타이틀인지 뭔지 모르기 때문이다.
    • props는 객체 타입이다. props = {writer:"작성자", page:1, ...}
    import React from "react";
    
    class ConstructorTest extends React.Component {
        title = "제목";          	      // 현재 객체의 모든 함수에서 사용
        constructor(props) {    	      // 반드시 props로 받아야 한다.
            super(props);                 // 부모의 생성자를 호출 (반드시 맨 앞)
                                          // 부모객체에 props라는 변수를 전달한다는 뜻이다.
            this.contents = "내용";       // 현재 객체의 모든 함수에서 사용
            a = "이얍"		      // 지역변수라 render에서 사용 불가
        }
    
        render() {
            this.props.writer = "작성자 변경"
            return(<div>{this.title}, {this.contents}, {this.props.writer}</div>);  
        }
    }
    
    export default ConstructorTest;

     

     


     

     

    내가 부모?

      <React.StrictMode>
        <ConstructorTest writer="작성자" />
      </React.StrictMode>
    );
     

    내가 자식?

    class ConstructorTest extends React.Component

     

    • 호출한 쪽이 부모, 당한 쪽이 자식. props로 writer라는 값을 전달하고 싶다. props 안의 writer를 사용할 건데, 이 props는 생성자 안에 있으니까 this. 를 사용하는 것이다.
    • 부모 컴포넌트가 자식 컴포넌트에 값을 전달할 때 사용한다.
    • props는 단방향 데이터라서 수정 불가하다.

     

        render() {
            this.props.writer = "작성자 변경"
            return(<div>{this.title}, {this.contents}, {this.props.writer}</div>);
        }

    Uncaught TypeError: Cannot assign to read only property 'writer' of object '#<Object>'

     

     

     


     

     

    리액트 컴포넌트 내부 함수 실행 순서

    constructor(){}   render(){}
    먼저 실행된다. 뒤에 실행된다.
    한 번 실행된다. props나 변수값이 변경될 때마다 호출된다.
    리액트 컴포넌트 전체에서 사용할 변수를 선언한다.
    부모에서 전달받은 변수를 초기화 해야 하기에 첫 문장이 super(props);이다.
    state 변수를 선언한다.
     

     

    • 항상 마지막줄의 reportWebVitals();가 실수한 거 없나 한 번 더 실행한다. 그래서 constructor(){}와 render(){}가 두 번씩 실행된다.
    • 클래스 라는 건 객체의 틀을 만드는 것이다. ConstructorTest 클래스가 React.Component를 상속받았다. 

     

     

     

     


     

    thisthisthisthisthisthisthisthisthisthis!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

     

    props 문법

     

    import React from "react";
    class Book extends React.Component {
    
        constructor(props) {
            super(props);
            this.title = "제목: " + props.title;		// this. 사용
        }
    
        render() {
            const body = "내용: " + this.props.body;		// render 내에서 선언 후 this.props.body;
            const price = "가격: " + this.props.price + "원";	// render 내에서 선언 후 this.props.body;
            return (<div><h2>오늘 구입한 책 목록</h2>
                <h3>{this.title}</h3>
                <h3>{body}</h3>
                <h3>{price}</h3><br /></div>);
                {/* {this.props.price}<br /></div>); */}
        }
    }
    
    export default Book;

    위의 식을 아래와 같이 나타낼 수 있다.

     

    1. 제목과 내용을 따로 전달받아서 class Book에서 return 할 것이다.
    2. BookHeading class는 생성자 없이  props에서 바로 데이터를 받아서 사용할 것이다.
    3. BookBody는 생성자에서 전역변수를 만들고 값을 담은 뒤, render() 에서 전역변수를 사용할 것이다.
    4.  
    [index.js ]
    root.render(
      <React.StrictMode>
        <Book title="리액트" body="리액트 책입니다." price="40000"/>
        <Book title="스프링" body="mvc와 스프링부트도 다룹니다."  price="30000"/>
        <Book title="마리아DB" body="오라클 mysql mariaDB와 비교합니다."  price="20000"/>
      </React.StrictMode>
    );
    
    --------------------------------------------------------------------------------------------
    
    [Book.js]
    import React from "react";
    class BookHeading extends React.Component {
        render() {
            return (<h1>제목 : {this.props.title}</h1>);
        }
    }
    
    class BookBody extends React.Component {
        constructor(props) {
            super(props);
            this.body = "내용: " + this.props.body;
            this.price = "가격: " + this.props.price + "원";
        }
    
        render() {
            return (
                <div>
                    <hr />
                    <h2>{this.body}</h2>
                    <h2>{this.price}</h2>
                </div>);
        }
    }
    
    class Book extends React.Component {
        render() {
            return (
            <div>
                <BookHeading title = {this.props.title} />  {/*내가 전달받은 props의 title을 전달한다.*/}
                <BookBody body = {this.props.body} price = {this.props.price * 2}/>
            </div>);
        }
    }
    
    export default Book;

     

    겉이 부모 속이 자식 ... ?

     

     


     

     

    props 문법 2

    • 비구조화 할당 문법 / 변수 분해 / 구조분해 할당
    • 배열이나 객체의 속성 혹은 값을 해체하여 그 값을 변수에 각각 담아 사용하는 자바스크립트 표현식이다. 
    • public에 variabletest.html을 생성했다.
    • [... ] {... } 스프레드 연산자 : 복사본을 만든다.
    let arr1 = [1, 2, 3, 4, 5];
    let arr1 = [1, 2, 3, 4, 5];
    let newarr1 = arr1;
    let newarr1 = [...arr1];
     console.log(arr1 + " : " + newarr1 + "==>비교");
    100,2,3,4,5 : 100,2,3,4,5 1,2,3,4,5 : 100,2,3,4,5
    같은 메모리 영역을 공유한다. 새로운 메모리를 만든다? 공유되지 않는다.

     

        let arr1 = [1, 2, 3, 4, 5];
        let newarr1 = [...arr1];     
        newarr1[0] = 100;     
        console.log(arr1 + " : " + newarr1 + " ==>비교");
    
        let obj1 = {seq:1, title:"제목", contents:"내용"}
        let newobj1 = {...obj1}
        newobj1.seq = 2;
        console.log(obj1.seq + " : " + newobj1.seq + " ==>비교" );
    class Book extends React.Component {
        render() {
            return (
            <div>
                <BookHeading title = {this.props.title} />  {/*내가 전달받은 props의 title을 전달한다.*/}
                <BookBody body = {this.props.body} price = {this.props.price * 2}/>
            </div>);
        }
    }
    
    --------------------------------------------------------------------
    
    // 비구조화 할당 문법
    class Book extends React.Component {
        render() {
            const {title, body, price} = this.props;
            return (
            <div>
                <BookHeading title = {title} /> 
                <BookBody body = {body} price = {price * 2}/>
            </div>);
        }
    }

     

     


     

    props 문법 3. 반복문

    map함수 : 매개변수로 함수가 들어간다.

    (보고만 넘어감)

     

     

     


     

     

    state

    class형으로 사용하는 것과 함수형으로 사용하는 것의 차이가 크다.

    리액트 컴포넌트의 게시판 리스트 조회, 추가, 수정, 삭제하기
    하는데 메모리 내에서는 바뀌는데 보여주지를 않는다. 렌더링을 안 해 준다. 이제 value를 렌더링 해야 한다고 선언해야 한다.

    • props 변수는 읽기 전용 객체이다. 내부 변수값 변경 불가하다.
    • 리액트에서 이벤트 처리할 때는 인라인 방식을 쓰되  on 두ㅠㅣ에 대문자로 시작하는 이벤트명ㅇ르 붙인다. 이벤트 함수는 화살표 함수로 사용하는 것을 지향하자. 
    • 만약 유명함수를 사용할 경우, clickHandler = () => {this.setState({value : this.state.value + 1, name : '이벤트 처리 중'}); } 여기서 this는 EventComponent1이 아닌 자신을 호출한 button이 된다. 애매모호함 때문에 유명함수가 아닌 화살표함수를 사용하는 것을 지향하자.
    • setState()는 state의 setter 용도로 사용된다. 

     

     

    render() {} 함수 안에 있어서 호출할 때 this 안 붙여도 된다.
    this.clickHandler로 사용해야 한다.

     

    1. 해야 하는 것

     

    root.render(
      <React.StrictMode>
        <EventComponent1 name = "리액트 이벤트 처리" />
      </React.StrictMode>
    );
    import React from "react";
    
    class EventComponent1 extends React.Component {
        state = {value : 0, name : this.props.name}
        render() {
            const clickHandler = () => {   
                this.setState({value : this.state.value + 1, name : '이벤트 처리 중'});   
            }
            return (
                <div>
                    <div>{this.state.value} - {this.state.name}</div>
                    <button onClick={clickHandler}>Click Button</button>
                    <div>전달받은 name = {this.state.name}</div>       
                </div>
            ) // return
        } // render
    } // class
    
    export default EventComponent1;
        clickHandler = () => {    // 렌더함수 안의 지역함수이면서 화살표함수
            this.setState({value : this.state.value + 1, name : '이벤트 처리 중'});     // 왼쪽은 바꿀 변수 이름, 오른쪽은 변경할 값(this.state.value).
        }
        render() {
            return (
                <div>
                    <div>{this.state.value} - {this.state.name}</div>
                    <button onClick={this.clickHandler}>Click Button</button>
                    <div>전달받은 name = {this.state.name}</div>        {/*전달받은 props를 바꿔보자. 
                    맨 처음에 받아와서 state = {name : this.props.name} 여기서 조회하고, 후에 바꾼다 (??)*/}
                </div>
            ) // return
        } // render
    } // class

     


     

    함수로 컴포넌트 선언하기

    리액트 컴포넌트 상속 안 받았는데

     

     

     


     

    로그인하기

    아이디와 패스워드가 입력될 때마다 수행하는 벼수를 ㄴtate로 선언한다. 생성자 밖에서 선언하면 state={}, 생성자 안에서 선언하면 this.state = {}로 선언해야 한다. this 안 붙이면 지역변수라고 생각하기 때문이다.

     

    그런데 dom 구조도 아닌데 입력된 값을 어떻게 가지고 오지? onChange={}를 사용하자. 값이 입력될 때마다 값을 불러오기 위한 거싱다.

     

    아이디, 비밀번호, 버튼, 결과 도출 창을 만든다. 버튼을 누르면 아이디와 비밀번호를 창에 띄우는 것이 목적이다. 

     

     

    import React from "react";
    
    class EventComponent1 extends React.Component {
        // state.value = 0; 아래와 같은 형태 많이 사용한다.
        // state 객체와 setState라는 함수는 이벤트 컴포넌트 안에 자동으로 포함되어 있다. 그걸 재정의한다 우리가.
        // statㄷ 안에 어떤 변수를 넣을 거고, setstate에서 변수를 어떻게 변경할 건지만 정의하면 알아서 변한다.
        state = {value : 0, name : this.props.name}
    //  state = {value : 0, {name} : this.props}        같은 뜻이다?
        // 함수 여기 선언 가능, 클래스 메소드이며 유명 함수 / 화살표 함수이다.
        // clickHandler() {}                이건 지양하자
        // clickHandler = () => {}          밖에 적더라도 화살표함수를 사용하자
    
        // 함수 여기 선언 가능, render() {}의 지역함수면서도 화살표함수이다. 많이 사용함.
        // 가능하면 render() 안에 화살표함수로 사용하자.
        clickHandler = () => {    // 렌더함수 안의 지역함수이면서 화살표함수
            this.setState({value : this.state.value + 1, name : '이벤트 처리 중'});     // 왼쪽은 바꿀 변수 이름, 오른쪽은 변경할 값(this.state.value).
        }
        render() {
            return (
                <div>
                    <div>{this.state.value} - {this.state.name}</div>
                    <button onClick={this.clickHandler}>Click Button</button>
                    <div>전달받은 name = {this.state.name}</div>        {/*전달받은 props를 바꿔보자. 
                    맨 처음에 받아와서 state = {name : this.props.name} 여기서 조회하고, 후에 바꾼다 (??)*/}
                </div>
            ) // return
        } // render
    } // class
    
    export default EventComponent1;

     

     


     

     

    리액트의 반복문

    map 함수 사용한다.

     

     const loop = this.userList.map(function() {});  배열에 포함된 함수로, 반복해준다.

     

     

     


     

     

     

     

     

     

     

     

     

     

     

Designed by Tistory.