<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>s_honey1122.log</title>
        <link>https://velog.io/</link>
        <description>그냥 기록용!!!</description>
        <lastBuildDate>Thu, 02 Nov 2023 15:41:29 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>s_honey1122.log</title>
            <url>https://velog.velcdn.com/images/s_honey1122/profile/30a2e0e8-eb78-406e-875e-73c39d9dd183/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. s_honey1122.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/s_honey1122" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[노마드 코더] React JS - Effects]]></title>
            <link>https://velog.io/@s_honey1122/%EB%85%B8%EB%A7%88%EB%93%9C-%EC%BD%94%EB%8D%94-React-JS-Effects</link>
            <guid>https://velog.io/@s_honey1122/%EB%85%B8%EB%A7%88%EB%93%9C-%EC%BD%94%EB%8D%94-React-JS-Effects</guid>
            <pubDate>Thu, 02 Nov 2023 15:41:29 GMT</pubDate>
            <description><![CDATA[<h3 id="why-we-need-for-effects">why we need for Effects..?</h3>
<h4 id="버튼을-click-할때마다-count--1-해주는-버튼을-만들다">버튼을 click 할때마다 count + 1 해주는 버튼을 만들다</h4>
<pre><code>import { useState } from &quot;react&quot;;

function App() {
  const [counter, setValue] = useState(0);
  const onClick = () =&gt; setValue((prev) =&gt; prev + 1);
console.log(&quot;render&quot;)
  return (
    &lt;div&gt;
      &lt;h1&gt;{counter}&lt;/h1&gt;
      &lt;button onClick={onClick}&gt;click!&lt;/button&gt;
    &lt;/div&gt;
  );
}

export default App;
</code></pre><p><img src="https://velog.velcdn.com/images/s_honey1122/post/c966ce60-27b9-4af8-bb57-057afc18dd5a/image.png" alt="">
버튼을 클릭할때마다 render를 출력 해주고 있음
-&gt; state가 변화해도 render를 출력하고 싶지 않다면..?
-&gt; useEffect 사용</p>
<h3 id="useeffect">useEffect</h3>
<ul>
<li>두 개의 argument를 가지는 function</li>
</ul>
<pre><code>import { useState, useEffect } from &quot;react&quot;;

function App() {
  const [counter, setValue] = useState(0);
  const onClick = () =&gt; setValue((prev) =&gt; prev + 1);
console.log(&quot;i run all the time&quot;);
const iRunOnlyOnce = () =&gt; {
  console.log(&quot;i run only once&quot;)
}
useEffect(iRunOnlyOnce, []);
  return (
    &lt;div&gt;
      &lt;h1&gt;{counter}&lt;/h1&gt;
      &lt;button onClick={onClick}&gt;click!&lt;/button&gt;
    &lt;/div&gt;
  );
}

export default App;</code></pre><p><img src="https://velog.velcdn.com/images/s_honey1122/post/53964e6d-1ec6-4760-a4d4-e8e11793ceef/image.png" alt=""></p>
<p>클릭버튼 입력시 useEffect의 첫번째 인자인 함수는 한번만 실행됨</p>
<h4 id="useeffect-function은-우리-코드가-딱-한번만-실행될-수-있도록-보호해줌">useEffect function은 우리 코드가 딱 한번만 실행될 수 있도록 보호해줌!!!</h4>
<h4 id="useeffect의-두번째-인자">useEffect의 두번째 인자..?</h4>
<pre><code>import { useState, useEffect } from &quot;react&quot;;

function App() {
  const [counter, setValue] = useState(0);
  const [keyword, setKeyword] = useState(&quot;&quot;);
  const onClick = () =&gt; setValue((prev) =&gt; prev + 1);
  const onChange = (event) =&gt; setKeyword(event.target.value);

  console.log(&quot;i run all the time&quot;);

useEffect(() =&gt; {
  console.log(&quot;CALL THE API&quot;)
}, []);

useEffect(() =&gt; {
  if(keyword !== &quot;&quot; &amp;&amp; keyword.length &gt; 5){
    console.log(&quot;SEARCH FOR&quot;, keyword)
  }
}, [keyword])
  return (
    &lt;div&gt;
      &lt;input
      value={keyword} 
      onChange = {onChange} 
      type=&quot;text&quot; 
      placeholder=&quot;Search here...&quot; /&gt;
      &lt;h1&gt;{counter}&lt;/h1&gt;
      &lt;button onClick={onClick}&gt;click!&lt;/button&gt;
    &lt;/div&gt;
  );
}

export default App;
</code></pre><ul>
<li>두번째 인자로 넘겨주는 리스트의 값이 변할때만 useEffect의 첫번째 인자 함수를 실행시킴
<img src="https://velog.velcdn.com/images/s_honey1122/post/d09a3326-c140-41ea-a8f9-5f893cd69c80/image.png" alt=""></li>
</ul>
<h4 id="두번째-인자에-2개-이상의-요소를-넣을-수-있음">두번째 인자에 2개 이상의 요소를 넣을 수 있음..</h4>
<pre><code>useEffect(() =&gt; {
  console.log(&quot;I run when &#39;keyword&#39; or &#39;conter&#39; changes.&quot;)
}, [keyword, counter])</code></pre><p>keyword 또는 counter의 값이 변하면 로그 출력</p>
<h3 id="cleanup-function">Cleanup function</h3>
<ul>
<li>컴포넌트가 destroy 될 때 특정 함수를 실행시킬 수 있음<pre><code>import { useState, useEffect } from &quot;react&quot;;
</code></pre></li>
</ul>
<p>function Hello() {
    function byeFn() {
        console.log(&quot;bye!&quot;)
    }
    function hiFn() {
        console.log(&quot;created!&quot;);
        return byeFn;
    }
    useEffect(hiFn, [])
    return <h1>Hello</h1>
}</p>
<p>function CleanupFunction () {
    const [showing, setShowing] = useState(false);
    const onClick = () =&gt; setShowing((prev) =&gt; !prev)
    return(
        <div>
            {showing ? <Hello /> : null}
            <button onClick={onClick}>
                {showing ? &quot;Hide&quot; : &quot;show&quot;}
            </button>
        </div>
    )
}</p>
<p>export default CleanupFunction;</p>
<p>```</p>
<ul>
<li>버튼 클릭하여 Hello 컴포넌트가 사라지고 destory 될 때 buyFn 함수를 실행시켜
buy! 로그가 출력됨..신기..!!</li>
</ul>
<p>빈 deps -&gt; 컴포넌트 파괴시 cleanup 함수 실행 -&gt; 리렌더링 -&gt; useEffect 함수 실행 -&gt; 이전 effect는 삭제되고 return 함수를 실행시킴</p>
<p>출처
: <a href="https://nomadcoders.co/react-for-beginners/lectures/3285">ReactJS로 영화 웹 서비스 만들기
</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[노마드 코더] ReactJS - propsType]]></title>
            <link>https://velog.io/@s_honey1122/%EB%85%B8%EB%A7%88%EB%93%9C-%EC%BD%94%EB%8D%94-ReactJS-propsType</link>
            <guid>https://velog.io/@s_honey1122/%EB%85%B8%EB%A7%88%EB%93%9C-%EC%BD%94%EB%8D%94-ReactJS-propsType</guid>
            <pubDate>Thu, 02 Nov 2023 13:56:45 GMT</pubDate>
            <description><![CDATA[<h3 id="만약-prop를-잘못-넘겨준다면">만약 prop를 잘못 넘겨준다면..</h3>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;

&lt;body&gt;
    &lt;div id=&quot;root&quot;&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;script src=&quot;https://unpkg.com/react@17.0.2/umd/react.production.min.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://unpkg.com/@babel/standalone/babel.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/babel&quot;&gt;
    const root = document.getElementById(&quot;root&quot;);
    function Btn({text, fontSize}) {
        return &lt;button style={{
            backgroundColor: &quot;tomato&quot;,
            color: &quot;white&quot;,
            padding: &quot;10px 20px&quot;,
            radius: &quot;999px&quot;,
            border: &quot;none&quot;,
            borderRadius: &quot;999px&quot;,
            fontSize
        }}&gt;{text}&lt;/button&gt;
    }

    function App() {
        return (
            &lt;div&gt;
                &lt;Btn text=&quot;Save Changes&quot; fontSize={18}/&gt;
                &lt;Btn text={14} fontSize={&quot;Continue&quot;}/&gt;
            &lt;/div&gt;
        );
    }
    ReactDOM.render(&lt;App /&gt;, root)
&lt;/script&gt;

&lt;/html&gt;</code></pre><p><img src="https://velog.velcdn.com/images/s_honey1122/post/a7a5c1c0-a028-451a-9539-295c36178c90/image.png" alt=""></p>
<p>분명 잘못된 로직.. but 코드상 오류는 없어 버튼이 이상하게 노출됨
-&gt;propType은 어떤 prop를 받고 있는지 체크해줌</p>
<h3 id="propstype">propsType</h3>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;

&lt;body&gt;
    &lt;div id=&quot;root&quot;&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;script src=&quot;https://unpkg.com/react@17.0.2/umd/react.development.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://unpkg.com/prop-types@15.7.2/prop-types.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://unpkg.com/@babel/standalone/babel.min.js&quot;&gt;&lt;/script&gt;

&lt;script type=&quot;text/babel&quot;&gt;
    const root = document.getElementById(&quot;root&quot;);
    function Btn({text, fontSize}) {
        return &lt;button style={{
            backgroundColor: &quot;tomato&quot;,
            color: &quot;white&quot;,
            padding: &quot;10px 20px&quot;,
            radius: &quot;999px&quot;,
            border: &quot;none&quot;,
            borderRadius: &quot;999px&quot;,
            fontSize
        }}&gt;{text}&lt;/button&gt;
    }
    Btn.propTypes = {
        text: PropTypes.string,
        fontSize: PropTypes.number,
    };
    function App() {
        return (
            &lt;div&gt;
                &lt;Btn text=&quot;Save Changes&quot; fontSize={18}/&gt;
                &lt;Btn text={14} fontSize={&quot;Continue&quot;}/&gt;
            &lt;/div&gt;
        );
    }
    ReactDOM.render(&lt;App /&gt;, root)
&lt;/script&gt;

&lt;/html&gt;</code></pre><pre><code>https://unpkg.com/prop-types@15.7.2/prop-types.js</code></pre><p>추가 후, 
<a href="https://unpkg.com/react@17.0.2/umd/react.production.min.js">https://unpkg.com/react@17.0.2/umd/react.production.min.js</a> -&gt;
<a href="https://unpkg.com/react@17.0.2/umd/react.development.js">https://unpkg.com/react@17.0.2/umd/react.development.js</a> 로 변경함..</p>
<p><img src="https://velog.velcdn.com/images/s_honey1122/post/c5a42015-b3d2-418b-9a47-944303ecf7b6/image.png" alt=""></p>
<p>경고문이 노출됨</p>
<h4 id="isrequired">isRequired</h4>
<ul>
<li>반드시 prop가 존재해야 하는 경우<pre><code>Btn.propTypes = {
      text: PropTypes.string.isRequired,
      fontSize: PropTypes.number.isRequired,
  };
  function App() {
      return (
          &lt;div&gt;
              &lt;Btn text=&quot;Save Changes&quot; fontSize={18}/&gt;
              &lt;Btn text={&quot;Continue&quot;}/&gt;
          &lt;/div&gt;
      );
  }</code></pre></li>
</ul>
<p><img src="https://velog.velcdn.com/images/s_honey1122/post/328b68d7-2528-4e39-a3a1-2d1d92156871/image.png" alt="">
경고문이 출력</p>
<p>출처 : <a href="https://nomadcoders.co/react-for-beginners/lectures/3278">ReactJS로 영화 웹 서비스 만들기</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[노마드 코더] React JS - Tour of CRA]]></title>
            <link>https://velog.io/@s_honey1122/%EB%85%B8%EB%A7%88%EB%93%9C-%EC%BD%94%EB%8D%94-React-JS-Tour-of-CRA</link>
            <guid>https://velog.io/@s_honey1122/%EB%85%B8%EB%A7%88%EB%93%9C-%EC%BD%94%EB%8D%94-React-JS-Tour-of-CRA</guid>
            <pubDate>Wed, 01 Nov 2023 15:00:16 GMT</pubDate>
            <description><![CDATA[<h3 id="prop-types-설치">prop-types 설치</h3>
<pre><code>npm i prop-types</code></pre><h3 id="사용">사용</h3>
<pre><code>import PropTypes from &quot;prop-types&quot;;

function Button({text}) {
    return &lt;button&gt;{text}&lt;/button&gt;;
}

Button.propTypes = {
    text : PropTypes.string.isRequired, 
}
export default Button;</code></pre><p>import 후 사용해주기</p>
<h3 id="css-사용하기">css 사용하기</h3>
<p><img src="https://velog.velcdn.com/images/s_honey1122/post/beee9287-308c-411e-83db-5a45abee4c57/image.png" alt=""></p>
<p>src 폴더에 스타일 시트를 넣어줌</p>
<pre><code>import &quot;./styles.css&quot;</code></pre><p>js 파일에 import 해주기</p>
<h3 id="style-직접적으로-넣기">style 직접적으로 넣기</h3>
<pre><code>function Button({text}) {
    return &lt;button style={{
        backgroundColor:&quot;tomato&quot;,
        color:&quot;white&quot;
    }}&gt;{text}&lt;/button&gt;;
}</code></pre><h3 id="모듈을-사용하여-css-적용하기">모듈을 사용하여 css 적용하기</h3>
<p>css 가 전역적으로 사용되는 문제 
-&gt; 모듈별로 사용하자
<img src="https://velog.velcdn.com/images/s_honey1122/post/45b376f5-9154-4ed6-ad93-6edef1ce51b2/image.png" alt=""></p>
<p>버튼에만 적용하고 싶은
Button.module.css 생성</p>
<h4 id="buttonmodulecss">Button.module.css</h4>
<pre><code>.btn {
    color: white;
    background-color: tomato;
}</code></pre><h4 id="buttonjs">Button.js</h4>
<pre><code>import PropTypes from &quot;prop-types&quot;;
import styles from &quot;./Button.module.css&quot;

function Button({text}) {
    return &lt;button className={styles.btn}&gt;{text}&lt;/button&gt;;
}

Button.propTypes = {
    text : PropTypes.string.isRequired, 
}
export default Button;</code></pre><ul>
<li>적용하고 싶은 js에만 import해줌</li>
<li>CRA는 css 코드를 js object로 변환시켜줌
<img src="https://velog.velcdn.com/images/s_honey1122/post/9d57f7dc-2fbc-4509-9937-672d27fcdc4b/image.png" alt="">
무작위적인 랜덤 class를 갖게 됨</li>
</ul>
<p>출처
: <a href="https://nomadcoders.co/react-for-beginners/lectures/3280">ReactJS로 영화 웹 서비스 만들기
</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[노마드 코더]React JS - Memo]]></title>
            <link>https://velog.io/@s_honey1122/%EB%85%B8%EB%A7%88%EB%93%9C-%EC%BD%94%EB%8D%94React-JS-Memo</link>
            <guid>https://velog.io/@s_honey1122/%EB%85%B8%EB%A7%88%EB%93%9C-%EC%BD%94%EB%8D%94React-JS-Memo</guid>
            <pubDate>Thu, 26 Oct 2023 16:10:24 GMT</pubDate>
            <description><![CDATA[<h4 id="props에-함수를-전달-할-수-있음">props에 함수를 전달 할 수 있음</h4>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;

&lt;body&gt;
    &lt;div id=&quot;root&quot;&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;script src=&quot;https://unpkg.com/react@17.0.2/umd/react.production.min.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://unpkg.com/@babel/standalone/babel.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/babel&quot;&gt;
    const root = document.getElementById(&quot;root&quot;);
    function Btn({text, changeValue}) {
        console.log(text , &quot;was rendered&quot;)
        return (
        &lt;button 
        onClick = {changeValue}
        style={{
            backgroundColor: &quot;tomato&quot;,
            color: &quot;white&quot;,
            padding: &quot;10px 20px&quot;,
            radius: &quot;999px&quot;,
            border: &quot;none&quot;,
            borderRadius: &quot;999px&quot;,
            fontSize: 16
        }}
        &gt;
        {text}
        &lt;/button&gt;
        )
    }

    function App() {
        const [value, setValue] = React.useState(&quot;changeValue&quot;);
        const changeValue = () =&gt; setValue(&quot;RevertChange&quot;)
        return (
            &lt;div&gt;
                &lt;Btn text={value} changeValue = {changeValue}/&gt;
                &lt;Btn text=&quot;Continue&quot; /&gt;
            &lt;/div&gt;
        );
    }
    ReactDOM.render(&lt;App /&gt;, root)
&lt;/script&gt;

&lt;/html&gt;</code></pre><p><img src="https://velog.velcdn.com/images/s_honey1122/post/5698a06e-9aaf-4f74-909e-894c068649c6/image.png" alt=""></p>
<p>-&gt; 하지만.. 바꾸는 부분은 첫번째 버튼인데
버튼 클릭 시 전체를 렌더링 하고 있음 </p>
<p>--&gt; Memo 를 사용하면 변하는 부분만 렌더링 할 수 있음</p>
<h3 id="memo">Memo</h3>
<pre><code>const MemorizedBtn = React.memo(Btn)
    function App() {
        const [value, setValue] = React.useState(&quot;changeValue&quot;);
        const changeValue = () =&gt; setValue(&quot;RevertChange&quot;)
        return (
            &lt;div&gt;
                &lt;MemorizedBtn text={value} changeValue = {changeValue}/&gt;
                &lt;MemorizedBtn text=&quot;Continue&quot; /&gt;
            &lt;/div&gt;
        );
    }</code></pre><p><img src="https://velog.velcdn.com/images/s_honey1122/post/83747b06-432f-4d57-a818-fe5e3d4cfb43/image.png" alt=""></p>
<ul>
<li>버튼 클릭 시 변한 부분만 렌더링 해주고 있음</li>
<li>어플리케이션의 성능을 개선 할 수 있음</li>
</ul>
<p>출처
: <a href="https://nomadcoders.co/react-for-beginners/lectures/3276">ReactJS로 영화 웹 서비스 만들기
</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[노마드 코더]React JS - props]]></title>
            <link>https://velog.io/@s_honey1122/%EB%85%B8%EB%A7%88%EB%93%9C-%EC%BD%94%EB%8D%94React-JS-props</link>
            <guid>https://velog.io/@s_honey1122/%EB%85%B8%EB%A7%88%EB%93%9C-%EC%BD%94%EB%8D%94React-JS-props</guid>
            <pubDate>Thu, 26 Oct 2023 15:30:48 GMT</pubDate>
            <description><![CDATA[<h3 id="props-사용해보기">Props 사용해보기</h3>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;

&lt;body&gt;
    &lt;div id=&quot;root&quot;&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;script src=&quot;https://unpkg.com/react@17.0.2/umd/react.production.min.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://unpkg.com/@babel/standalone/babel.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/babel&quot;&gt;
    const root = document.getElementById(&quot;root&quot;);
    function Btn(props) {
        console.log(props);
        return &lt;button style={{
            backgroundColor: &quot;tomato&quot;,
            color: &quot;white&quot;,
            padding: &quot;10px 20px&quot;,
            radius: &quot;999px&quot;,
            border: &quot;none&quot;,
            borderRadius: &quot;999px&quot;
        }}&gt;{props.banana}&lt;/button&gt;
    }

    function App() {
        return (
            &lt;div&gt;
                &lt;Btn banana=&quot;Save Changes&quot; /&gt;
                // Btn({banana:&quot;save changes})와 동일함
                &lt;Btn banana=&quot;Continue&quot; /&gt;
            &lt;/div&gt;
        );
    }
    ReactDOM.render(&lt;App /&gt;, root)
&lt;/script&gt;

&lt;/html&gt;</code></pre><p><img src="https://velog.velcdn.com/images/s_honey1122/post/c3de0747-586b-49ff-94fa-48ae71554f43/image.png" alt=""></p>
<ul>
<li>ReactJS는 자동으로 property(prop)들을 object안에 넣음. object를 함수에 전달</li>
</ul>
<pre><code>&lt;Btn banana=&quot;Save Changes&quot; x=&quot;false&quot;/&gt;</code></pre><p>이렇게 넣어주면...
<img src="https://velog.velcdn.com/images/s_honey1122/post/03ce7046-5ce2-4b9b-b6fa-93e27a0d5aec/image.png" alt=""></p>
<ul>
<li>props를 모두 갖는 object를 가지게 됨</li>
</ul>
<h4 id="shortcut-방법">shortcut 방법</h4>
<pre><code>function Btn({banana}) {
        return &lt;button style={{
            backgroundColor: &quot;tomato&quot;,
            color: &quot;white&quot;,
            padding: &quot;10px 20px&quot;,
            radius: &quot;999px&quot;,
            border: &quot;none&quot;,
            borderRadius: &quot;999px&quot;
        }}&gt;{banana}&lt;/button&gt;
    }</code></pre><ul>
<li>props를 object에서 꺼낼 수 있음</li>
</ul>
<h4 id="style로-응용해보기">style로 응용해보기..</h4>
<pre><code>  function Btn({banana, big}) {
        return &lt;button style={{
            backgroundColor: &quot;tomato&quot;,
            color: &quot;white&quot;,
            padding: &quot;10px 20px&quot;,
            radius: &quot;999px&quot;,
            border: &quot;none&quot;,
            borderRadius: &quot;999px&quot;,
            fontSize: big ? 18 : 16
        }}&gt;{banana}&lt;/button&gt;
    }

    function App() {
        return (
            &lt;div&gt;
                &lt;Btn banana=&quot;Save Changes&quot; big={true}/&gt;
                &lt;Btn banana=&quot;Continue&quot; /&gt;
            &lt;/div&gt;
        );
    }</code></pre><p><img src="https://velog.velcdn.com/images/s_honey1122/post/13569324-2a21-4fb2-99c9-bd914eab29f2/image.png" alt=""></p>
<p>출처 
: <a href="https://nomadcoders.co/react-for-beginners/lectures/3276">ReactJS로 영화 웹 서비스 만들기
</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[노마드코더] React JS - State Function
]]></title>
            <link>https://velog.io/@s_honey1122/%EB%85%B8%EB%A7%88%EB%93%9C%EC%BD%94%EB%8D%94-React-JS-State-Function</link>
            <guid>https://velog.io/@s_honey1122/%EB%85%B8%EB%A7%88%EB%93%9C%EC%BD%94%EB%8D%94-React-JS-State-Function</guid>
            <pubDate>Mon, 23 Oct 2023 15:11:01 GMT</pubDate>
            <description><![CDATA[<h4 id="usestate를-보다-안정적으로-사용하기">useState를 보다 안정적으로 사용하기..</h4>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;

&lt;body&gt;
    &lt;div id=&quot;root&quot;&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;script src=&quot;https://unpkg.com/react@17.0.2/umd/react.production.min.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://unpkg.com/@babel/standalone/babel.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/babel&quot;&gt;
    const root = document.getElementById(&quot;root&quot;);
    function App (){
        const [counter, setCounter] = React.useState(0);
        const onClick = () =&gt; {
            // setCounter(counter + 1);
            // 직접 값을 설정해주는 법
            setCounter((current) =&gt; current + 1)
            // react가 이 current가 현재값임을 정확히 알 수 있음
            // 함수를 전달해주는 법
        };
        return (
            &lt;div&gt;
                &lt;h3&gt;Total clicks : {counter}&lt;/h3&gt;
                &lt;button onClick = {onClick}&gt;Click me&lt;/button&gt;
            &lt;/div&gt;
        );
    }
    ReactDOM.render(&lt;App /&gt;, root)
&lt;/script&gt;

&lt;/html&gt;</code></pre><h3 id="making-converter">making converter</h3>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;

&lt;body&gt;
    &lt;div id=&quot;root&quot;&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;script src=&quot;https://unpkg.com/react@17.0.2/umd/react.production.min.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://unpkg.com/@babel/standalone/babel.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/babel&quot;&gt;
    const root = document.getElementById(&quot;root&quot;);
    function App() {
        const [amount, setAmount] = React.useState();
        const [flipped, setFlipped] = React.useState(false);
        const onChange = (event) =&gt; {
            setAmount(event.target.value);
        }
        function reset() {
            setAmount(0)
        }
        function onFlip() {
            reset();
            setFlipped((current) =&gt; !current);
        }
        return (
            &lt;div&gt;
                &lt;h1 className=&quot;hi&quot;&gt;Super Converter&lt;/h1&gt;
                &lt;div&gt;
                    &lt;label htmlFor=&quot;minutes&quot;&gt;Minutes&lt;/label&gt;
                    &lt;input
                        value={flipped ? amount * 60 : amount}
                        classId=&quot;minutes&quot;
                        placeholder=&quot;Minutes&quot;
                        type=&quot;number&quot;
                        onChange={onChange}
                        disabled={flipped}
                    /&gt;
                    &lt;h4&gt;You want to convert {amount}&lt;/h4&gt;
                    &lt;label htmlFor=&quot;hours&quot;&gt;Hours&lt;/label&gt;
                    &lt;input
                        classId=&quot;hours&quot;
                        placeholder=&quot;hours&quot;
                        type=&quot;number&quot;
                        onChange={onChange}
                        value={flipped ? amount : Math.round(amount / 60)}
                        disabled={!flipped}
                    /&gt;
                &lt;/div&gt;
                &lt;button onClick={reset}&gt;Reset&lt;/button&gt;
                &lt;button onClick={onFlip}&gt;flip&lt;/button&gt;
            &lt;/div&gt;
        );
    }
    ReactDOM.render(&lt;App /&gt;, root)
&lt;/script&gt;

&lt;/html&gt;</code></pre><p>출처
: <a href="https://nomadcoders.co/react-for-beginners/lectures/3276">ReactJS로 영화 웹 서비스 만들기
</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[노마드코더] React JS - State]]></title>
            <link>https://velog.io/@s_honey1122/%EB%85%B8%EB%A7%88%EB%93%9C%EC%BD%94%EB%8D%94-React-JS-State</link>
            <guid>https://velog.io/@s_honey1122/%EB%85%B8%EB%A7%88%EB%93%9C%EC%BD%94%EB%8D%94-React-JS-State</guid>
            <pubDate>Sun, 22 Oct 2023 14:26:09 GMT</pubDate>
            <description><![CDATA[<h3 id="버튼-click-할-때마다--1-해주기">버튼 Click 할 때마다 + 1 해주기!!</h3>
<p><img src="https://velog.velcdn.com/images/s_honey1122/post/03423732-9c2d-45d3-a0cb-e17130fbe102/image.png" alt=""></p>
<h4 id="1-vanillajs-version">1. vanilla.js version</h4>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;body&gt;
    &lt;span&gt;Total clicks : 0&lt;/span&gt;
    &lt;button id=&quot;btn&quot;&gt;Click me&lt;/button&gt;
    &lt;script&gt;
        let counter = 0;
        const button = document.getElementById(&quot;btn&quot;)
        const span = document.querySelector(&quot;span&quot;);
        function handleClick() {
            counter = counter + 1;
            span.innerText = `Total clicks :  ${counter}`;
        }
        button.addEventListener(&quot;click&quot;, handleClick)
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><ul>
<li>span을 이용하여 counter를 + 1 처리해주고 있음</li>
</ul>
<h4 id="2-reactjs">2. React.js</h4>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;

&lt;body&gt;
    &lt;div id=&quot;root&quot;&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;script src=&quot;https://unpkg.com/react@17.0.2/umd/react.production.min.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://unpkg.com/@babel/standalone/babel.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/babel&quot;&gt;
    const root = document.getElementById(&quot;root&quot;);
    let counter = 0;
    function countUp () {
        counter = counter + 1;
        reRender()
    }
    function reRender () {
        ReactDOM.render(&lt;Container /&gt;, root) //countUp을 호출할때마다 렌더링을 해주어야 함
    }
    const Container = () =&gt; (
        (
            &lt;div&gt;
                &lt;h3&gt;Total clicks : {counter}&lt;/h3&gt;
                &lt;button onClick = {countUp}&gt;Click me&lt;/button&gt;
            &lt;/div&gt;
        )
    )
    reRender();
&lt;/script&gt;

&lt;/html&gt;</code></pre><p><img src="https://velog.velcdn.com/images/s_honey1122/post/9d515dac-cd43-4dfb-9943-0bf0e9899859/image.png" alt=""></p>
<ul>
<li>UI에서 바뀐 부분만 업데이트 해주고 있음</li>
<li><blockquote>
<p>이전에 렌더링된 컴포넌트와 다음의 렌더링 될 컴포넌트를 확인함.</p>
</blockquote>
</li>
<li><blockquote>
<p>전체를 reRendering 하지만 html에서 숫자만 업데이트 되고 있음</p>
</blockquote>
</li>
</ul>
<h4 id="3-reactjs---usestate사용">3. React.js - useState사용</h4>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;

&lt;body&gt;
    &lt;div id=&quot;root&quot;&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;script src=&quot;https://unpkg.com/react@17.0.2/umd/react.production.min.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://unpkg.com/@babel/standalone/babel.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/babel&quot;&gt;
    const root = document.getElementById(&quot;root&quot;);
    function App (){
        const [counter, setCounter] = React.useState(0);
        const onClick = () =&gt; {
            setCounter(counter + 1);
        };
        return (
            &lt;div&gt;
                &lt;h3&gt;Total clicks : {counter}&lt;/h3&gt;
                &lt;button onClick = {onClick}&gt;Click me&lt;/button&gt;
            &lt;/div&gt;
        );
    }
    ReactDOM.render(&lt;App /&gt;, root)
&lt;/script&gt;

&lt;/html&gt;</code></pre><ul>
<li>modifier(setCount)함수를 이용하여 컴포넌트는 새로운 값을 가지고 다시 한번 렌더링함</li>
<li>데이터가 바뀔 때마다 컴포넌트를 리렌더링 후 UI를 업데이트</li>
</ul>
<p>출처
<a href="https://nomadcoders.co/react-for-beginners/lectures/3269">ReactJS로 영화 웹 서비스 만들기</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[개발회고록]강남구 따숨쉼터]]></title>
            <link>https://velog.io/@s_honey1122/%EA%B0%9C%EB%B0%9C%ED%9A%8C%EA%B3%A0%EB%A1%9D%EA%B0%95%EB%82%A8%EA%B5%AC-%EB%94%B0%EC%88%A8%EC%89%BC%ED%84%B0</link>
            <guid>https://velog.io/@s_honey1122/%EA%B0%9C%EB%B0%9C%ED%9A%8C%EA%B3%A0%EB%A1%9D%EA%B0%95%EB%82%A8%EA%B5%AC-%EB%94%B0%EC%88%A8%EC%89%BC%ED%84%B0</guid>
            <pubDate>Thu, 08 Dec 2022 07:46:27 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/s_honey1122/post/b8471f20-25d7-473b-97c1-1bfcf968a92c/image.png" alt="">
<a href="https://kimsuheon1122.github.io/-project-winter_shelter/">강남구 따숨쉼터</a>
언제까지나 만들고 싶은 것만을 만들수는 없다.
그렇기 때문에 이 취업준비시간이 불안하지만 참 좋은 시기라고 생각한다.
내가 좋아하는 것을 하며, 나를 발전시킬 수 있는 시간. </p>
<p>api를 이용하여 승강기를 이용하는 노약자를 위한 빠른환승 서비스를 만들고 싶었는데,
관련 데이터를 찾는것이 쉽지 않았다.
그러다 각 지역별(또는 자치구) 마다 운영하는 한파쉼터가 예산액에 비해 이용률이 낮다는 기사를 접했고, 찾아보니 (강남구 기준) 자치구에 등록된 한파쉼터의 수는 실제 데이터보다 10분의1도 채 되지 않음을 알게 되었다.</p>
<p>큰 뜻으로 만든것은 아니지만, 
한파쉼터정보를 알려주는 서비스가 있다면 누군가는 용이하게 사용하지 않을까?
라는 마음으로 프로젝트를 시작했다.</p>
<p><img src="https://velog.velcdn.com/images/s_honey1122/post/92c0b73f-dfeb-4af3-b373-e4dbfc7cfed8/image.png" alt="">
(카카오맵API를 사용하여 지도를 불러온다.)
<img src="https://velog.velcdn.com/images/s_honey1122/post/ca55fdc7-b03d-41ad-8285-297bf2f2245c/image.png" alt="">
<img src="https://velog.velcdn.com/images/s_honey1122/post/4d8eca56-b7da-4455-9eb6-d9dcad15d238/image.png" alt="">
(지도 -&gt; 쉼터 상세 목록 -&gt; 동 선택 -&gt; 지도 매커니즘은 중년세대가 애용하는 &#39;네이버 부동산&#39;을 참고했다.)</p>
<p>노약자, 그 중 고령층을 주이용자로 설정하고 만들었다.
큼직한 글씨, 최대한 직관적인 디자인으로 만들었는데, 트렌디하고 세련되지는 않았다.</p>
<p><img src="https://velog.velcdn.com/images/s_honey1122/post/3972e018-2a82-42b6-8593-eb25434e8ec0/image.png" alt="">
누군가에겐 당연한 개념이 누군가에겐 당연하지 않을수도 있음을 생각하며 만들었다.</p>
<p>서울열린데이터광장에 당당하게 활용사례등록을 신청했지만, 아직 수정에 수정을 거듭해야 하는 열려있는(?)프로젝트이다.
디자인을 뒤로하고 웹접근성에 초점을 맞추어 만들었다지만 여러 기기를 호환하지 못하는 점에서 웹접근성 점수가 현저히 떨어진다.
매일 혼자 깃허브에 들어가서 예뻐하는 서비스지만, 웹접근성 모순을..수정해야한다.
그 외로 각 동별 카카오맵 중심 맞추기, 심장제세동기찾기 항목의 이미지가 아닌 실제 지도 불러오기 등.. 보완해야 한다.</p>
<p>다음프로젝트는 더 최선을 다하고 싶다. 스스로 최선을 다했다고 느낄 수 있을 만큼.
그리고 스스로에게 의미있는 프로젝트라서 열심히 하는 것이 아닌, 개발 자체에 의미를 두고 개발하는 마음가짐을 가져야겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Git - Git Bash이용하여 프로젝트 업데이트 & 리액트 사이트 배포]]></title>
            <link>https://velog.io/@s_honey1122/Git-Git-Bash%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EB%B0%B0%ED%8F%AC-pytgkb80</link>
            <guid>https://velog.io/@s_honey1122/Git-Git-Bash%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EB%B0%B0%ED%8F%AC-pytgkb80</guid>
            <pubDate>Wed, 07 Dec 2022 06:12:21 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/s_honey1122/post/53c7b0c9-beed-4f9b-8335-bfedf0da23e0/image.png" alt=""></p>
<h3 id="1-git---downloads">1. Git - Downloads</h3>
<p><a href="https://git-scm.com/downloads">GIT</a>
<img src="https://velog.velcdn.com/images/honey1122/post/5390cd02-3a87-446f-a202-c1727b58774a/image.png" alt="">
Git Bash가 설치 되어야 함.</p>
<p>Git Hub 가입 &amp; repository 만들기</p>
<ul>
<li>public으로 설정</li>
<li>Add a README file 체크 X<h3 id="2-git에-upload-할-폴더나-파일-설정">2. git에 upload 할 폴더나 파일 설정</h3>
<h3 id="3-2의-폴더나-파일에서-git-bash-열기">3. 2의 폴더나 파일에서 git bash 열기</h3>
<img src="https://velog.velcdn.com/images/honey1122/post/aa3338dd-7f23-4490-a038-a4790b347c82/image.png" alt=""></li>
</ul>
<h5 id="git-bash-터미널-명령-모음">git bash 터미널 명령 모음</h5>
<pre><code>$ pwd - 현재 위치 확인
$ cd.. - 한단계 상위 directory로 이동
$ cd ~ - 최상위 디렉토리로 이동
$ cd d: -D드라이브로 이동 
$ ld - 현재 위치해있는 디렉토리의 폴더와 파일을 보여줌.
$ cd 폴더명 / 폴더명 - 특정 디렉토리로 이동</code></pre><h3 id="4-3에서-정한-폴더를-저장소초기화로-지정">4. 3에서 정한 폴더를 저장소(초기화)로 지정</h3>
<pre><code>$ git init - 저장소(초기화)로 만든다
$ git status - 현재 상태 확인
$ git log - 변경 이력 확인</code></pre><h3 id="5-github-사용자-설정">5. github 사용자 설정</h3>
<pre><code>$ git config --global user.email &quot;깃허브 이메일&quot;
$ git config --global user.name &quot;깃허브 이름&quot;</code></pre><h5 id="이메일-이름-맞게-설정-했는지-확인하기">이메일, 이름 맞게 설정 했는지 확인하기</h5>
<p>제어판 -&gt; 자격증명관리자 -&gt; window자격증명
<code>$ git config --list</code></p>
<h5 id="특정상황에서-빠져나오기">특정상황에서 빠져나오기</h5>
<p><code>:q</code></p>
<h3 id="6-commit-지정버전-설정">6. commit 지정(버전 설정)</h3>
<pre><code>$ git add 파일명 또는 $ git add .(추가하지 않은 모든 파일)
$ git commit -m&quot;메세지&quot;</code></pre><h3 id="7-github에-연결-업로드">7. github에 연결, 업로드</h3>
<pre><code>$ git remote add origin repository주소
$ git push -u origin master(파일올릴때 에러 나면 + master)</code></pre><h5 id="프로젝트-수정-후-업로드">프로젝트 수정 후 업로드</h5>
<pre><code>$ git add .
$ git commit -m&quot;메세지&quot;
$ git push -u origin master</code></pre><h3 id="리액트-프로젝트-사이트-배포하기">리액트 프로젝트 사이트 배포하기</h3>
<h5 id="git은-react기반-웹페이지를-지원하지-않음"><em>git은 react기반 웹페이지를 지원하지 않음</em></h5>
<p><a href="https://www.netlify.com/">netlify</a>
회원가입하여 진행.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[220809[한국타이어 벤치마킹]가상요소]]></title>
            <link>https://velog.io/@s_honey1122/220809%ED%95%9C%EA%B5%AD%ED%83%80%EC%9D%B4%EC%96%B4-%EB%B2%A4%EC%B9%98%EB%A7%88%ED%82%B9%EA%B0%80%EC%83%81%EC%9A%94%EC%86%8C</link>
            <guid>https://velog.io/@s_honey1122/220809%ED%95%9C%EA%B5%AD%ED%83%80%EC%9D%B4%EC%96%B4-%EB%B2%A4%EC%B9%98%EB%A7%88%ED%82%B9%EA%B0%80%EC%83%81%EC%9A%94%EC%86%8C</guid>
            <pubDate>Tue, 06 Dec 2022 02:20:49 GMT</pubDate>
            <description><![CDATA[<h4 id="가상요소에-hover-적용할-수-없음">가상요소에 hover 적용할 수 없음.</h4>
<p>가상요소에 hover효과를 주고 싶다면, 가상요소의 부모에 주기.
a태그의 before에 hover 효과 주고 싶다면,</p>
<pre><code>#media .inner .medialist li a::before:hover</code></pre><p>a태그의 before요소에 hover를 주었을 때, 가 아닌</p>
<pre><code>#media .inner .medialist li a:hover::before</code></pre><p>a태그에 hover 했을 때, a태그의 가상요소로 가정하고 작성해야 함. </p>
<h4 id="닫는-태그가-없는-태그에-가상요소-적용할-수-없음">닫는 태그가 없는 태그에 가상요소 적용할 수 없음.</h4>
<p>img태그 등 닫는 태그가 없는 요소에 가상요소 적용 시 가상요소 부분이 비활성화 됨.
가상요소를 감싸줄 닫는 태그가 없기 때문.</p>
<h4 id="hover시-zoom-in효과는-가상요소를-사용하지-않는것이-좋음">hover시 zoom-in효과는 가상요소를 사용하지 않는것이 좋음(??)</h4>
<p><img src="https://velog.velcdn.com/images/honey1122/post/974cd523-c641-4428-827f-c11ec5d2ac97/image.png" alt=""></p>
<p>미디어 sector의 이미지요소가 유의미 하지 않다 판단하여 before요소로 주었을 때, 
밑 글과 함께 list요소로 묶음. -&gt; hover시 zoom-in되어야 하는 효과를 적용시킬 수 없었음.
before요소를 감싸고 overflow : hidden을 시켜주어야 했는데, 맥락상 밑 글들과 함께 묵을 수 밖에 없었음.
img태그를 주어 해결했지만, 아쉬웠음.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[활용해 볼 CSS 속성]]></title>
            <link>https://velog.io/@s_honey1122/%ED%99%9C%EC%9A%A9%ED%95%B4-%EB%B3%BC-CSS-%EC%86%8D%EC%84%B1</link>
            <guid>https://velog.io/@s_honey1122/%ED%99%9C%EC%9A%A9%ED%95%B4-%EB%B3%BC-CSS-%EC%86%8D%EC%84%B1</guid>
            <pubDate>Tue, 06 Dec 2022 02:20:15 GMT</pubDate>
            <description><![CDATA[<p>원하는 속성만 transition 주기</p>
<pre><code>transition: background-color 2s;</code></pre><p>원하는 속성만 따로 transition효과를 줄 수 있음</p>
<p>비디오, 이미지 등 크기 채우기</p>
<pre><code>#motion .inner .adlist ul li .mainad {
  height: 720px;
  object-fit: fill;
  width: 100%;</code></pre><p>img video 등 고유 크기를 갖는 요소들의 크기 지정 후 
object-fit : fill; 속성을 주면, 그 크기에 맞게 요소 채우기 가능. </p>
<p>동영상 썸네일(첫 화면)</p>
<pre><code>&lt;video preload=&quot;metadata&quot;&gt;</code></pre><p>영상의 첫 화면이 썸네일 형식으로 표현.</p>
<p>오늘은 여기까지 : ) </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[220809[한국타이어 벤치마킹]img태그와 가상요소]]></title>
            <link>https://velog.io/@s_honey1122/220809%ED%95%9C%EA%B5%AD%ED%83%80%EC%9D%B4%EC%96%B4-%EB%B2%A4%EC%B9%98%EB%A7%88%ED%82%B9img%ED%83%9C%EA%B7%B8%EC%99%80-%EA%B0%80%EC%83%81%EC%9A%94%EC%86%8C</link>
            <guid>https://velog.io/@s_honey1122/220809%ED%95%9C%EA%B5%AD%ED%83%80%EC%9D%B4%EC%96%B4-%EB%B2%A4%EC%B9%98%EB%A7%88%ED%82%B9img%ED%83%9C%EA%B7%B8%EC%99%80-%EA%B0%80%EC%83%81%EC%9A%94%EC%86%8C</guid>
            <pubDate>Tue, 06 Dec 2022 02:19:48 GMT</pubDate>
            <description><![CDATA[<p>img태그에 ::before를 추가하여 hover시 다른 이미지로 덮어쓰기를 시도했지만 실패했다. 
<img src="https://velog.velcdn.com/images/honey1122/post/b238b16b-92af-4156-9a91-874d50bbe0d9/image.png" alt="">
img 태그 밑 가상요소가 나타나지 않음.
가상요소 영역이 어둡게 되어있음.</p>
<p>요인 : img는 닫는 태그가 없는 태그이기 때문에, 가상요소를 쓸 수 없음. 
닫는 태그가 없기 때문에 자식을 담을 수 없기 때문.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[width요소(outerWidth & innerWidth & width)]]></title>
            <link>https://velog.io/@s_honey1122/width%EC%9A%94%EC%86%8CouterWidth-innerWidth-width-cg2d0klh</link>
            <guid>https://velog.io/@s_honey1122/width%EC%9A%94%EC%86%8CouterWidth-innerWidth-width-cg2d0klh</guid>
            <pubDate>Tue, 06 Dec 2022 02:18:17 GMT</pubDate>
            <description><![CDATA[<p>※여러줄 주석 처리
주석 구역 드래그 후, Alt + Shift + A</p>
<h3 id="outerwidth--innerwidth--width">outerWidth &amp; innerWidth &amp; width</h3>
<pre><code>&lt;style&gt;
   .box{
    width: 300px;
    height: 300px;
    border: 10px solid green;
    padding: 50px;
    margin: 50px;
   }
&lt;/style&gt;
&lt;script src=&quot;https://code.jquery.com/jquery-latest.min.js&quot;&gt;&lt;/script&gt;
&lt;script&gt;
    $(document).ready(function(){
        console.log($(&quot;.box&quot;).width());
        console.log($(&quot;.box&quot;).innerWidth());
        console.log($(&quot;.box&quot;).outerWidth());
        console.log($(&quot;.box&quot;).outerWidth(true));

    });
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div class=&quot;box&quot;&gt;     
    &lt;/div&gt;
&lt;/body&gt;</code></pre><h4 id="outerwidth">outerWidth</h4>
<p>요소의 순수 너비 + padding + border
= 300px + 100px + 20px = 420px</p>
<h4 id="outerwidthtrue">outerWidth(true)</h4>
<p>outerWidth + margin
= 420px + 100px = 520px</p>
<h4 id="innerwidth">innerWidth</h4>
<p>요소의 순수 너비 + padding
= 300px + 100px = 400px</p>
<h4 id="width">width</h4>
<p>요소의 순수 너비
= 300px</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Git - Git Bash이용하여 프로젝트 업데이트 & 리액트 사이트 배포]]></title>
            <link>https://velog.io/@s_honey1122/Git-Git-Bash%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EB%B0%B0%ED%8F%AC</link>
            <guid>https://velog.io/@s_honey1122/Git-Git-Bash%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EB%B0%B0%ED%8F%AC</guid>
            <pubDate>Tue, 06 Dec 2022 02:16:32 GMT</pubDate>
            <description><![CDATA[<h3 id="1-git---downloads">1. Git - Downloads</h3>
<p><a href="https://git-scm.com/downloads">GIT</a>
<img src="https://velog.velcdn.com/images/honey1122/post/5390cd02-3a87-446f-a202-c1727b58774a/image.png" alt="">
Git Bash가 설치 되어야 함.</p>
<p>Git Hub 가입 &amp; repository 만들기</p>
<ul>
<li>public으로 설정</li>
<li>Add a README file 체크 X<h3 id="2-git에-upload-할-폴더나-파일-설정">2. git에 upload 할 폴더나 파일 설정</h3>
<h3 id="3-2의-폴더나-파일에서-git-bash-열기">3. 2의 폴더나 파일에서 git bash 열기</h3>
<img src="https://velog.velcdn.com/images/honey1122/post/aa3338dd-7f23-4490-a038-a4790b347c82/image.png" alt=""></li>
</ul>
<h5 id="git-bash-터미널-명령-모음">git bash 터미널 명령 모음</h5>
<pre><code>$ pwd - 현재 위치 확인
$ cd.. - 한단계 상위 directory로 이동
$ cd ~ - 최상위 디렉토리로 이동
$ cd d: -D드라이브로 이동 
$ ld - 현재 위치해있는 디렉토리의 폴더와 파일을 보여줌.
$ cd 폴더명 / 폴더명 - 특정 디렉토리로 이동</code></pre><h3 id="4-3에서-정한-폴더를-저장소초기화로-지정">4. 3에서 정한 폴더를 저장소(초기화)로 지정</h3>
<pre><code>$ git init - 저장소(초기화)로 만든다
$ git status - 현재 상태 확인
$ git log - 변경 이력 확인</code></pre><h3 id="5-github-사용자-설정">5. github 사용자 설정</h3>
<pre><code>$ git config --global user.email &quot;깃허브 이메일&quot;
$ git config --global user.name &quot;깃허브 이름&quot;</code></pre><h5 id="이메일-이름-맞게-설정-했는지-확인하기">이메일, 이름 맞게 설정 했는지 확인하기</h5>
<p>제어판 -&gt; 자격증명관리자 -&gt; window자격증명
<code>$ git config --list</code></p>
<h5 id="특정상황에서-빠져나오기">특정상황에서 빠져나오기</h5>
<p><code>:q</code></p>
<h3 id="6-commit-지정버전-설정">6. commit 지정(버전 설정)</h3>
<pre><code>$ git add 파일명 또는 $ git add .(추가하지 않은 모든 파일)
$ git commit -m&quot;메세지&quot;</code></pre><h3 id="7-github에-연결-업로드">7. github에 연결, 업로드</h3>
<pre><code>$ git remote add origin repository주소
$ git push -u origin master(파일올릴때 에러 나면 + master)</code></pre><h5 id="프로젝트-수정-후-업로드">프로젝트 수정 후 업로드</h5>
<pre><code>$ git add .
$ git commit -m&quot;메세지&quot;
$ git push -u origin master</code></pre><h3 id="리액트-프로젝트-사이트-배포하기">리액트 프로젝트 사이트 배포하기</h3>
<h5 id="git은-react기반-웹페이지를-지원하지-않음"><em>git은 react기반 웹페이지를 지원하지 않음</em></h5>
<p><a href="https://www.netlify.com/">netlify</a>
회원가입하여 진행.
Build command 항목에서..
<img src="https://velog.velcdn.com/images/s_honey1122/post/86ee806f-41b7-42b6-9dad-cd6381c0a775/image.png" alt="">
로 수정하여 업로드 해주면 더 안전하게 사이트를 배포할 수 있음</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React - scss연동, ...rest props]]></title>
            <link>https://velog.io/@s_honey1122/React-scss%EC%97%B0%EB%8F%99-...rest-props</link>
            <guid>https://velog.io/@s_honey1122/React-scss%EC%97%B0%EB%8F%99-...rest-props</guid>
            <pubDate>Tue, 06 Dec 2022 02:13:33 GMT</pubDate>
            <description><![CDATA[<p><em>watching하여 css파일을 별도로 만들지 않고, react의 scss를 실행해보자</em></p>
<h3 id="sass-설치">sass 설치</h3>
<h6 id="터미널-명령">터미널 명령</h6>
<pre><code>yarn add sass</code></pre><h5 id="appjsx">App.jsx</h5>
<pre><code>import React from &#39;react&#39;;
import &quot;./App.scss&quot;;
import Button from &quot;./components/Button&quot;

function App() {
  return (
    &lt;&gt;
      &lt;div className=&quot;App&quot;&gt;
        &lt;Button&gt;파란버튼&lt;/Button&gt;
      &lt;/div&gt;
    &lt;/&gt;
  );
}

export default App;</code></pre><h5 id="appscss">App.scss</h5>
<pre><code>.App{
    max-width: 700px;
    margin: 50px auto;
    border: 2px solid gray;
    padding: 2rem;
}</code></pre><h5 id="buttonjsx">Button.jsx</h5>
<pre><code>import React from &#39;react&#39;
import &quot;./Button.scss&quot;


const Button = ({children}) =&gt; {
  return (
    &lt;button className=&quot;Button&quot;&gt;{children}&lt;/button&gt;
  )
}

export default Button</code></pre><h5 id="buttonscss">Button.scss</h5>
<pre><code>$blue: #228be6;

.Button {
    background: $blue;
    color: white;
    font-weight: bold;
    border: 0;
    outline: none;
    border-radius: 4px;
    padding: 1rem 2rem;
    cursor: pointer;

    &amp;:hover {
        background: lighten($blue, 20%);
        //lighten함수 사용, 색상 10%밝게
    }

    &amp;:active {
        background: darken($blue, 20%);
    }
}</code></pre><p><img src="https://velog.velcdn.com/images/honey1122/post/6dba7697-c057-4645-907f-33695c6d5f5d/image.png" alt=""></p>
<h3 id="classnames-라이브러리-설치">classnames 라이브러리 설치</h3>
<pre><code>yarn add classnames</code></pre><p><em>특정 값이 true/false임에 따라 클래스명을 추가하거나, 추가하지 않을 수 있다.</em></p>
<blockquote>
<p>key(class명) : value형태로 value가 true 혹은 false로 평가됨에 따라 스타일을 적용하거나 적용하지 않을 수 있음.</p>
</blockquote>
<h5 id="appjsx-1">App.jsx</h5>
<pre><code>import React from &#39;react&#39;;
import &quot;./App.scss&quot;;
import Button from &quot;./components/Button&quot;

function App() {
  return (
    &lt;&gt;
      &lt;div className=&quot;App&quot;&gt;
        &lt;Button size = &quot;large&quot;&gt;파란버튼&lt;/Button&gt;
        &lt;Button&gt;파란버튼&lt;/Button&gt;
        &lt;Button size = &quot;smaill&quot;&gt;파란버튼&lt;/Button&gt;
      &lt;/div&gt;
    &lt;/&gt;
  );
}
export default App;</code></pre><h5 id="buttonjsx-1">Button.jsx</h5>
<pre><code>import React from &#39;react&#39;
import &quot;./Button.scss&quot;
import classNames from &#39;classnames&#39;

const Button = ({children, size}) =&gt; {
  return (
    &lt;button className={classNames(&quot;Button&quot;, size)}&gt;{children}&lt;/button&gt;
  )
}

Button.defaultProps = {
  size : &quot;medium&quot;,
};

export default Button</code></pre><h6 id="import-classnames-from-classnames-설치한-classnames라이브러리-불러옴">import classNames from &#39;classnames&#39;// 설치한 classNames라이브러리 불러옴.</h6>
<h6 id="button클래스는-조건없이-기본으로-추가">&quot;Button&quot;클래스는 조건없이 기본으로 추가.</h6>
<h5 id="size클래스는-값이-true인-경우에만-추가">&quot;size&quot;클래스는 값이 true인 경우에만 추가.</h5>
<h4 id="defaultprops">defaultProps</h4>
<blockquote>
<p>props를 따로 지정해주지 안항도 기본값으로 전달 해주는 props
<code>컴포넌트명.defulatProps={}</code></p>
</blockquote>
<h5 id="buttonscss-1">Button.scss</h5>
<pre><code>$blue: #228be6;

.Button {
    background: $blue;
    color: white;
    font-weight: bold;
    border: 0;
    outline: none;
    border-radius: 4px;
    padding: 1rem 2rem;
    cursor: pointer;

    &amp;:hover {
        background: lighten($blue, 20%);
    }

    &amp;:active {
        background: darken($blue, 20%);
    }
    &amp;.large {
        width: 200px;
        height: 70px;
        font-size: 1.3rem;
    }
    &amp;.medium {
        width: 100px;
        height: 40px;
        font-size: 1rem;
    }
    &amp;.small {
        width: 70px;
        height: 30px;
        font-size: 0.7rem;
    }
    &amp; + &amp; {
        margin-left: 1rem;
    }
}</code></pre><h6 id="---button--button과-같음-자매관계-태그중-바로-옆-태그를-선택하라">&amp; + &amp; // .Button + .Button과 같음. 자매관계 태그중 바로 옆 태그를 선택하라.</h6>
<h3 id="rest-props">...rest props</h3>
<p><em>전달해야 하는 props가 너무 많을때..</em></p>
<h5 id="appjsx-2">App.jsx</h5>
<pre><code>...
&lt;div className=&quot;BtnWrap&quot;&gt;
                &lt;Button color=&quot;pink&quot; size=&quot;large&quot; outline fullWidth&gt;
                    버튼
                &lt;/Button&gt;
                &lt;Button color=&quot;lime&quot; size=&quot;large&quot; fullWidth&gt;
                    버튼
                &lt;/Button&gt;
                &lt;Button 
        color=&quot;blue&quot; 
        size=&quot;large&quot; 
        fullWidth
        onClick={()=&gt;{
          console.log(&quot;클릭!&quot;);
        }}
        onMouseMove={()=&gt;{
          console.log(&quot;마우스가 움직임&quot;);
        }}&gt;
                    버튼
                &lt;/Button&gt;
            &lt;/div&gt;</code></pre><h5 id="buttonjsx-2">Button.jsx</h5>
<pre><code>const Button = ({children, size, color, outline, fullWidth,...rest}) =&gt; {
  return (
    &lt;button className={classNames(&quot;Button&quot;, size, color, {outline, fullWidth})}
    {...rest}&gt;
      {children}
    &lt;/button&gt;
  )
}</code></pre><p>출처 : 
<a href="https://chanhuiseok.github.io/posts/react-14/">[React] 리액트 classnames 활용하기 (classnames, !! 연산자)</a>
<a href="https://velog.io/@th0532/React-defaultProps">[React] defaultProps 사용하기</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React - PostCSS(CSS Modul)]]></title>
            <link>https://velog.io/@s_honey1122/React-PostCSSCSS-Modul</link>
            <guid>https://velog.io/@s_honey1122/React-PostCSSCSS-Modul</guid>
            <pubDate>Tue, 06 Dec 2022 02:13:13 GMT</pubDate>
            <description><![CDATA[<p><em>className 부여하여 버튼에 스타일 주기..</em></p>
<h5 id="appjsx">App.jsx</h5>
<pre><code>import React from &#39;react&#39;;
import &quot;./App.css&quot;;
import Button1 from &quot;./components/Button1&quot;
import Button2 from &quot;./components/Button2&quot;


function App() {
  return (
    &lt;&gt;
      &lt;Button1&gt;&lt;/Button1&gt;
      &lt;Button2&gt;&lt;/Button2&gt;
    &lt;/&gt;
  );
}

export default App;</code></pre><h5 id="button1jsx">Button1.jsx</h5>
<pre><code>import React from &#39;react&#39;
import &quot;./Button1.css&quot;

const Button1 = () =&gt; {
  return (
    &lt;button className=&#39;button&#39;&gt;BUTTON1&lt;/button&gt;
  )
}

export default Button1</code></pre><h5 id="button1css">Button1.css</h5>
<pre><code>.button{
    background-color: aqua;
}</code></pre><h5 id="button2jsx">Button2.jsx</h5>
<pre><code>import React from &#39;react&#39;
import &#39;./Button2.css&#39;

const Button2 = () =&gt; {
  return (
    &lt;button className=&#39;button&#39;&gt;BUTTON2&lt;/button&gt;
  )
}

export default Button2</code></pre><h5 id="button2css">Button2.css</h5>
<pre><code>.button{
    background-color: red;
}</code></pre><p><img src="https://velog.velcdn.com/images/honey1122/post/761854d6-cb3e-4310-ad7a-454a57bb27c5/image.png" alt=""></p>
<h5 id="button이-모두-button2css로-적용되는-불상사">Button이 모두 Button2.css로 적용되는 불상사..</h5>
<h2 id="postcsscss-module">PostCSS(CSS Module)</h2>
<blockquote>
<p>CSS 클래스가 중첩되는 것을 완벽히 방지.
CSS Module 사용시, CSS 파일의 확장자 :<br><code>.module.css</code>
리액트 컴포넌트 파일에서 해당 CSS 파일을 불러올 때 CSS 파일에 선언한 클래스 이름들이 <strong>고유해짐</strong>.</p>
</blockquote>
<h5 id="button1jsx-1">Button1.jsx</h5>
<pre><code>import React from &#39;react&#39;
import styles from &quot;./Button1.module.css&quot;


const Button1 = () =&gt; {
  return (
    &lt;button className={styles.button}&gt;BUTTON1&lt;/button&gt;
  )
}

export default Button1</code></pre><h6 id="import-styles-from-button1modulecss-import로-불러온-styles-객체-안의-값을-참조해야-함">import styles from &quot;./Button1.module.css&quot;// import로 불러온 styles 객체 안의 값을 참조해야 함.</h6>
<h5 id="button1modulecss">Button1.module.css</h5>
<pre><code>.button{
    background-color: aqua;
}</code></pre><h5 id="button2jsx-1">Button2.jsx</h5>
<pre><code>import React from &#39;react&#39;
import aa from &#39;./Button2.module.css&#39;

const Button2 = () =&gt; {
    return (
        &lt;button className={aa.button}&gt;BUTTON2&lt;/button&gt;
    )
}

export default Button2</code></pre><h6 id="import-aa-from-button2modulecss-import하는-객체의-이름은-자유롭게-선언">import aa from &#39;./Button2.module.css&#39;// import하는 객체의 이름은 자유롭게 선언.</h6>
<h5 id="button2modulecss">Button2.module.css</h5>
<pre><code>.button{
    background-color: red;
}</code></pre><p><img src="https://velog.velcdn.com/images/honey1122/post/261450c0-400c-463c-bdb4-0522c0d7c394/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React - ClassComponent]]></title>
            <link>https://velog.io/@s_honey1122/React-ClassComponent</link>
            <guid>https://velog.io/@s_honey1122/React-ClassComponent</guid>
            <pubDate>Tue, 06 Dec 2022 02:12:42 GMT</pubDate>
            <description><![CDATA[<h2 id="클래스형-컴포넌트">클래스형 컴포넌트</h2>
<blockquote>
<p>최근 잘 사용하지 않는 컴포넌트 형태.
render() 메서드를 이용하여 렌더링, JSX 반환.
props를 조회해야 할 때에는 this.props를 조회.</p>
</blockquote>
<p><em>button 클릭시 count되는 프로그램을 클래스형 컴포넌트 이용하여 구현</em></p>
<h5 id="appclassjsx">AppClass.jsx</h5>
<pre><code>import React, {Component} from &quot;react&quot;;

export default class AppClass extends Component{    
    constructor(props){
        super(props)
        this.state = {
            counter : 0
        }
    }

    increase = () =&gt; {
        this.setState({
            counter : this.state.counter + 1
        });
    }

    render(){
        return(
            &lt;&gt;
                &lt;h1&gt;{this.state.counter}&lt;/h1&gt;
                &lt;button onClick={this.increase}&gt;+1&lt;/button&gt;
            &lt;/&gt;
        )
    }
}</code></pre><h6 id="extends-component--react-컴포넌트-class를-정의하려면-reactcomponent를-상속받아야-함">extends Component // React 컴포넌트 class를 정의하려면 React.Component를 상속받아야 함.</h6>
<h5 id="constructorprops-reactcomponent를-상속한-컴포넌트의-생성자를-구현할-때에는-다른-구문에-앞서-superprops를-호출해야-함">constructor(props)// React.Component를 상속한 컴포넌트의 생성자를 구현할 때에는 다른 구문에 앞서 super(props)를 호출해야 함.</h5>
<blockquote>
<p>React에사 생성자 목적
this.state에 객체를 할당하여 지역 state초기화.
인스턴스에 이벤트 처리 메서드를 바인딩.
this.state를 직접 할당할 수 있는 유일한 곳. 이 외에는 this.setState()를 사용.
constructor 내부에서 setState()를 호추하면 안됨. 컴포넌트에 지역 state가 필요하면, 생성자 내에서 this.state에 초기 state값을 할당해야함.</p>
</blockquote>
<h5 id="superprops-이-구문이-없으면-thisprops가-생성자-내에서-정의되지-않아-버그로-이어짐">super(props)// 이 구문이 없으면 this.props가 생성자 내에서 정의되지 않아 버그로 이어짐.</h5>
<h5 id="render--reactcomponent의-하위-class에서-반드시-정의해야-하는-메서드">render() // React.Component의 하위 class에서 반드시 정의해야 하는 메서드.</h5>
<p>출처 : 
<a href="https://react.vlpt.us/basic/24-class-component.html">클래스형 컴포넌트</a>
<a href="https://ko.reactjs.org/docs/react-component.html#constructor">React.Component</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React - Context API]]></title>
            <link>https://velog.io/@s_honey1122/React-Context-API</link>
            <guid>https://velog.io/@s_honey1122/React-Context-API</guid>
            <pubDate>Tue, 06 Dec 2022 02:12:24 GMT</pubDate>
            <description><![CDATA[<h5 id="contextjsx">Context.jsx</h5>
<pre><code>import React from &#39;react&#39;

function Child({text}){
    return &lt;div&gt;HI{text}&lt;/div&gt;
}

function Parent({text}){
    return &lt;Child text = {text}/&gt;
}

function GrandParent({text}){
    return &lt;Parent text = {text}/&gt;
}

function Context({text}){
    return &lt;GrandParent text=&quot;GOOD&quot;/&gt;
}

export default Context</code></pre><p><img src="https://velog.velcdn.com/images/honey1122/post/05dd64ab-f472-478d-bfc5-650670153c69/image.png" alt=""></p>
<h5 id="복잡한-구조---context-api-사용하자">복잡한 구조.. -&gt; Context API 사용하자!</h5>
<h2 id="context-api">Context API</h2>
<blockquote>
<p>컴포넌트를 여러개 거쳐서 전달하는 상황 -&gt; Context API를 이용하여 간단하게 구현 할 수 있음.
프로젝트 안에서 전역적으로 사용할 수 있는 값을 관리함.</p>
</blockquote>
<h3 id="createcontext">createContext</h3>
<blockquote>
<p>context 객체 생성
createContext 함수 호출 시 Provider와 Consumer 컴포넌트 반환
initialValue는 Provider를 사용하지 않았을때 적용될 초기값을 의미</p>
</blockquote>
<pre><code>createContext(initialValue)</code></pre><h3 id="usecontext">useContext</h3>
<blockquote>
<p>생성된 context를 컴포넌트에 전달받음
context의 변화를 감시
설정한 상태를 불러옴</p>
</blockquote>
<pre><code>const data = userContext(Context)</code></pre><h5 id="contextjsx-1">Context.jsx</h5>
<pre><code>import React, {createContext, useContext} from &#39;react&#39;

const MyContext = createContext(&#39;defaultValue&#39;);

function Child(){
    const text = useContext(MyContext);
    return &lt;div&gt;HI{text}&lt;/div&gt;
}

function Parent(){
    return &lt;Child/&gt;
}

function GrandParent(){
    return &lt;Parent/&gt;
}

function Context(){
    return &lt;MyContext.Provider value = &quot;GOOD!&quot;&gt;
                &lt;GrandParent/&gt;
            &lt;/MyContext.Provider&gt;
}

export default Context</code></pre><h5 id="const-mycontext--createcontextdefaultvalue--createcontext로-만들어진-변수-mycontext는-컴포넌트-처럼-쓰임">const MyContext = createContext(&#39;defaultValue&#39;); // createContext로 만들어진 변수 (MyContext)는 컴포넌트 처럼 쓰임</h5>
<h5 id="mycontextprovider-value--good-createcontext로-만들어준-컴포넌트에는-provider-프로퍼티가-들어있음-provider-프로퍼티를-통해-value값-설정">&lt;MyContext.Provider value = &quot;GOOD!&quot;&gt; //createContext로 만들어준 컴포넌트에는 Provider 프로퍼티가 들어있음. provider 프로퍼티를 통해 value값 설정.</h5>
<h3 id="usecontext---유동적으로">useContext - 유동적으로</h3>
<p><em>useState를 사용하여 유동적으로 변하는 기능을 추가함.</em></p>
<h5 id="contextjsx-2">Context.jsx</h5>
<pre><code>import React, {createContext, useContext, useState} from &#39;react&#39;

const MyContext = createContext(&#39;defaultValue&#39;);

function Child(){
    const text = useContext(MyContext);
    return &lt;div&gt;HI{text}&lt;/div&gt;
}

function Parent(){
    return &lt;Child/&gt;
}

function GrandParent(){
    return &lt;Parent/&gt;
}

function Context(){
    const [value, setValue] = useState(true);

    return &lt;MyContext.Provider value = {value ? &quot;Good&quot; : &quot;Bad&quot;}&gt;
                &lt;GrandParent/&gt;
                &lt;button onClick={() =&gt; setValue(!value)}&gt;click!&lt;/button&gt;
            &lt;/MyContext.Provider&gt;
}

export default Context</code></pre><p><img src="https://velog.velcdn.com/images/honey1122/post/cfb368be-6335-4461-a712-68eb9c0a419e/image.png" alt=""></p>
<p>출처 : 
<a href="https://react.vlpt.us/basic/22-context-dispatch.html">Context API 를 사용한 전역 값 관리</a>
<a href="https://cocoon1787.tistory.com/801">[React] 리액트 Hooks : useContext() 함수 사용법 (전역 상태 관리)</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React - useReducer, 커스텀 hook]]></title>
            <link>https://velog.io/@s_honey1122/React-useReducer-%EC%BB%A4%EC%8A%A4%ED%85%80-hook</link>
            <guid>https://velog.io/@s_honey1122/React-useReducer-%EC%BB%A4%EC%8A%A4%ED%85%80-hook</guid>
            <pubDate>Tue, 06 Dec 2022 02:12:05 GMT</pubDate>
            <description><![CDATA[<h2 id="usereducer">useReducer</h2>
<blockquote>
<p>useState의 대체 함수.
(state, action) =&gt; newState의 형태. 
reducer를 받고 dispatch의 메서드와 짝의 형태로 현재 state를 반환.</p>
</blockquote>
<pre><code>const [state, dispatch] = useReducer(reducer, initialArg, init);</code></pre><h5 id="state-현재상태">state //현재상태</h5>
<h5 id="dispatch-action으로-보내는-함수">dispatch //action으로 보내는 함수</h5>
<h5 id="reducer-연결되는-함수명">reducer //연결되는 함수명</h5>
<h5 id="initialarg-초기값">initialArg //초기값</h5>
<p><em>useReducer사용하여 active 사용자 count하기</em></p>
<h5 id="counterjsx">counter.jsx</h5>
<pre><code>import React, {useReducer} from &#39;react&#39;

const Counter = () =&gt; {
    function reducer(state, action){
        switch(action.type){
            case &#39;INCREMENT&#39;:
                return state+1;
            case &quot;DECREMENT&quot;:
                return state-1;
            default : 
                return state;
        }
    }

    const [number, dispatch] = useReducer(reducer, 0);


    const increase = () =&gt; {
        dispatch({type : &quot;INCREMENT&quot;})
    }

    const decrease = () =&gt; {
        dispatch({type : &quot;DECREMENT&quot;})
    }
  return (
    &lt;div&gt;
        &lt;h1&gt;{number}&lt;/h1&gt;
        &lt;button onClick={increase}&gt;+1&lt;/button&gt;
        &lt;button onClick={decrease}&gt;-1&lt;/button&gt;
    &lt;/div&gt;
  )
}

export default Counter</code></pre><h5 id="action-dispatch에서-보낸-객체를-parameter로-받아옴">action// dispatch에서 보낸 객체를 parameter로 받아옴</h5>
<h2 id="custom-hook">custom hook</h2>
<blockquote>
<p>반복되는 로직을 쉽게 재사용 하기 위해 직접 만들어 사용하는 hook
보통 파일 이름은 Use-로 시작</p>
</blockquote>
<p><em>user를 새로 input하는 custom hook을 만들어 보자</em></p>
<h5 id="useinputsjs">UseInputs.js</h5>
<pre><code>import {useState, useCallback} from &#39;react&#39;

const UseInputs = (initialForm) =&gt; {
    const [form, setForm] = useState(initialForm);

    const onChange = useCallback((e)=&gt; {
        const {name, value} = e.target;
        setForm(form =&gt; ({...form, [name]:value}))
    }, [])

    const reset = useCallback(()=&gt;setForm(initialForm), [initialForm]);
    //form을 초기화
  return (
    [form, onChange, reset]
  )
}

export default UseInputs</code></pre><h6 id="setformform--form-namevalue--객체-리터럴-표현을-반환하기-위해-함수-본문을-괄호속에-넣음">setForm(form =&gt; ({...form, [name]:value})) // 객체 리터럴 표현을 반환하기 위해 함수 본문을 괄호속에 넣음.</h6>
<h5 id="appjs">App.js</h5>
<pre><code>import React, { useReducer, useCallback, useRef, useMemo }  from &#39;react&#39;
import UserList from &#39;./components/UserList&#39;
import CreateUser from &#39;./components/CreateUser&#39;
import UseInputs from &#39;./components/UseInputs&#39;

const initialState = {
  users : [
    {
      id : 1,
      username : &#39;jisung&#39;,
      email : &#39;jisung@gmail.com&#39;,
      Active : true
    },
    {
      id : 2,
      username : &#39;mark&#39;,
      email : &#39;marklee@naver.com&#39;,
      Active : false

    },
    {
      id : 3,
      username : &#39;jeongwoo&#39;,
      email : &#39;jeongwoo@gmail.com&#39;,
      Active : false
    }
  ]
}

function reducer(state, action){
  switch(action.type){
    case &quot;CREATE_USER&quot;:
      return{
        users : state.users.concat(action.user)
      }
    case &quot;TOGGLE_USER&quot;:
      return{
        ...state,users:state.users.map(user=&gt;
          user.id === action.id ? {...user,active : !user.active}:user)
      }
      case &quot;REMOVE_USER&quot;:
        return {
          ...state, users:state.users.filter(user=&gt;user.id !== action.id)
        }
        default:
          throw new Error(&quot;액션 없음!&quot;);
  }
}

function countActiveUsers(users){
  return users.filter(user =&gt; user.active).length;
}
function App() {
  const [state, dispatch] = useReducer(reducer, initialState);
  const {users} = state;
  const nextId = useRef(4);

  const [form, onChange, reset] = UseInputs({
    username : &quot;&quot;,
    email : &quot;&quot;
  });

  const {username, email} = form;

  const onToggle = useCallback((id)=&gt;{
    dispatch({
      type : &quot;TOGGLE_USER&quot;,
      id
    })
  }, [])

  const onRemove = useCallback((id)=&gt;{
    dispatch({
      type : &quot;REMOVE_USER&quot;,
      id
    })
  }, [])

  const onCreate = useCallback(()=&gt;{
    dispatch({
      type : &quot;CREATE_USER&quot;,
      user : {
        id : nextId.current,
        username,
        email
      }
    })
    reset();
    nextId.current+=1;
  }, [username,email,reset])

  const count = useMemo(()=&gt;countActiveUsers(users), [users])

  return (
    &lt;&gt;
      &lt;CreateUser 
        username={username} 
        email={email} 
        onChange={onChange} 
        onCreate={onCreate} 
      /&gt;&lt;br/&gt;
      &lt;UserList users={users} onToggle={onToggle} onRemove={onRemove}/&gt;&lt;br /&gt;
      &lt;div&gt;Active 상태의 사용자 수 : {count} &lt;/div&gt;
    &lt;/&gt;
  );
}

export default App;
</code></pre><p>출처 : 
<a href="https://ko.reactjs.org/docs/hooks-reference.html#usereducer">useReducer</a>
<a href="https://react.vlpt.us/basic/21-custom-hook.html">커스텀 hooks 만들기</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React - useMemo, useCallback]]></title>
            <link>https://velog.io/@s_honey1122/React-useMemo-useCallback</link>
            <guid>https://velog.io/@s_honey1122/React-useMemo-useCallback</guid>
            <pubDate>Tue, 06 Dec 2022 02:11:47 GMT</pubDate>
            <description><![CDATA[<h2 id="usememo">useMemo</h2>
<blockquote>
<p>메모이제이션(memoization)된 값을 반환
함수형 컴포넌트 - 렌더링 -&gt; Component함수 호출 -&gt; 모든 내부 변수 초기화
= 호출하는 함수가 무거운 함수라면, 매우 비효율적 --&gt; useMemo가 해결
useMemo - 렌더링 -&gt; Component함수 호출 -&gt; Memoize된 함수 재사용
값을 재활용 하기 위해 따로 메모리르 소비하여 저장 -&gt; 꼭 필요할 때에만 사용</p>
</blockquote>
<pre><code>const memoizedValue = useMemo(() =&gt; computeExpensiveValue(a, b), [a, b]);</code></pre><h6 id="computeexpensivevaluea-b--콜백함수">computeExpensiveValue(a, b) // 콜백함수</h6>
<h6 id="a-b--배열">[a, b] // 배열</h6>
<h5 id="배열의-요소-값이-업데이트-될-때만-콜백함수를-호출하여-memoization된-값을-업데이트---memoization을-해줌">배열의 요소 값이 업데이트 될 때만 콜백함수를 호출하여 memoization된 값을 업데이트 -&gt; memoization을 해줌.</h5>
<h6 id="메모이제이션--컴퓨터-프로그램이-동일한-계산을-반복해야-할-때-이전에-계산한-값을-메모리에-저장---동일한-계산-반복-수행-제거---컴포넌트의-성능-최적화">메모이제이션 ? 컴퓨터 프로그램이 동일한 계산을 반복해야 할 때, 이전에 계산한 값을 메모리에 저장 -&gt; 동일한 계산 반복 수행 제거 -&gt; 컴포넌트의 성능 최적화.</h6>
<p><em>active상태의 사용자의 수를 count</em></p>
<h5 id="appjsx">App.jsx</h5>
<pre><code>import React, {useRef, useState, useMemo} from &#39;react&#39;;
import &#39;./App.css&#39;;
import CreateUser from &#39;./CreateUser&#39;;
import UserList from &#39;./UserList&#39;;

function countActiveUsers(users){
  return users.filter(user =&gt; user.active).length;
}
function App() {
  const [inputs, setInputs] = useState({
    username : &#39;&#39;,
    email : &#39;&#39;
  })

  const {username, email} = inputs;

  const onChange = (e) =&gt; {
    const {name, value} = e.target;
    setInputs({...inputs, [name]:value})
  }


  const [users, setUsers] =useState([  
    { id:1, 
      username:&#39;jisung&#39;, 
      email:&#39;jisung@gmail.com&#39;,
      active : true
    },
    { id:2, 
      username:&#39;mark&#39;, 
      email:&#39;marklee@naver.com&#39;,
      active : false

    },
    { id:3, 
      username:&#39;jungwoo&#39;, 
      email:&#39;jungwoo@gmail.com&#39;,
      active : false
    },
  ]);
  const nextId = useRef(4);

    const onCreate = () =&gt; {
      const user = {
        id : nextId.current,
        username,
        email
      }

      nextId.current += 1;

      setUsers(users.concat(user));

      setInputs({
        username  :&#39;&#39;,
        email : &#39;&#39;
      })
    }

    const onRemove = (id) =&gt; {
      setUsers(users.filter(user =&gt; user.id !==id));

    }

    const onToggle = (id) =&gt; {
      console.log(id);
      setUsers(users.map(user =&gt;
        user.id == id? 
        {
          ...user, 
          active:!user.active
        }
          :
          user
          )
      )
    }

    const count = useMemo(()=&gt;countActiveUsers(users),[users]);

  return (
    &lt;&gt;
      &lt;CreateUser
        username = {username}
        email = {email}
        onCreate = {onCreate}
        onChange = {onChange}
      /&gt;
      &lt;UserList users = {users} onRemove={onRemove} onToggle = {onToggle}/&gt;
      &lt;div&gt;Active 상태의 사용자 수 : {count}&lt;/div&gt;
    &lt;/&gt;
  );
}

export default App;</code></pre><p><img src="https://velog.velcdn.com/images/honey1122/post/92dde67f-bf41-4a38-b4d0-748b0056b3b4/image.png" alt=""></p>
<h2 id="usecallback">useCallback</h2>
<blockquote>
<p>메모이제이션된 콜백을 반환.
useCallback(fn, deps)은 useMemo(() =&gt; fn, deps)와 같음
useMemo보다 함수를 위해 사용 할 때 더욱 편안.</p>
</blockquote>
<pre><code>const memoizedCallback = useCallback(
  () =&gt; {
    doSomething(a, b);
  },
  [a, b],
);</code></pre><h5 id="appjsx-1">App.jsx</h5>
<pre><code>import React, {useRef, useState, useMemo, useCallback} from &#39;react&#39;;
import &#39;./App.css&#39;;
import CreateUser from &#39;./CreateUser&#39;;
import UserList from &#39;./UserList&#39;;

function countActiveUsers(users){
  return users.filter(user =&gt; user.active).length;
}
function App() {
  const [inputs, setInputs] = useState({
    username : &#39;&#39;,
    email : &#39;&#39;
  })

  const {username, email} = inputs;

  const onChange = useCallback((e)=&gt;{
    const {name, value} = e.target;
    setInputs({...inputs, [name]:value})
  }, [inputs])

  const [users, setUsers] =useState([  
    { id:1, 
      username:&#39;jisung&#39;, 
      email:&#39;jisung@gmail.com&#39;,
      active : true
    },
    { id:2, 
      username:&#39;mark&#39;, 
      email:&#39;marklee@naver.com&#39;,
      active : false

    },
    { id:3, 
      username:&#39;jungwoo&#39;, 
      email:&#39;jungwoo@gmail.com&#39;,
      active : false
    },
  ]);
  const nextId = useRef(4);

    const onCreate = () =&gt; {
      const user = {
        id : nextId.current,
        username,
        email
      }

      nextId.current += 1;

      setUsers(users.concat(user));

      setInputs({
        username  :&#39;&#39;,
        email : &#39;&#39;
      })
    }

    const onRemove = (id) =&gt; {
      setUsers(users.filter(user =&gt; user.id !==id));

    }

    const onToggle = (id) =&gt; {
      console.log(id);
      setUsers(users.map(user =&gt;
        user.id == id? 
        {
          ...user, 
          active:!user.active
        }
          :
          user
          )
      )
    }

    const count = useMemo(()=&gt;countActiveUsers(users),[users]);

  return (
    &lt;&gt;
      &lt;CreateUser
        username = {username}
        email = {email}
        onCreate = {onCreate}
        onChange = {onChange}
      /&gt;
      &lt;UserList users = {users} onRemove={onRemove} onToggle = {onToggle}/&gt;
      &lt;div&gt;Active 상태의 사용자 수 : {count}&lt;/div&gt;
    &lt;/&gt;
  );
}

export default App;</code></pre><p>출처 : 
<a href="https://ko.reactjs.org/docs/hooks-reference.html#usememo">HookAPIReference</a>
<a href="https://ko.wikipedia.org/wiki/%EB%A9%94%EB%AA%A8%EC%9D%B4%EC%A0%9C%EC%9D%B4%EC%85%98">메모이제이션</a>
<a href="https://itprogramming119.tistory.com/entry/React-useMemo-%EC%82%AC%EC%9A%A9%EB%B2%95-%EB%B0%8F-%EC%98%88%EC%A0%9C">useMemo 사용법 및 예제</a></p>
]]></description>
        </item>
    </channel>
</rss>