이벤트 규칙

  1. 이벤트의 이름은 전부 카멜 표기법으로 표현됩니다. onkeyup -> onKeyUp
  2. 이벤트를 전달할 때는 {함수} 형태로 사용합니다

 

인풋값 핸들링 해보기

  1. 인풋의 값이 변화되는 이벤트 onChange 연결
  2. 이벤트 안 첫번째 매개변수에서 event객체 활용하기 (e.target.속성값)
  3. setter를 이용해서 state변경하기
const EventComponent = () => {

    const [name, setName] = useState('');
    let handleName = (e) => { //2.event객체 활용
        setName(e.target.value); //3.state변경 (input의 value도 변경)
    }
    return (
        <div>
            <h3>리액트 이벤트 핸들링</h3>
            <input type="text" name="name" onChange={handleName} value={name}/><br/> {/*1. 이벤트연결*/}
            <h3>체인지된 결과: {name}</h3>
        </div>
    )
}

useState를 하나로 관리하기(객체로 사용) 😊

const EventComponent2 = () => {
     
    const [form, setForm] = useState({name: '', topic: ''}); //객체 state
    
    let handleChange = (e) => {
        const copy ={...form, [e.target.name]: e.target.value } //spread문법으로 복사 후 키 값 수정
        setForm(copy); //state변경
    }

    let handleClick = () => {
        alert(`결과: ${form.name} 님의 할일: ${form.topic}`)
        setForm({name: '', topic: ''}) //state변경
    }
    
    return (
        <div>
            
            <h3>리액트 이벤트 핸들링(객체로 핸들링)</h3>
            <input type="text" name="name" onChange={handleChange} value={form.name}/><br/>
            <h3>체인지된 결과: </h3>

            <input type="text" name="topic" onChange={handleChange} value={form.topic} /><br/>
            <h3>체인지된 결과: </h3>

            <button type="button" onClick={handleClick}>클릭미</button>

        </div>
    )
}

'Front-End > React' 카테고리의 다른 글

6. 리액트 기본훅  (0) 2022.12.26
5. 컴포넌트 반복  (0) 2022.12.23
3. 리액트 State  (0) 2022.12.21
2. 리액트의 Components와 props  (0) 2022.12.21
1. 리액트 시작하기  (0) 2022.12.21
  1. 리액트에서 state는 컴포넌트 내부에서 바뀔 수 있는 값을 의미합니다
  2. state가 체인지 되면 변화를 감지하여 리렌더링을 수행합니다.
  3. 클래스 vs 함수형 컴포넌트에서 사용하는 방법이 다릅니다.
  4. 함수형 컴포넌트에서는 훅 Hook개념을 이용해서 더욱 쉽게 사용 가능 합니다.

 

나의 첫번째 훅

useState(초기값) 

useState() : 배열반환 

첫번째 배열의 요소에는 현재값을, 두번째 요소는 상태를 변경하는 (setter) 를 반환합니다.

 

const [data, setData] = useState('초기값')

 

state는 어떤 타입이던 상관 없습니다. (str, number, object)

state는 여러개 일 수도 있습니다.

state는 직접 수정하면 안 됩니다. setter를 사용하세요!

 

const StateComponent = () => {

    const [msg, setData] = useState('초기값')

    const enter = () => setData('입장했습니다')
    const exit = () => setData('퇴장했습니다')

    return (
        <div>
            <h3>{msg}</h3>
            <button onClick={enter}>입장</button>
            <button onClick={exit}>퇴장</button>
        </div>
    )

}

'Front-End > React' 카테고리의 다른 글

6. 리액트 기본훅  (0) 2022.12.26
5. 컴포넌트 반복  (0) 2022.12.23
4. 리액트 이벤트 핸들링  (0) 2022.12.21
2. 리액트의 Components와 props  (0) 2022.12.21
1. 리액트 시작하기  (0) 2022.12.21

1. 컴포넌트

 

리액트의 컴포넌트의 형태 (Tree구조)

 

컴포넌트는 함수형, 클래스형 2가지입니다.

함수형

function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

클래스형

class Welcome extends React.Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}

수업에서는 함수형 컴포넌트를 사용합니다.

 

어떻게???

모듈내보내기 - 외부에서 사용할 모듈 이름을 지정합니다.
- export default 이름 
모듈불러오기 - 부모컴포넌트에서 사용
import 이름 from 경로;

 

컴포넌트 합성

- 예를 들어 Welcome을 여러 번 렌더링하는 App 컴포넌트를 만들 수 있습니다.

//상위
function App() {
  return (
    <div>
      <Welcome name="Sara" />
      <Welcome name="Cahal" />
      <Welcome name="Edite" />
    </div>
  );
}

//하위
function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

2. props (중요)

상위 컴포넌트에서 하위컴포넌트로 전달하는 매개변수 입니다.

 

하위 컴포넌트에서 사용할 때는 {}를 이용해서 값을 받을 수 있습니다.

 

상위 컴포넌트에서는 컴포넌트의 속성값을 동일이름으로 지정합니다.

 

 

//상위
const App = () => {
    return ( 
    	<Fragment>
        	<MyComponent name={"홍길동"} age={2} email={"aa@naver.com"}/>
    	</Fragment>
    )
}

//하위
const MyComponent = ( {name, age, addr, email} ) => {
   return (
        <div>
            나의 첫번째 컴포넌트<br/>
            프로퍼티1:{name}<br/>
            프로퍼티2:{age}<br/>
            기본값 프로퍼티3:{addr}<br/>
        </div>
   )

props의 기본값 설정하기 (주의 - 대소문자 정확하게 구분함  )

컴포넌트명.defaultProps = {}

MyComponent.defaultProps = {
    addr: '서울시',
    age: 0    
}

 

props의 타입검증 (주의 - 대소문자 정확하게 구분함  )

컴포넌트명.propTypes = {}

MyComponent.propTypes = {
    name: PropsTypes.string,
    age: PropsTypes.number,
    email: PropsTypes.string.isRequired //필수값(상위컴포넌트에서 반드시 전달)

}

'Front-End > React' 카테고리의 다른 글

6. 리액트 기본훅  (0) 2022.12.26
5. 컴포넌트 반복  (0) 2022.12.23
4. 리액트 이벤트 핸들링  (0) 2022.12.21
3. 리액트 State  (0) 2022.12.21
1. 리액트 시작하기  (0) 2022.12.21

1. 리액트란?

 

- 리액트는 자바스크립트 라이브러리 입니다.

- 구조가 MVC, MVVM과 같은 다른 프레임워크등과는 다르게 오직 View만 처리하는 라이브러리 입니다.

 

SPA란?

- Single Page Application의 줄임말 입니다.

- index.html하나만 로드하고 실행시키는 구조입니다.

 

어떻게?

번들러(Webpack)가 이 모든것을 해줍니다.

Webpack이란 어플리케이션을 동작시키는데 필요한 자원(JS파일들, CSS, Image 등)을 하나로 묶어서 조합하여 경량화 하여 결과물을 만들어 주는 도구입니다.

번들러는 node.JS를 통해 직접 설정 할 수 있지만, 리액트 프로젝트를 생성시 자동으로 포함됩니다.

 

 

DOM (Document Object Model) 이란?

- HTML을 이해하기 쉽도록 트리 구조로 만들어진 태그(객체)들 입니다

 

리액트의 Virtual DOM 이란?

HTML에서 DOM을 조작하여 처리할 때, DOM핸들링 자체는 빠릅니다.

하지만, 웹 브라우저가 DOM의 변화를 감지하고, CSS를 적용하고, 처리하는 과정에서 시간이 많이 소요됩니다.

 

리액트의 Virtual DOM은, 이를 추상화시킨 자바스크립트 객체를 이용해서, 바뀐 부분만 부분적으로 리렌더링 하여 사용 하는 방법입니다.

 

걱정마세요 리액트가 해줄거에요


2. 환경설정하기

1. node.js 다운. 설치

2. 에디터 vscode 설치

3. create-react-app으로 프로젝트 생성하기

npm create react-app 프로젝트명

4. 프로젝트  시동하기

npm start

 


리액트 코드 살펴보기

1. index.js

const root = ReactDOM.createRoot(document.getElementById('root'));

root.render(
	<React.StrictMode>
   		<App />
	</React.StrictMode>
);

index.html에 id가 root인 값을 얻습니다


React.StricMode는 옛날 기능을 사용할때 경고를 출력하는 기능입니다(클래스형 컴포넌트)

 

root의 render함수는 App컴포넌트를 화면에 그립니다

 

2. App.js

import React from 'react';
import logo from './logo.svg';
import './App.css';

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.js</code> and save to reload.
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          Learn React
        </a>
      </header>
    </div>
  );
}

export default App;

- return (JSX) 문장을 반환합니다.

- export default App 로 모듈을 빼냅니다.

- Index.js 파일에서 <App/> 로 사용됩니다.

 

- JSX란?

JS의 확장 문법으로 (HTML에 JS코드를 녹여낸 형태) 입니다.

 

- 코드를 수정하게 될 때 자동으로 화면이 리렌더링 됩니다. (웹팩 로더가 동작)

- Webpack Loader는 직접 설정(커스터마이징)도 가능하고, create react-app 생성시 자동으로 해줍니다.

Webpack Loader는 다양한 종류가 있습니다.
1. css로더 - css로드
2. file로더 - 폰트,이미지, 파일 등 로드
3. babel로더 - ES6문법을 화면에서 사용할 ES5문법으로 다운그레이드 하여 변환해 줍니다.

 


 

JSX의 문법

  1. JSX의 주석 alt + shift + a
  2. JSX문법 - 반드시 하나의 태그를 return 해야 합니다.
  3. div를 사용하기싫다면 Fragment컴포넌트를 이용하면 됩니다.
  4. 함수안에서 만들어진 변수는  중괄호 {name} 로 참조할 수 있다.
  5. if문 대신 3항연산자를 이용한다.
  6. 화면에 보여주고싶은게 없다면 null을 이용합니다.
  7. undefind을 반환하는 상황을 만들면 안 됩니다. 
  8. DOM요소에 스타일을 직접 넣을때는 반드시 객체형 객체로 묶고 속성은 카멜 표기법을 사용합니다.
  9. class대신 className을 사용합니다.
  10. 홀로 사용하는 태그는 닫는태그를 반드시 작성합니다.

 

'Front-End > React' 카테고리의 다른 글

6. 리액트 기본훅  (0) 2022.12.26
5. 컴포넌트 반복  (0) 2022.12.23
4. 리액트 이벤트 핸들링  (0) 2022.12.21
3. 리액트 State  (0) 2022.12.21
2. 리액트의 Components와 props  (0) 2022.12.21

1. let과 const

  1. let변수는 중복선언이 불가능하다.
  2. let변수의 유효범위는 {}블록이다.
    //let변수는 같은 블록에서 내에서 중복이 불가능하다.
    let y = 1;
    // let y = 100; //에러

    //let변수의 유효범위는 {}블록이다
    let z = 10;
    if(true) {
        let z = 100;
        console.log(z); //100
    }
    console.log(z); //10

 

1. const

	
    const GENDER = "남자";
    // var GENDER = "여자"; //에러
    // GENDER = "여자"; //에러

    const arr = ["홍길동", "이순신", "홍길자"];
    // arr = ["김철수"]; //에러
    arr[0] = "김철수"; //내부의 값 변경은 허용
    arr.push("박영희"); //내부의 갑 변경 허용

    //객체에서의 수정
    const P1 = {"name" : "홍길동" };

    // P1 = {"name" : "이순신"}; //P1을 전부 바꾸는 코드는 에러
    P1.name = "이순신"; //내부의 값의 변경은 허용
    P1.age = 20; //내부의 값의 추가도 허용

2.  spread operator (전개구문)

  1. 반복 가능한(iterable)에 적용할 수 있는 문법입니다.
  2. 배열이나 문자열 등을 아래처럼 풀어서 요소 하나 하나로 전개시킬 수 있습니다.
	
    const arr = [1,2,3];
    console.log(...arr); //num의 요소들을 추출
    
    const str1 = 'hello'; 
    const str2 = [...str1]; 
    console.log(str2); // [ "h", "e", "l", "l", "o"]
	
    //배열에서 전개구문
    //배열의 추가
    const num1 = [10, 20, 30, ...arr];
    console.log(num1)

    //배열의 중간추가
    const num2 = [10, 20, ...arr, 30];
    console.log(num2)

    //배열의 복사
    const num3 = [...arr]; //splice와 유사(복사)
    console.log(num3)

    //배열 연결
    const num4 = [...arr, ...arr]
    console.log(num4)

 

3. 함수에서 spread operator

    const num = [1,2,3];

    //함수의 전달
    function sum(x, y, z) {
        return x + y + z;
    }
    console.log( sum(...num) ); //num의 요소를 x,y,z로 전달
    console.log( sum(10, ...num) ); //10, 1, 2, 3을 전달


    //함수의 매개변수의 사용(가변적 매개변수) - 단 마지막에 작성해야 합니다.
    function sum2(x, ...arr) {
        return [x, ...arr]; //리스트 반환
    }

    console.log( sum2("홍길동", 1) )
    console.log( sum2("홍길동", 1,2) )
    console.log( sum2("홍길동", 1,2,3) )


    //함수의 default매개값
    function sum3(x, y = 10, z = 100) {
        return x + y + z;
    }

    console.log( sum3(1) ) //111
    console.log( sum3(1, 2) ) //103
    console.log( sum3(1, 2, 3) ) //6
    console.log( sum3(...[1,2] )) //1,2를 추출해서 전달 //103

3.  Destructuring assignment (구조 분해 할당)

1. 배열에서 destructuring

 

    let arr = ["홍길동", "이순신", "홍길자", "김철수"];
    /* 기존의 방법
    let n1 = arr[0];
    let n2 = arr[1];
    let n3 = arr[2];
    let n4 = arr[3];
    */

    //위치요소를 반환받아서 한번에 사용한다.
    let [a,b,c,d] = arr;
    console.log(a,b,c,d)

    let [n1, , ,n2] = arr;
    console.log(n1, n2)

    //전부다 반환한다.
    let [...x] = arr;
    console.log(x);

    //남아있는 모든 요소를 반환한다.
    let [k1, k2, ...all] = arr;
    console.log(k1, k2, all)

 

2. 객체에서 destructuring

    let person = {
        "name": "김철수", 
        "age" : 30,
        "job" : ["programmer", "designer"]
    }
	
    //name키 값을 가져온다.
    let {name} = person;
    console.log(name);
    
    let {name, age, job} = person;
    console.log(name, age, job);

    //다른 이름으로 가져오기
    let {name: aaa, age:bbb} = person; //name을 aaa이름으로 가져온다
    console.log(aaa, bbb)

4. for of문

1. 반복 가능한 객체(iterable)를 for문 안에서 반복시켜 연속된 결과값을 얻습니다.

2. forEach문에서 지원하지 않는 break, continue, return의 사용가능

    let arr = ["a", "b", "c"];
    //기존의 for문
    /*
    for(let i = 0; i < arr.length; i++) {
        console.log(arr[i]);
    }
    for(let i in arr) {
        console.log(arr[i]); //i는 인덱스를 담아준다
    }
    */
    
    //기존의 foreach문
    /*
    arr.forEach(function(value, index, arr) { 
        console.log(value);
        console.log(index);
        console.log(arr);
    })
	*/

    //es06 - forof문 (단 list같은 반복가능 요소에만 적용된다)
    for(let i of arr ) {
        console.log(i); //값을 뽑아준다.
    }
    
    //error
    let obj = {name: "g", age: 1};
    for(let i of obj) {
        console.log(i);
    }

5. Backtick 

1. 백틱 `을 용해서 문자열을 표현하고, 템플릿 리터럴 ${}를 이용해서 필요값을 처리

    let name = '홍길동';
    let age = 20;
	//기존문법
    console.log('제 이름은 ' + name + '이고 나이는 ' + age + "입니다");
    //backtick문법    
    console.log(`제 이름은 ${name}이고 나이는 ${age}입니다`);

6. Arrow Function (화살표함수 👍)

1. 화살표 함수는 기본적으로 익명함수를 대체합니다. (호이스팅 불가)

2. 가독성이 향상됩니다.

    //기존익명함수
    /*
    var a = function() {
        console.log('a실행');
    }
    */
    
    //화살표
    let a = () => { 
        console.log('a실행');
    }

 

문법1
코드가 한개줄이면 {} 생략이 가능하다
{}를 쓰지 않으면 기본값으로 undefined를 반환합니다.
{}를 쓰지 않고 구문을 작성하면 리턴문이 됩니다.
    let b1 = (a) => console.log(a); //출력
    console.log( b1(1) ); //undefined

    let b3 = (a, b) => a + b; //리턴문
    console.log( b3(1, 2) ); //3
문법2
매개변수가 1개라면, 매개변수 자리의 ()의 생략이 가능합니다.
    let func = a => a + 10;
    console.log ( func(10) ); //20
문법3
객체를 반환 할때는 ()를 묶어 줍니다.
    //1st
    let c = () => {
        return {key: '홍길동'};
    }
    //2nd
    let d = () => ({key: '이순신'});

화살표 함수의 응용 forEach, filter, map

1. forEach - 반복문

array.forEach(callbackFunction(currenValue, index, array), thisArg) 
  • currenValue: 현재값
  • index: 현재인덱스
  • arrayt: 현재배열,
  • thisArg: callbackFunction 내에서 this로 사용될 값
    //1st
    list.forEach( function(x, y, z) {
        console.log(x, y, z);
    });
    //2nd
    list.forEach( (x,y,z) => console.log(x,y,z) )

2. filter - 요소개수만큼 반복하며 boolean을 이용한 새로운 list를 만듬

array.filter(callbackFunction(currenValue, index, array), thisArg) 
    var result = list.filter( function(x, y, z) {
        return x % 2 == 0; //요소가 true인결과를 반환(요소들의 짝수만 반환)
    });
    console.log(`result: ${result}`);  //2, 4, 6, 8, 10
    
    //2nd
    var result = list.filter( (x, y, z) => x % 2 == 0);

3. map - 실행한 결과를 가지고 새로운 배열을 만들 때 사용

array.map(callbackFunction(currenValue, index, array), thisArg) 
    //1st
    var result2 = list.map( function(x, y, z) {
        return x * x; //처리한 연산결과를 반환
    });
    console.log(`result2: ${result2}`); //1, 4, 9, 16 ... 100

    //2nd
    var result2 = list.map( x => x * x );

4. this키워드의 사용 - 일반함수로만 가능

    let result3 = list.map(function(x) {
        return x % this.value == 0 ? true : false;
    }, {value: 5}); //this가 된다.

    console.log(result3); //f, f, f, f, t ,f, f, f, f, t

7.  class

일반HTML에서는 굳이 class를 사용하진 않습니다. 

React의 class컴포넌트를 사용한다면 알아두세요.

1. 클래스의 멤버변수를 선언할 때는 키워드를 사용하지 않습니다. (구형브라우저에서는 지원불가 할 수 있음)

    class Person {
        //멤버변수 
        name = '홍길동';
        age = 20;

        //객체변수
        state = { 
            a: 1,
            b: () => {
                return 'obj의 b';
            }
        }

        //생성자
        //자바스크립트 생성자는 1개 입니다. (생성자 중복 불가)
        //멤버변수는 선언하지 않더라도 this.변수명을 지칭하면 자동 생성됩니다.
        constructor(addr) {
            this.addr = addr;
        }

        //함수
        func = (a) => {
            return "함수호출";
        }

    }
    
    //객체 생성1
    let p = new Person();

    console.log(p.name) //멤버변수 접근
    console.log(p.age)
    console.log(p.func()); //함수호출한 결과 출력
    console.log(p.state.a); //obj의 a접근
    console.log(p.state.b()); //obj의 b함수 호출한 결과 출력
    
    //객체의 생성2
    let p2 = new Person('서울시');
    console.log(p2.addr); //서울시

클래스 상속

    class Shape {
        constructor() {}
    }

    class Rect extends Shape {
        //생성자 자체는 생략가능
        constructor(w, h) {
            super(); //반드시 연결
            this.w = 20;
            this.h = 10;
        }    

        /* set */ setW(w) {
            this.w = w;
        }
        setH(h) {
            this.h = h;
        }     

        /* get */ getArea() {
            return this.w * this.h
        }

        // get, set, static 예약어로 메서드를 설정할 수 있음
    }

    //객체생성
    let rect = new Rect();
    console.log(rect.getArea())	// 200

    rect.setH(100);	
    rect.setW(20);
    console.log(rect.getArea())	// 2000

 

8. module import export

* 모듈 임포트

- 모듈은 JS ES6문법에서 미리 작성해 놓은 스크립트 파일이며, 모듈 안에는 변수, 함수, 클래스 등이 정의되어 있습니다.

- ES6부터는 주요기능들을 모듈로 구성하여 사용이 가능합니다.

- 모듈을 내보내는 방법은 named export방식과 default export방식 2개가 있습니다.
- 여러 값을 내보낼 때 named export방식
- 단일 값을 내보낼 때 default export방식

script01.js

//내보내기 1
export const name = '홍길동';
export const age = 20;

export const getInfo = () => {
    console.log('이름:', name, '나이:', age);
}

//내보내기2
let sum = 0;
let add = (x) => {
    sum += x;
    console.log(sum);
}

export {sum, add}; //선언해논 변수를 export{} 로 내보내기

script01.html

  • HTML5파일에서 예외적으로 module을 사용할려면 type="module" 문을 반드시 작성합니다.
<script type="module">
    //HTML5표준에서 예외적으로 module을 사용할려면 type="module" 문을 반드시 작성합니다.

    //import방법1 (Destructuring방식)
    import {name, age, getInfo} from './script01.js';

    console.log(name);
    console.log(age);
    getInfo(); 

    //import방법2 (Alias방식)
    import * as test from './script01.js';
    
    console.log(test.name);
    console.log(test.age);
    test.getInfo();
    console.log(test.sum);
    test.add(10);

    //import방법3 (이름바꿔 가져오기);
    import {name as n, age as a, getInfo as get} from './script01.js';
    
    console.log(n);
    console.log(a);
    get();


</script>

 

 

하나의 모듈에서 하나의 객체를 이름으로 내보낼 때 단일 객체 내보내기 export default문을 사용합니다.

Class나 함수를 내보낼떄는 세미콜론을 붙이지 않도록 권유됩니다.

script02.js

class Person {

    constructor(name, age) {
        this.name = name;
        this.age = age;
    }    

    getInfo = () => {
        return '이름:' + this.name; 
    }

}

export default Person

script02.html

<script type="module">
    //import방법 4
    import Person from './script03.js';

    //클래스 import로 객체 생성문이 필요합니다.
    let park = new Person('홍', 20);
    console.log(park.name);
    console.log(park.age);

</script>

 

'Front-End > JavaScript(ES6)' 카테고리의 다른 글

JS ES6 문법 Promise, async, await  (0) 2022.12.30

출처

https://heropy.blog/2018/11/24/css-flexible-box/

 

CSS Flex(Flexible Box) 완벽 가이드

많은 경우 float, inline-block, table 등의 도움을 받아서 수평 레이아웃을 구성하지만 이는 차선책이며, 우리는 Flex(Flexible Box)라는 명확한 개념(속성들)으로 레이아웃을 쉽게 구성할 수 있습니다. CSS F

heropy.blog

























'Front-End > HTML & CSS' 카테고리의 다른 글

5. FLEX기초문법  (0) 2022.06.23
3. CSS기초문법1(선택자, font, border, text속성)  (0) 2022.06.23
2. HTML태그  (0) 2022.06.23
1. HTTP통신과 웹  (0) 2022.06.23










 

'Front-End > HTML & CSS' 카테고리의 다른 글

5. FLEX기초문법  (0) 2022.06.23
4. CSS기초문법2(display, background, padding-margin, box-sizing, float, position)  (0) 2022.06.23
2. HTML태그  (0) 2022.06.23
1. HTTP통신과 웹  (0) 2022.06.23

+ Recent posts