{"data":{"site":{"siteMetadata":{"title":"lastrites2018","author":"lastrites2018","siteUrl":"https://lastrites2018.netlify.com","comment":{"disqusShortName":"","utterances":"lastrites2018/gatsby-first-blog"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"83d3edcd-dfed-537e-af68-bcea711983d2","excerpt":"REACT Components VIEW 단을 책임지는 라이브러리 - 유저 인터페이스를 책임짐 components 단위로 생각하는게 중요하다. 훨씬 더 ‘선언’적이다. Nav Search App VideoList VideoListEntry 하나 하나가 다 컴포넌트. 화면 구성 하나 하나를 다 컴포넌트 단위로 생각해보라. Javascript 안에 html이 있는 구조. 컴포넌트 하나 하나 그 자체로 완전한 기능을 함. 재사용이 좋아지고, 하나의 컴포넌트 단위로 테스트가 가능. JSX props…","html":"<h2 id=\"react-components\"><a href=\"#react-components\" aria-label=\"react components permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>REACT Components</h2>\n<p>VIEW 단을 책임지는 라이브러리 - 유저 인터페이스를 책임짐</p>\n<blockquote>\n<p>components 단위로 생각하는게 중요하다.</p>\n</blockquote>\n<p>훨씬 더 ‘선언’적이다. Nav Search App VideoList VideoListEntry 하나 하나가 다 컴포넌트. 화면 구성 하나 하나를 다 컴포넌트 단위로 생각해보라.</p>\n<p>Javascript 안에 html이 있는 구조. 컴포넌트 하나 하나 그 자체로 완전한 기능을 함. 재사용이 좋아지고, 하나의 컴포넌트 단위로 테스트가 가능.</p>\n<ul>\n<li>JSX</li>\n<li>props - 컴포넌트가 갖는 속성값</li>\n<li>state - 해당 컴포넌트의 상태(하나의 객체로 표현)</li>\n<li>Life cycle</li>\n</ul>\n<h2 id=\"jsx\"><a href=\"#jsx\" aria-label=\"jsx permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>JSX</h2>\n<p>XML 형식으로 JS를 작성.</p>\n<div class=\"gatsby-highlight\" data-language=\"xml\"><pre class=\"language-xml\"><code class=\"language-xml\">React.createElement('div',{className:'red'}, 'Children Text');\n-> JSX\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>red<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Children Text<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>;</code></pre></div>\n<h2 id=\"props\"><a href=\"#props\" aria-label=\"props permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>props</h2>\n<p>JSX 태그로 감싸진 녀석들은 모두 컴포넌트</p>\n<div class=\"gatsby-highlight\" data-language=\"xml\"><pre class=\"language-xml\"><code class=\"language-xml\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>red<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Children Text<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>;\ndiv라는 컴포넌트가 red라는 className을 갖고 있는 형태\nhtml에서 class를 React에서는 className으로 씀\n마치 html attribute를 쓰듯이 작성하며 prop에 문자열을 대입하는 경우를\n제외하고는 중괄호로 감싸줌.</code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> myProp <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> a<span class=\"token punctuation\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">:</span> <span class=\"token number\">2</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token operator\">&lt;</span>div className<span class=\"token operator\">=</span><span class=\"token string\">\"red\"</span> myProp<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>myProp<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>Children Text<span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span></code></pre></div>\n<h2 id=\"state\"><a href=\"#state\" aria-label=\"state permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>state</h2>\n<ul>\n<li>props - 컴포넌트를 사용할때 넘겨줌.</li>\n<li>state - 컴포넌트를 정의할 때 작성.</li>\n</ul>\n<p>state가 변하면 re-render를 해서, 해당 컴포넌트를 다시 그림.</p>\n<ul>\n<li>state는 직접 수정할 수 없다. 대신 setState()를 사용해야 한다.</li>\n<li>State 업데이트는 비동기일 수 있다</li>\n</ul>\n<p><code class=\"language-text\">this.props</code> 및 <code class=\"language-text\">this.state</code> 가 비동기로 업데이트될 수 있기 때문에, 다음 state를 계산할 때 해당 값을 신뢰해서는 안됩니다.</p>\n<p>예를 들어, 카운터를 업데이트하는 이 코드는 실패할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"react\"><pre class=\"language-react\"><code class=\"language-react\">// Wrong\nthis.setState({\n  counter: this.state.counter + this.props.increment,\n});</code></pre></div>\n<p>이 문제를 해결하기 위해 객체가 아닌 함수를 받는 두 번째 형식의 <code class=\"language-text\">setState()</code> 를 사용할 수 있습니다. 이 함수는 이전 state를 첫번째 인수로 받고, 두번째 인수로 업데이트가 적용 될 때 props를 받습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"react\"><pre class=\"language-react\"><code class=\"language-react\">// Correct\nthis.setState((prevState, props) =&gt; ({\n  counter: prevState.counter + props.increment\n}));</code></pre></div>\n<p>위 예제에서는 <a href=\"https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions\">arrow function</a> 을 사용했지만, 평범한 함수도 동작합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"react\"><pre class=\"language-react\"><code class=\"language-react\">// Correct\nthis.setState(function(prevState, props) {\n  return {\n    counter: prevState.counter + props.increment\n  };\n});</code></pre></div>\n<ul>\n<li>\n<p>State 업데이트는 병합됨</p>\n<p><code class=\"language-text\">setState()</code> 를 호출할 때, React는 현재 state와 제공한 객체를 병합합니다.</p>\n</li>\n<li>\n<p>데이터는 아래로 흐른다!</p>\n</li>\n</ul>\n<p>State는 컴포넌트 자신만 접근할 수 있다. 부모나 자식 컴포넌트에선 접근 할 수 없다. 대신, 컴포넌트는 자신의 state를 자식 컴포넌트에게 props로 내려줄 수 있다.</p>\n<p>: 모든 state는 항상 특정 컴포넌트가 가지며, 해당 state에서 파생된 모든 데이터 또는 UI는 트리의 컴포넌트 “아래(below)“에만 영향을 미칩니다.</p>\n<p><code class=\"language-text\">FormattedDate</code> 컴포넌트는 props에서 <code class=\"language-text\">date</code> 를 받지만 이 값이 <code class=\"language-text\">Clock</code> 의 상태인 지, <code class=\"language-text\">Clock</code> 의 props인 지, 혹은 손으로 입력한 건지 알 수 없습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"react\"><pre class=\"language-react\"><code class=\"language-react\">function FormattedDate(props) {\n  return &lt;h2&gt;It is {props.date.toLocaleTimeString()}.&lt;/h2&gt;;\n}</code></pre></div>\n<ul>\n<li>\n<p>모든 컴포넌트는 실제로 분리되어 있다.</p>\n<p>ex) 리액트 튜토리얼 예쩨에서 clock 3개 : 각 clock은 자체적으로 타이머를 생성하고 독립적으로 업데이트 함.</p>\n</li>\n</ul>\n<p>const hello = () => {} 리턴이 필요</p>\n<p>const hello = () => () JS의 ()는 컨테이너 역할만 함.</p>\n<p>브라켓 {} 문법 = 변수를 넣는 컨테이너 역할</p>\n<h1 id=\"react-삽질하기\"><a href=\"#react-%EC%82%BD%EC%A7%88%ED%95%98%EA%B8%B0\" aria-label=\"react 삽질하기 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>react 삽질하기</h1>\n<p>local state는 클래스에서만 사용가능한 기능.</p>\n<h2 id=\"class\"><a href=\"#class\" aria-label=\"class permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>class</h2>\n<p>클래스 컴퍼넌트는 항상 props와 함께 기본 생성자constructor를 호출한다.</p>\n<h2 id=\"내가-저지른-사랑-아니-실수\"><a href=\"#%EB%82%B4%EA%B0%80-%EC%A0%80%EC%A7%80%EB%A5%B8-%EC%82%AC%EB%9E%91-%EC%95%84%EB%8B%88-%EC%8B%A4%EC%88%98\" aria-label=\"내가 저지른 사랑 아니 실수 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>내가 저지른 사랑, 아니 실수</h2>\n<div class=\"gatsby-highlight\" data-language=\"react\"><pre class=\"language-react\"><code class=\"language-react\">ReactDOM.render(\n  &lt;Clock /&gt;, &lt;------ 반드시 쉼표 넣어줘야 한다\n  document.getElementById(&#39;root&#39;)\n);\n\n\n      button = &lt;LogoutButton onClick={this.handleLogoutClick} /&gt;;\n\n   button = &lt;LoginButton onclick={this.handleLoginClick} /&gt;;\n    // onClick이다. 대소문자 유의하자!!\n\nReactDOM.render &lt;- 이거 DOM 자꾸 소문자로 쓰는 문제\n\n                    React.Component // C는 대문자다!</code></pre></div>\n<h2 id=\"event-handling-이벤트-제어하기\"><a href=\"#event-handling-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%A0%9C%EC%96%B4%ED%95%98%EA%B8%B0\" aria-label=\"event handling 이벤트 제어하기 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>event handling 이벤트 제어하기</h2>\n<ul>\n<li>\n<p>react 이벤트는 소문자 대신 camelCase 사용</p>\n</li>\n<li>\n<p>JSX에 문자열 대신 함수를 전달</p>\n</li>\n</ul>\n<p>React에서 기본 동작을 막기 위해 <code class=\"language-text\">false</code> 리턴을 사용할 수 없다. 반드시 명시적으로 <code class=\"language-text\">preventDefault</code> 를 호출해야 합니다. 예를 들어 HTML에서 새로운 페이지를 여는 기본 링크 동작을 막으려면 이렇게 작성할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>a</span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>#<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">onclick</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>console.log(<span class=\"token punctuation\">'</span>The link was clicked.<span class=\"token punctuation\">'</span>); return false<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n  Click me\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>a</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>React에선</p>\n<div class=\"gatsby-highlight\" data-language=\"react\"><pre class=\"language-react\"><code class=\"language-react\">function ActionLink() {\n    function handleClick(e) {\n        e.preventDefault();\n        console.log(&#39;The link was clicked.&#39;);\n    }\n\n    return (\n        &lt;a href=&quot;#&quot; onClick={handleClick}&gt;\n        Click me\n        &lt;/a&gt;\n    );\n}</code></pre></div>\n<ul>\n<li>\n<p>React에서는 리스너를 호출하기 위해서 addEventListener를 호출할 필요가 없다. 대신 요소가 처음 렌더링될 때 리스너를 제공한다.</p>\n</li>\n<li>\n<p>arrow 함수가 항상 좋은 것은 아니다</p>\n<p>JSX 콜백에서 <code class=\"language-text\">this</code> 의 의미에 대해 주의해야합니다. 자바스크립트에서 클래스 메서드는 기본적으로 bind되지 않습니다. 만약 <code class=\"language-text\">this.handleClick</code> 바인드를 잊은채로 <code class=\"language-text\">onClick</code> 에 전달하면, <code class=\"language-text\">this</code> 는 함수가 실제로 호출될 때 <code class=\"language-text\">undefined</code> 로 취급됩니다.</p>\n<p>이건 React에서 정의한 동작이 아닙니다. <a href=\"https://www.smashingmagazine.com/2014/01/understanding-javascript-function-prototype-bind/\">자바스크립트의 함수의 동작 방식</a> 의 일부입니다. 일반적으로 <code class=\"language-text\">onClick={this.handleClick}</code> 처럼 <code class=\"language-text\">()</code> 없이 메서드를 참조하면, 그 메서드를 bind 해야합니다.</p>\n<p>만약 <code class=\"language-text\">bind</code> 를 호출하는 게 귀찮은 경우 이 문제를 해결할 수 있는 두가지 방법이 있습니다. 만약 실험 기능인 <a href=\"https://babeljs.io/docs/plugins/transform-class-properties/\">퍼블릭 클래스 필드 문법</a> 을 사용한다면 클래스 필드를 정확히 콜백에 bind할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">class LoggingButton extends React.Component {\n// This syntax ensures `this` is bound within handleClick.\n// Warning: this is *experimental* syntax.\nhandleClick = () =&gt; {\n  console.log(&#39;this is:&#39;, this);\n}\n\nrender() {\n  return (\n    &lt;button onClick={this.handleClick}&gt;\n      Click me\n    &lt;/button&gt;\n  );\n}\n}</code></pre></div>\n<p>이 문법은 <a href=\"https://github.com/facebookincubator/create-react-app\">Create React App</a> 에서 기본으로 사용할 수 있습니다.</p>\n<p>만약 클래스 필드 문법을 사용하고 싶지 않다면, 콜백에서 <a href=\"https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions\">arrow function</a> 을 사용할 수도 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">class LoggingButton extends React.Component {\nhandleClick() {\n  console.log(&#39;this is:&#39;, this);\n}\n\nrender() {\n  // This syntax ensures `this` is bound within handleClick\n  return (\n    &lt;button onClick={(e) =&gt; this.handleClick(e)}&gt;\n      Click me\n    &lt;/button&gt;\n  );\n}\n}</code></pre></div>\n<p>이 문법의 문제점은 <code class=\"language-text\">LogginButton</code> 을 렌더링할 때마다 서로 다른 콜백이 만들어지는 것입니다. 대부분의 경우에서 크게 문제는 없습니다. 하지만 <strong>만약 콜백에서 하위 컴포넌트에 prop을 전달하는 경우, 이 컴포넌트는 큰 비용으로 다시 렌더링될 수</strong> 있습니다. <strong>이런 종류의 성능 문제를 피하기 위해 보통 생성자 함수에서 바인딩하거나 클래스 필드 문법을 사용하는 걸 권장.</strong></p>\n</li>\n</ul>\n<h2 id=\"이벤트-핸들러에-인수-전달하기\"><a href=\"#%EC%9D%B4%EB%B2%A4%ED%8A%B8-%ED%95%B8%EB%93%A4%EB%9F%AC%EC%97%90-%EC%9D%B8%EC%88%98-%EC%A0%84%EB%8B%AC%ED%95%98%EA%B8%B0\" aria-label=\"이벤트 핸들러에 인수 전달하기 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>이벤트 핸들러에 인수 전달하기</h2>\n<p>반복 안에서 보통 이벤트 핸들러에 추가 파라미터를 전달하고 싶어할 것입니다. 예를 들어, 만약 <code class=\"language-text\">id</code> 가 원시적인 ID라면, 아래처럼 전달할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&lt;button onClick={(e) =&gt; this.deleteRow(id, e)}&gt;Delete Row&lt;/button&gt;\n&lt;button onClick={this.deleteRow.bind(this, id)}&gt;Delete Row&lt;/button&gt;</code></pre></div>\n<p>위 두 라인은 동일하며, <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions\">arrow functions</a>과and <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Function/bind\"><code class=\"language-text\">Function.prototype.bind</code></a> 를 각각 사용하고 있습니다.</p>\n<p>두 경우 모두, React 이벤트를 나타내는<code class=\"language-text\">e</code> 인수는 ID 뒤에 두 번째 인수로 전달됩니다. arrow function을 사용하여 명시적으로 전달해야하지만,<code class=\"language-text\">bind</code>를 사용하면 추가 인수가 자동으로 전달됩니다.</p>\n<h2 id=\"조건부-렌더링\"><a href=\"#%EC%A1%B0%EA%B1%B4%EB%B6%80-%EB%A0%8C%EB%8D%94%EB%A7%81\" aria-label=\"조건부 렌더링 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>조건부 렌더링</h2>\n<p>자바스크립트에서 true &#x26;&#x26; expression 은 항상 expression 으로 평가되고,\nfalse &#x26;&#x26; expression 은 항상 false 로 평가되기 때문에 아래 코드는 동작합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"react\"><pre class=\"language-react\"><code class=\"language-react\">조건이 true 라면 &amp;&amp; 다음에 오는 요소가 노출됩니다.\n만약 조건이 false 라면, React는 이를 무시하고 건너뜁니다.\n\nfunction Mailbox(props) {\n  const unreadMessages = props.unreadMessages;\n  return (\n    &lt;div&gt;\n      &lt;h1&gt;hello1&lt;/h1&gt;\n      {unreadMessages.length &gt; 0 &amp;&amp;\n      &lt;h2&gt;\n          You have {unreadMessages.length} unread messages.\n          &lt;/h2&gt;\n      }\n      &lt;/div&gt;\n  )\n}\n\nconst messages = [&#39;&#39;,&#39;react&#39;, &#39;re:react&#39;, &#39;re:re:react&#39;]\n\nReactDOM.render(\n  &lt;Mailbox unreadMessages={messages} /&gt;,\n  document.getElementById(&#39;root&#39;)\n)</code></pre></div>\n<h2 id=\"constructor와-super를-굳이-쓸-필요가-없다\"><a href=\"#constructor%EC%99%80-super%EB%A5%BC-%EA%B5%B3%EC%9D%B4-%EC%93%B8-%ED%95%84%EC%9A%94%EA%B0%80-%EC%97%86%EB%8B%A4\" aria-label=\"constructor와 super를 굳이 쓸 필요가 없다 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>constructor와 super를 굳이 쓸 필요가 없다</h2>\n<p>아주 예외적인 경우를 제외하고선.</p>\n<p><a href=\"https://hackernoon.com/the-constructor-is-dead-long-live-the-constructor-c10871bea599\">https://hackernoon.com/the-constructor-is-dead-long-live-the-constructor-c10871bea599</a></p>\n<h2 id=\"shouldcomponentupdate\"><a href=\"#shouldcomponentupdate\" aria-label=\"shouldcomponentupdate permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>shouldComponentUpdate</h2>\n<p>setState를 쓰는 이유는 ? 나중에 최적화를 위해서</p>\n<h2 id=\"state는-객체다\"><a href=\"#state%EB%8A%94-%EA%B0%9D%EC%B2%B4%EB%8B%A4\" aria-label=\"state는 객체다 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>State는 객체다</h2>\n<p>불변성을 유지시켜서, 변수의 레퍼런스(메모리 주소)만 비교하면 된다</p>\n<p>prevState === nextState</p>\n<h2 id=\"redux\"><a href=\"#redux\" aria-label=\"redux permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>REDUX</h2>\n<p>아래로 계속 props를 내려줘야 하는 불편함때문에, 어디서나 공유하고 변경할 수 있는 REDUX가 생김. depth가 깊어질수록 redux가… 필요해짐.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">return (\n\t&lt;Fragment&gt;\n\t\t&lt;h1&gt;무얼 마시고 싶니?&lt;/h1&gt;\n\t\t&lt;h2&gt;DATA : {data}&lt;/h2&gt;\n\t\t&lt;input\n\t\t\tplaceholder=&quot;원하시는 것을 입력하세요&quot;\n\t\t\tonChange={e =&gt; onChange(e)}\n\t\t/&gt;\n\t\t&lt;hr /&gt;\n\t&lt;/Fragment&gt;\n)</code></pre></div>\n<h2 id=\"map--내부의-요소에는-키가-필요하다\"><a href=\"#map--%EB%82%B4%EB%B6%80%EC%9D%98-%EC%9A%94%EC%86%8C%EC%97%90%EB%8A%94-%ED%82%A4%EA%B0%80-%ED%95%84%EC%9A%94%ED%95%98%EB%8B%A4\" aria-label=\"map  내부의 요소에는 키가 필요하다 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>map () 내부의 요소에는 키가 필요하다</h2>\n<p>예를 들어, <code class=\"language-text\">ListItem</code> 컴포넌트를 <a href=\"https://reactjs-kr.firebaseapp.com/docs/components-and-props.html#extracting-components\">추출</a> 한 경우, <code class=\"language-text\">ListItem</code> 자체의 루트 <code class=\"language-text\">&lt;li&gt;</code> 요소가 아닌 배열의 <code class=\"language-text\">&lt;ListItem /&gt;</code> 요소가 키를 가지고 있어야합니다. -> map을 부를때 거기서 키를 지정해주는게 좋다.</p>\n<p>글로벌로 유니크할 필요는 없습니다. 두 다른 배열을 생성할 때 동일한 키를 사용할 수 있습니다.</p>","frontmatter":{"title":"Immersive Sprint - REACT","date":"October 06, 2018"}}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/til/20181004-1006 IM08D12-14 REACT/","previous":{"fields":{"slug":"/til/20181003 IM08D11/"},"frontmatter":{"title":"test function","category":"TIL"}},"next":{"fields":{"slug":"/til/20181008-20181009 IM08D15-16 REDUX/"},"frontmatter":{"title":"Immersive Sprint - REDUX","category":"TIL"}}}}