React💎
state & event
: component내부에서 정의하는 상태가 state
이며, state
는 객체 형태를 가진다.
: state를 가질 수 있는건 class
뿐이다.
class Button extends React.Component {
constructor() {
super();
this.state = {
clicked : false //여기서의 this는 Button component로 유지
}
}
render () {
return () {
}
먼저 위에서 부터 봤을때, class 는 constructor()를 제일 먼저 실행시키기 때문에 그 constructor () {}
의 중괄호 공간 안에 먼저 this.state를 통해 component에 필요한 state를 선언한다.
this.state
는 항상 객체 형태를 유지한다.
jsx를 화면에 구현화 하는 부분이 render() {}
이다.
사용자가 입력할 ID
,사용자가 입력할 비밀번호
조건맞을지 확인 할true/false
가 필요할 기능이기때문에 먼저 this.state에 object를 추가해 준다. this.state = {
userID = "",
userPassword = "",
ready : false
}
false
로 저장해주고, userID와 userPassword도 입력 전이기 때문에 ""빈 값
으로 설정해준다.<input Onchange = {this.함수이름}>
으로 저장해준다.<input onChange = {this.idChangeHandler} type="text" id="username-field" className="login-form-field" placeholder="전화번호, 사용자 이름 또는 이메일"/>
<input onChange = {this.passwordChangeHandler} type="password" id="passwsord-field" className="login-form-field" placeholder="비밀번호"/>
이후 constructer()
와 render()
사이에 구현하고자 하는 함수를 넣어준다.
input 값에 입력된 값을 보고 확인하기 때문에 parameter로 e
를 넣어주고,
this.setState
를 통해 해당 event가 일어나면 정해줄 state값을 객체로 표시한다
setState는 비동기 함수
이다. 먼저 요청을 해 놓고, 실제 이벤트가 발생했을때 실행 시키는 요소이므로, 각각의this.state했을때의 현 상황으로 이해하면 되며 항상 console.log
찍어보면서 확인하는 과정이 중요하다.
idChangeHandler = e => {
this.setState({
IDInput : e.target.value,
ready : this.state.passwordInput.length>5 && e.target.value.includes("@") ? true : false
})
}
//위의 코드를 보면, idChangeHandler가 실행된 경우 ,
//id값의 value를 IDInput값으로 저장시키게끔하고
//ready객체에서 기존에 요청한 조건이 맞으면
//조건?true:false인 삼항연산자를통해 변화할 boolean 값을 정해주었다.
passwordChangeHandler = e => {
this.setState({
passwordInput : e.target.value,
ready : e.target.value.length>5 && this.state.IDInput.includes("@") ? true : false
})
}
render () {
//아래 password도 id값과 동일하게 적용해 주었고,
//이제 true/false값을 사용해 class값을 toggle시키는 작업을 하면
//이 이벤트는 완성된다.
javascript함수는 항상 {}에 넣기
this.state가 ready true이면 class값을 미리 설정해둔 진한 파랑으로, false이면 연한파랑으로 적용되게끔 만들어 준다. <input className= {this.state.ready ?
"ready-to-submit" : "not-ready-to-submit"}
onClick = {this.clickHandler} type="submit" value="로그인"/>
사용자가 입력할 댓글내용
,사용자가 입력했다면 입력할 댓글을 표시하고 입력하지 않았다면 빈칸 표시를 나타내 줄 true/false
가 필요할 기능이기때문에 먼저 this.state에 object를 추가해 준다. this.state = {
comment : "",
clicked : false
};
button
에 onClick
이벤트를, 게시글을 state에 저장할 공간인 textarea
에는 onChange
함수를 적용한다. <textarea onChange = {this.changeHandler} className="comment-field" placeholder="댓글 달기..."></textarea>
<button onClick = {this.clickHandler} className="click-to-post" type="submit">게시</button>
constructor () 와 render()사이에 아래 정의한 함수가 호출되면 실행할 함수를 정의한다.
먼저 댓글value를 comment state
로 저장해준다
클릭 하면 클릭이벤트가 true로 바뀌도록
저장해준다.
changeHandler = (e) => {
this.setState ( {comment : e.target.value })
}
clickHandler = () => {
this.setState({clicked : true})
}
<div> {this.state.clicked ? "this state.comment : ""} </div>