https://youtu.be/x3rhCJWGFc4 를 보며 공부하고, 이해하기 위해 정리 중입니다.


map() 메소드는 파라미터로 전달 된 함수를 통하여 배열 내의 각 요소를 처리해서 그 결과로 새로운 배열을 생성합니다.


사용 문법

arr.map(callback, [thisArg])


callback 새로운 배열의 요소를 생성하는 함수로서, 다음 세가지 인수를 가집니다.

currentValue 현재 처리되고 있는 요소

index 현재 처리되고 있는 요소의 index 값

array 메소드가 불려진 배열

thisArg (선택항목) callback 함수 내부에서 사용 할 this 값을 설정


Ex)

let numbers = [1,2,3,4,5];


let result = numbers.map((num) => {

return num*num;

});


결과값: [1, 4, 9, 16, 25]


똑같은 원리로 배열을 매핑 할수 있다.

데이터 배열을 렌더링 할때는 map으로 간단하게.





render() { const mapToComponents = (data) =>{ return data.map((contact, i)=>{ return(<ContactInfo contact={contact} key={i}/>) }) }; return(<ContactInfo contact={contact} key={i}/>) ;


에서 key 를 포함 하는 이유는 리액트에서는 array에서 키로 아이템을 identify 해서 어떤 아이템의 상태변화가 있을때, 바로 알 수 있게 한다고 한다.


(참조:
https://reactjs.org/docs/lists-and-keys.html#keys )


Keys help React identify which items have changed, are added, or are removed. Keys should be given to the elements inside the array to give the elements a stable identity:


const numbers = [1, 2, 3, 4, 5];

const listItems = numbers.map((number) =>

<li key={number.toString()}>

${number}

</li>

);


가장 좋은 방법은 아이템에 유니크한 id를 키로 부여하는 방법이다 (id가 있다면)


const todoItems = todos.map((todo) =>

<li key={todo.id}>

{todo.text}

</li>

);


아이템의 정렬 순서가 바뀔지도 모르기 때문에 인덱스를 키로 사용하는걸 권장하지 않는다. 하지만 key를 설정하지 않으면 default로 인덱스를 키로 사용한다.
















'IT > ReactJS' 카테고리의 다른 글

state 란?  (0) 2018.12.07
props 란?  (0) 2018.12.07
react-redux는?  (0) 2018.12.07
Redux의 Store  (0) 2018.12.07
React 는 뭘까?  (0) 2018.12.05

https://youtu.be/i_ooWEUtCMc 를 보며 공부하며 정리 겸 작성하는 글입니다.


컴포넌트에서 유동적인 데이터를 보여줄때 사용됨

초기값 설정이 필수, 생성자(constructor) 에서 this.state = {} 로 설정


값을 수정할 때에는 렌더링 된 후에 this.setState({...} 가능. (즉 constructor 안에서, 렌더링 전에는 setState를 사용 불가능)

그리고 렌더링 된 후에는 this.state = 로 절대 수정 하지 말것 

(속도 및 React의 장점인 바뀐 부분만 업데이트 하는 걸 버리는 행위임 (forceUpdate 라는 메소드로 강제 업데이트가 가능하긴함))


예시)

class Counter extends Component {

  

  constructor(props) {

    super(props); 

    // super 를 통하여 부모인 Component의 생성자를 먼저 실행하고 할 작업들을 함.

    // super(props); 를 먼저 실행해줘야 이 메소드 안에서 this.state 라던지 props 라던지 를 접근할 수 있음.

    this.state = {

      value: 0

    };

    this.handleClick = this.handleClick.bind(this);

  }

  handleClick() {

    this.setState({

      value: this.state.value + 1

    });

  }

  render() {

    return (

      <div>

        <h2>{this.state.value}</h2>

        <button onClick={this.handleClick}>Press Me</button>

      </div>

    );

  }

}


class App extends Component {

  render() {

    return (

      <Counter />

    );

  }

};


ReactDOM.render(

  <App></App>,

  document.getElementById("root")

);


 

'IT > ReactJS' 카테고리의 다른 글

컴포넌트 매핑 (Component Mapping)  (0) 2018.12.07
props 란?  (0) 2018.12.07
react-redux는?  (0) 2018.12.07
Redux의 Store  (0) 2018.12.07
React 는 뭘까?  (0) 2018.12.05

https://youtu.be/atSIfMAmSic 에서 공부하며 안까먹고 나중에 다시 보기위해 정리한 내용 입니다.


props는


컴포넌트 내부의 Immutable Data 를 처리할때 사용 합니다.

props가 보여질

JSX 내부에 { this.props.propsName }

컴포넌트를 사용 할 때, < > 괄호 안에 propsName="value"

this.props.children 은 기본적으로 갖고있는 props로서, <Cpnt>여기에 있는 값이 들어간다.</Cpnt>


이런 식으로.


상위 컴포넌트 에서 하위 컴포넌트로 전달하는 법은

(이 상황에서는 

App 컴포넌트가 상위 컴포넌트

Codelab 컴포넌트가 하위 컴포넌트)


ReactDOM 렌더링 할때 App 컴포넌트에 name 과 <App></App> 사이에 값을 넣고,

App 컴포넌트 리턴 하는 부분에 하위 컴포넌트인 Codelab의 name과 <Codelab></Codelab> 사이에 각각 {this.props.name} 과 {this.props.children} 을 넣어 주고

Codelab 컴포넌트 리턴 하는 부분에 {this.props.name} 과 {this.props.children} 을 넣으면 전달 완료!

 


props의 기본값을 설정하는 방법


컴포넌트의 선언이 끝난 뒤, 


컴포넌트명.defaultProps = {

value: 0

};

으로 설정하면 된다.


Type 검증 하는 방법

특정 props 값이 특정 props 타입이 아니거나,  필수 props인데 입력하지 않았을 경우 개발자 콘솔에서 경고 띄우게 할수 있음


방법은,

컴포넌트의 선언이 끝난 뒤,

(React v15.5 부터 React.PropTypes 가 deprecated 되어서 prop-types 라이브러리 추가해야함)


컴포넌트명.propTypes = {

value: PropTypes.String,

secondValue: PropTypes.number,

thirdValue: PropTypes.any.isRequired

};


propTypes는 필수가 아니지만 유지보수 할때 남이 봤을때 한번에 알아볼수 있게 해야하므로 필요함.






'IT > ReactJS' 카테고리의 다른 글

컴포넌트 매핑 (Component Mapping)  (0) 2018.12.07
state 란?  (0) 2018.12.07
react-redux는?  (0) 2018.12.07
Redux의 Store  (0) 2018.12.07
React 는 뭘까?  (0) 2018.12.05


react-redux는 React에서 redux를 편리하게 사용하게 해주는 뷰 바인딩 도구, 즉, 스토어를 뷰에 쉽게 연결 해주는 도구임.



핵심은


Provider 

- 컴포넌트에서 리덕스를 사용하도록 서비스를 제공해줌

- Provider 자체도 컴포넌트


import { Provider } from 'react-redux';


ReactDOM.render(
<Provider store={store}>
<App/>
</Provider>,
document.getElementById('root')
);


ReactDOM 렌더링 하는 index.js 에 추가하기.


하지만 아직 다른 컴포넌트에서 store에 접근할수 없음


그래서


connect([...options])


connect 함수를 사용하는데 이 함수는

 

옵션을 인수로 받고 전달받은 인수를 사용해서 컴포넌트를 redux에 연결하는 또 다른 함수 반환


Ex) 


connect()(컴포넌트)


Count컴포넌트를 연결하려면


connect()(Count)


즉 반환 받은 그 또 다른 함수에 redux에 연결하고 싶은 컴포넌트를 인수로 전달하면 됨

연결된 후 redux와 연결되어 있는 새로운 컴포넌트가 반환됨. (원래의 컴포넌트에는 변화 X)

(store에 연결 된 새로운 컴포넌트 클래스가 반환됨. 옵션이 없으면 this.props.store 로 접근 가능)


connect 에 option들을 넣으면 안 넣을 때보다 접근하기가 깔끔해짐.

connect(

[mapStateToProps],

[mapDispatchToProps],

[mergeProps],

[options]

)


mapStateToProps, mapDispatchToProps, mergeProps 는 함수 형태의 파라미터


mapStateToProps 는 state를 파라미터로 가진 함수이고 state 를 props로 연결 해주는 함수

mapDispatchToProps 는 dispatch 를 파라미터로 가진 함수이고 dispatch한 함수를 props로 연결 해주는 함수

mergeProps는 state 와 dispatch 를 파라미터로 가진 함수, 두개 동시에 사용 할때 사용하는 함수


options 에는

{ [ pure = true ], [ withRef = false ] }


pure 는 기본적으로 true 로 설정되어 있는데 true 일때는 불필요한 업데이트 X


withRef 는 기본적으로 false 이고 true 일때는 리덕스에 연결된 컴포넌트를 Wrapped(?)에 담아서 getWrappedInstance() 를 통하여 접근할수 있게함



Smart Component 인 Counter에서 redux에 connect를 한다음에 redux 작업을 할건데


Counter.js 안에서

import Value from './Value';

import Control from './Control';


Value, Control 컴포넌트는 리덕스에 연결해 받은 값을 


render() {
return(
<Value number={this.props.number}/>
<Control
onPlus={this.props.handleIncrement}
onSubtract={this.props.handleDecrement}
onRandomizeColor={this.setRandomColor}
/>
</div>
);
}


이런 식으로 전달해 줄 것이다. (예시만 보여준것)


connect를 사용하기 위해서


import { connect } from 'react-redux';

로 불러 오고


export default Counter;

보다 위쪽에


아까 connect에 들어가는 옵션들을 선언 해줄건데

const mapStateToProps = (state) => {
//state는 컴포넌트의 state가 아니라 파라메터 명이 state인것. 그리고 리덕스의 state를 칭하는것.
return {
number: state.counter.number,
color: state.ui.color
};
}

const mapDispatchToProps = (dispatch) => {
return {
handleIncrement: () => { dispatch(actions.increment())},
handleDecrement: () => { dispatch(actions.decrement())},
handleSetColor: (color) => { dispatch(actions.setColor(color))}
};
}


이런식으로.


그리고 객체 리턴 안에 어떠한 props가 state의 어떠한값과 연결될지 정한다.

추가할 props 를 선언하고 state의 안에 있는 값을 넣음


액션을 추가할때는 


import * as actions from '../actions';

로 만든 actions 를 불러오고


각 action에 원하는 props를 만들어서 props 안에 해당 action을 하는 함수를 넣는다


그리고 mapDispatchToProps 를 더 쉽게 하는 방법이 있는데 


import { connect, bindActionCreators } from 'react-redux';

를 불러와서


const mapDispatchToProps = (dispatch) => {
return bindActionCreators(actions, dispatch);
}


이렇게 리턴해주면 알아서 액션과 dispatch의 처리를 알아서 해준다. 파라메터까지.

단점은 액션의 function 이름 그대로 사용할수 밖에 없다는 점.


잘 사용하면 유용함.


이제, Counter를 redux로 연결할 차례


export default connect()(Counter);


아까 말했듯이 connect() 가 다른 함수를 반환하고 

그 함수의 인자를 Counter로 넣으면 연결됨.


그리고 첫번째 소괄호() 안에 options를 넣지 않으면 

Ex)

return(
<div>
<Value number={this.props.store.getState().counter.number}/>
<Control />
</div>
);


해야하는데 options를 이렇게

export default connect(mapStateToProps, mapDispatchToProps)(Counter);

전달 해주면


return(
<div >
<Value number={this.props.number}/>
<Control />
</div>
);


이렇게만 적어도 된다.


그래서 액션들까지 다 redux와 연결해보면

return(
<div>
<Value number={this.props.number}/>
<Control
onPlus={this.props.handleIncrement}
onSubtract={this.props.handleDecrement}
/>
</div>
);


이런식으로 하면 된다.

number, onPlus, onSubtract, onRandomizeColor 들은 해당 컴포넌트 들의 prop들의 이름 이므로 본인이 정한대로 해야함.


이제 div의 color를 랜덤하게 바꿔 볼껀데,

그 동작을 하는 메소드가 없으므로 Counter 컴포넌트에 메소드를 작성한다

class Counter extends Component {
...
setRandomColor() {
const color = [
Math.floor((Math.random() * 55) + 200),
Math.floor((Math.random() * 55) + 200),
Math.floor((Math.random() * 55) + 200)
];
this.props.handleSetColor(color);
}
...
}



this.props.handleSetColor(color);

에서 this를 사용하므로


this 를 바인딩 해줘야 하는데

보통 클래스 안의 맨 첫라인에


constructor(props) {
super(props);
this.setRandomColor1 = this.setRandomColor.bind(this);
}


를 넣어 this 를 바인딩 해준다. 

( this.setRandomColor = this.setRandomColor.bind(this); 로 해도 되지만

본인은 기초 지식이 부족해 헷갈릴 때를 대비해 조금 변경하였다)


return(
<div>
<Value number={this.props.number}/>
<Control
onPlus={this.props.handleIncrement}
onSubtract={this.props.handleDecrement}
onRandomizeColor={this.setRandomColor1}
/>
</div>
);



그리고 onRandomizeColor 에 바인딩 된 this.setRandomColor1 을 넣는다.


또한, 그 색상을 위의 div의 style로 넣어 변경해보겠다.


smart component 는 보통 style이 없다고 하지만 예외적으로 그냥 넣는다.


render() {
const color = this.props.color;
const style = {
background: `rgb(${color[0]}, ${color[1]}, ${color[2]})`
};
return(
<div style={style}>
<Value number={this.props.number}/>
<Control
onPlus={this.props.handleIncrement}
onSubtract={this.props.handleDecrement}
onRandomizeColor={this.setRandomColor1}
/>
</div>
);

}


style 상수를 만들어 background에 rgb 값을 넣는다.

간략하게 하기 위해 es6에 Template Literals 이라고 해서 백틱(1 왼쪽과 탭 위에 있는 `) 안에 #{} 변수, 상수를 넣을수 있다.



Velopert 님의 동영상을 보며 공부하며 기억하기위해 정리한 글이니까 더 정확하고 좋은 설명은 아래 유튜브에서 참고하면 될듯.


https://youtu.be/bp_eliWWWRA

[React.js] 강좌 5-8편 Redux: react-redux | 컴포넌트에서 사용하기






'IT > ReactJS' 카테고리의 다른 글

컴포넌트 매핑 (Component Mapping)  (0) 2018.12.07
state 란?  (0) 2018.12.07
props 란?  (0) 2018.12.07
Redux의 Store  (0) 2018.12.07
React 는 뭘까?  (0) 2018.12.05

Store는 어플리케이션의 현재 상태를 지니고 있음

Redux를 사용하는 어플리케이션은 단 하나의 Store를 가지고 있어야 함

createStore(reducer) 로 생성 하여 사용 가능


import { createStore } from 'redux';
import reducers from './reducers';

const store = createStore(reducers);


Store가 하는 일


dispatch(action)

- action을 reducer로 보낸다는 뜻

dispatch 가 실행되면 store가 reducer로 현재 자신의 상태와 전달 받은 action을 전달해줌

그러면 reducer가 어떤 변화가 필요한지 알아내고 새 상태를 주면 현 상태에 갈아 끼움

 

getState()

현재 상태를 반환하는 함수


subscribe(listener)

상태가 바뀔때 마다 실행할 함수를 등록하는 함수

listener는 바뀔때 마다 실행될 콜백 함수


replaceReducer(nextReducer)

Hot Reloading 과 Code Splitting 때 사용하는 함수


Unsubscribe 하는 방법은


subscribe(listener: () => void): Unsubscribe


즉 예를 들면,

store.subscribe(() => console.log(store.getState()));

이렇게 subscribe 하는 동작을


const unsubscribe = store.subscribe(() => console.log(store.getState()));

에 넣어서

unsubscribe();

실행 하면 Unsubscribe 하여 더이상 상태변화를 읽지 않는다.



'IT > ReactJS' 카테고리의 다른 글

컴포넌트 매핑 (Component Mapping)  (0) 2018.12.07
state 란?  (0) 2018.12.07
props 란?  (0) 2018.12.07
react-redux는?  (0) 2018.12.07
React 는 뭘까?  (0) 2018.12.05

React가 뭔데?


React 는 

A JavaScript library for building user interfaces

(참조: https://reactjs.org )

공식 홈페이지의 메인화면에 나와있다. 해석해보자면 UI 만드는 JS 라이브러리 이다. + 페이스북에서 오픈소스로 만들고 관리중이다.

JS 라이브러리이니까 JS로 작성한다.


좋냐?


1. Virtual DOM(가상 DOM)이 있어 UX 적으로 낫고, 개발도 빠르다.

등등등


(참고할 문서: https://da-14.com/blog/its-high-time-reactjs-ten-reasons-give-it-try )



오 그럼 어떻게 작동하는데?


다 설명하면 끝도 없고, 


DOM 과 Virtual DOM이 작용하는 방식을 보면

(참조: https://www.altexsoft.com/blog/engineering/the-good-and-the-bad-of-reactjs-and-react-native )


ReactJS가 Virtual DOM으로 Real DOM 과 Element들을 연결 해줘서 개발자가 Real DOM 이랑 직접 연결할 필요가 없어진다. 게다가 Component 들로 구성되어 있어 해당 Component에 변화가 생기면 DOM 전체를 다시 로딩하는게 아니라 변화된 부분만 업데이트를 해서 속도가 비교도 안되게 빠르다.  또한, Virtual DOM 덕분에 Hot Reloading 이라고 해서 바로바로 변화를 적용 시킬 수 있다. (in a real-time)





'IT > ReactJS' 카테고리의 다른 글

컴포넌트 매핑 (Component Mapping)  (0) 2018.12.07
state 란?  (0) 2018.12.07
props 란?  (0) 2018.12.07
react-redux는?  (0) 2018.12.07
Redux의 Store  (0) 2018.12.07

+ Recent posts