본문 바로가기

카테고리 없음

[React] 인풋 상태관리/e.target.value

인풋을 이야기하지만, 사실상 이벤트에 대한 이야기다. 

이벤트는 사용자가 하는 어떤 행위이다.

버튼을 클릭하거나, 입력창에 텍스트를 입력한다던가 하는 그런 이벤트

이벤트가 발생하는 태그는 input, button 등이 있다.

그 중 input에 대해 배우면, button도 자연스레 알기 쉬워진다.

 

1. input 태그

  - <input />

  - name : input 태그의 명칭

  - placeholder : input 최초값 (상수)

  - onChange : input의 값이 변경됨을 감지했을 때 실행할 함수 매칭

  - value :  input의 값

 

2. state 정의

  - name : "홍길동",

  - myphone : "0000"

 사실상, placeholder가 없으면, state 첫 선언 시 초기설정 가능, 하지만 placeholder를 별도로 관리하는 것이 여러 개발자가 공동으로 협업할 때는 훨씬 수월하다.

 

3. 입력란이 변경되면 뭔가를 해줘야해~

   handleChange() 함수 만들기 (이름은 내맘대로 짓기)

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

handleChange = (e) =>{  

※ (참고)  (e) => { e를 받아서 할 일들 }

 e는 우리가 통상쓰는 변수이다. e가 아니라, x를 써도 되고, y를 써도 된다. 
 이 함수는 어떤 객체를 넘겨받는다는 것을 뜻한다. 
 e가 뭔지는 모르지만, 뭔가 e라는 놈을 넘겨받을 거란 얘기!!!

 

this.setState({  

 setState 는 리렌더링이라고 생각하면 쉽다. 웹페이지를 새로고침하는것과 비슷하다.

 왜 새로고침해야할까? 화면에 표현된 어떤 값이 변경되었기 때문이다. 우린 그걸, 상태변화 라 하기로 했다.

 어떤 상태가 변했을 때 변화된 값을 띄워주기 위해 페이지를 새로고침하는것.   

(화면이 바뀐다? 상태가 변화된다? 어떤 예가 있을까??)

 가령, 유투브에 댓글을 쓰고, 클릭!하면, 내 댓글이 해당 유투브 댓글란에 올라간다.   댓글란에 올라가기 전과 후, 상태는 변화된 것이다.

 

this. ==> setState는 내장함수이다. 이미 선언되어있다. 그래서 내가 가지고 있는 바로 이 함수를 쓸거야~라고 얘기해주기 위해 this를 쓴다.

아...그런데 난 setState를 만든적이 없는데? 라고 하실수 있다.

클래스  정의할 때 extends를 사용해서 부모로부터 상속받았던것이다.부모님이 누구야? Component. 리액에서 정의해놓은 컴포넌트~

 

 

[e.target.name] : e.target.value키 : 값 형태의 json 형식이다.키는 e.target.name, 즉 input 태그 상에서 넘겨준 객체인 e의 name이란 변수이다.두개의 input form에서 첫번째 입력란은 name = "name" 두번째입력란은 name="myphone"이라고 선언했다. 여기서 "name"과 "myphone"은 변화하지 않는 value일 것 같으나, 사실상 state에 해당하는 값이다."name"과 "myphone"은 내가 입력하는 값을 받는 변수와도 같다.

 

따라서, value = this.state.name 또는 myphone으로 선언해주는 것이다.
 

소스코드 실행결과

import React, { Component } from 'react'

export default class PhoneForm extends Component {
 
    //상태를 정의합니다.
  state = {

    name: '홍길동',
    myphone : '0000',
  }
 
  handleChange = (e) =>{
    this.setState({
        //name: e.target.value
        [e.target.name] : e.target.value,
      //  [e.target.phone] : e.target.value  ==> 이건 틀린 코드이다. phone이라는 input 내에 정의된 속성이 없기 때문이다.
       
        //input의 name 변수 값이 변하는것은 아니고
        //name의 placeholder (초기값)이 value로 변하는 것임
    });
  }
 
    render() {
        console.log(this.state.name);  
        console.log(this.state.myphone);
       
    return (
    <form>
        <input
       
        name='name' //여기서 'name'은 사실상 변수와도 같은 역할을 한다.
         placeholder="이름"
         onChange={this.handleChange} // 변화가 감지되면 이 클래스 내부에 정의된 handleChange라는 함수를 호출한다.
         value = {this.state.name} /> 
        <input
       
        name= "myphone" //여기서 'myphone'은 사실상 변수와도 같은 역할을 한다.
        placeholder='전화번호'
        onChange={this.handleChange}  // 변화가 감지되면 이 클래스 내부에 정의된 handleChange라는 함수를 호출한다.
 
        value={this.state.myphone}/>
       
    </form>
   
    )
  }
}