<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>::박정연의 개발기록(๑•̀ㅂ•́)و✧</title>
        <link>https://velog.io/</link>
        <description>프론트엔드 개발자를 희망하는 대학생입니다 🦔  알고 및 TIL 올리겠습니다 🐌 느리고 모자라도 꾸준히 하겠습니다!</description>
        <lastBuildDate>Sun, 04 Jul 2021 03:40:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. ::박정연의 개발기록(๑•̀ㅂ•́)و✧. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jeongyeon-park" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[react] useRef로 컴포넌트 안의 변수 만들기]]></title>
            <link>https://velog.io/@jeongyeon-park/react-useRef%EB%A1%9C-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8-%EC%95%88%EC%9D%98-%EB%B3%80%EC%88%98-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@jeongyeon-park/react-useRef%EB%A1%9C-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8-%EC%95%88%EC%9D%98-%EB%B3%80%EC%88%98-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Sun, 04 Jul 2021 03:40:00 GMT</pubDate>
            <description><![CDATA[<h3 id="변수란">변수란?</h3>
<p>컴포넌트 내부에서 let으로 변수를 설정 해 준다면, 다음 리랜더링 될 때 그 변수값은 초기화 된다. 계속 유지하고 싶은 값을 관리하려면 useState를 사용해야하는데, 상태를 바꾸면 component가 리랜더링 된다. 어떤 값을 바꾸었을때 굳이 리랜더링 할 필요 없는 그런 값을 관리하게 될 때도 있다. 이런 때에는 useRef를 사용. </p>
<p>컴포넌트가 리랜더링 될 때마다 기억할 수 있는 값을 관리할 때도 사용한다. </p>
<p>useRef로 관리하는 값은 바뀌어도 컴포넌트가 리랜더링 되지 않음. 
<img src="https://images.velog.io/images/jeongyeon-park/post/dea19bae-d181-4497-ba05-28c3c71b9c17/image.png" alt=""></p>
<p>어떠한 변수를 계속 기억하고 싶을 때. 
nextId.current를 바꾼다면 nextId값도 바뀌는 것이다. </p>
<p>값이 바뀐다고 해서 component가 리랜더링 되지는 않는다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] 배열 렌더링 하기]]></title>
            <link>https://velog.io/@jeongyeon-park/React-%EB%B0%B0%EC%97%B4-%EB%A0%8C%EB%8D%94%EB%A7%81-%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@jeongyeon-park/React-%EB%B0%B0%EC%97%B4-%EB%A0%8C%EB%8D%94%EB%A7%81-%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 26 Jun 2021 01:51:16 GMT</pubDate>
            <description><![CDATA[<h3 id="먼저-비효율적인-방법으로-해-보기">먼저 비효율적인 방법으로 해 보기</h3>
<pre><code>import React from &#39;react&#39;;

function UserList(){
    const users = [
        {
            id:1,
            username: &#39;velopert&#39;,
            email:&#39;public.velopert@gmail.com&#39;
        },
        {
            id:2,
            username: &#39;sample&#39;,
            email: &#39;tester@example.com&#39;
        },
        {
            id:3,
            username: &#39;liz&#39;,
            email: &#39;liz@exameple.com&#39;
        }
    ];


    return (
        &lt;div&gt;
            &lt;div&gt;
                &lt;b&gt;{users[0].username}&lt;/b&gt;
                &lt;span&gt;{users[0].email}&lt;/span&gt;
            &lt;/div&gt;
            &lt;div&gt;
                &lt;b&gt;{users[1].username}&lt;/b&gt;
                &lt;span&gt;{users[1].email}&lt;/span&gt;
            &lt;/div&gt;
            &lt;div&gt;
                &lt;b&gt;{users[2].username}&lt;/b&gt;
                &lt;span&gt;{users[2].email}&lt;/span&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    );
}

export default UserList;
</code></pre><p>return 에서 같은 코드가 여러번 사용</p>
<p>하나의 파일에 여러개의 컴포넌트를 정의해도 됨. </p>
<pre><code>import React from &#39;react&#39;;


function User({user}){
    return (
        &lt;div&gt;
            &lt;b&gt;{user.username}&lt;/b&gt;
            &lt;span&gt;{user.email}&lt;/span&gt;
        &lt;/div&gt;
    );
}


function UserList(){
    const users = [
        {
            id:1,
            username: &#39;velopert&#39;,
            email:&#39;public.velopert@gmail.com&#39;
        },
        {
            id:2,
            username: &#39;sample&#39;,
            email: &#39;tester@example.com&#39;
        },
        {
            id:3,
            username: &#39;liz&#39;,
            email: &#39;liz@exameple.com&#39;
        }
    ];


    return (
        &lt;div&gt;
            &lt;User user={users[0]}/&gt;
            &lt;User user={users[1]}/&gt;
            &lt;User user={users[2]}/&gt;
        &lt;/div&gt;
    );
}

export default UserList;
</code></pre><p>먼저 배열이 고정적이라면 이렇게 해 줘도 상관 없겠지만 만약 배열 내용이 바뀐다면? </p>
<p>자바스크립트 배열의 내장함수 map을 사용한다. </p>
<h3 id="map을-이용하여-객체-배열을-component-element형태의-배열로-변환">map()을 이용하여 객체 배열을 component element형태의 배열로 변환.</h3>
<p>key 라는 props 고유값을 지정 해 주는것. 
(최적화 위하여.)</p>
<pre><code>// 고유한 값을 key로 설정 해 주어야한다. 
    return (
        &lt;div&gt;
            {
                users.map(
                    user =&gt; (&lt;User user={user} key={user.id}/&gt;)
                )
            }
        &lt;/div&gt;
    );</code></pre><p>user.id 같은 고유한게 없을때는 기본적으로 key={index} 를 사용하게 되어있다. </p>
<pre><code>(user, index) =&gt; (&lt;User user={user} key = {index}/&gt;) 이렇게.</code></pre><p>index만 넣었을 때는 성능적으로 나아지지는 않음. 
key의 역할 : </p>
<p>array라는 배열이 있다. 
이 배열을  div앨리먼드로 변환 해 주려고 할 떄. </p>
<p> <img src="https://images.velog.io/images/jeongyeon-park/post/4d15d1c7-8755-4763-a098-220c94150b14/image.png" alt=""></p>
<p> 중간에 z 를 넣어준다면, c가 z로 바뀌고 d가 c로 바뀌고.. 이런식.
 비효율적. </p>
<p> 각 배열의 원소가 정확히 어떤걸 렌더링 하고 있는지를 잘 모르기 때문.</p>
<p> key가 있어야 </p>
<pre><code> import React from &#39;react&#39;;


function User({user}){
    return (
        &lt;div&gt;
            &lt;b&gt;{user.username}&lt;/b&gt;
            &lt;span&gt;{user.email}&lt;/span&gt;
        &lt;/div&gt;
    );
}


function UserList(){
    const users = [
        {
            id:1,
            username: &#39;velopert&#39;,
            email:&#39;public.velopert@gmail.com&#39;
        },
        {
            id:2,
            username: &#39;sample&#39;,
            email: &#39;tester@example.com&#39;
        },
        {
            id:3,
            username: &#39;liz&#39;,
            email: &#39;liz@exameple.com&#39;
        }
    ];

// 고유한 값을 key로 설정 해 주어야한다. 
    return (
        &lt;div&gt;
            {
                users.map(
                    user =&gt; (&lt;User user={user} key={user.id}/&gt;)
                )
            }
        &lt;/div&gt;
    );
}

export default UserList;
</code></pre><p><img src="https://images.velog.io/images/jeongyeon-park/post/ac1dddf6-9c54-4be3-8930-018ce564bca7/image.png" alt=""></p>
<p>key가 있어야 어떤 데이터를 가리키는지 알 수 있다. </p>
<p>배열 렌더링 할 때는 key를 설정해야 효율적으로 렌더링 할 수 있다 .</p>
<p>고유값이 없을 때에는 key에 index를 넣을 수 있지만 비효율적이다. 
데이터가 얼마 없고 자주 업데이트 되지 않을때에는 index사용한다고 큰 문제가 되지는 않는다. 
index를 key로 사용하면 매우 비효율적으로 업데이트가 된다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] useRef로 특정 DOM 선택하기]]></title>
            <link>https://velog.io/@jeongyeon-park/React-useRef%EB%A1%9C-%ED%8A%B9%EC%A0%95-DOM-%EC%84%A0%ED%83%9D%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@jeongyeon-park/React-useRef%EB%A1%9C-%ED%8A%B9%EC%A0%95-DOM-%EC%84%A0%ED%83%9D%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 26 Jun 2021 01:40:30 GMT</pubDate>
            <description><![CDATA[<p>react사용할 때도 dom을 직접 선택 해야할 때가 있다. 
focus설정한다거나.. 하는 다양한 상황. 
html 비디오 관련 라이브러리나 그래프 관련 라이브 러리를 사용하게 될 때에도 특정 dom에다가 해야해서.. 그럴때가 있다. </p>
<p>class Component는 좀 나중에 다루겠다. </p>
<p>초기화 버튼 눌렀을 때 포커스를 이름에 두고 싶다면?</p>
<h3 id="dom에-직접-접근하는-방법--useref">Dom에 직접 접근하는 방법 : useRef</h3>
<pre><code>const nameInput = useRef();</code></pre><p>하면 nameInput이라는 객체가 만들어진다. </p>
<pre><code>&lt;input
                name=&quot;name&quot; 
                placeholder=&quot;이름&quot;
                onChange={onChange} 
                value={name}
                ref = {nameInput}
            /&gt;</code></pre><p>선택하고 싶은 element에 ref = {nameInput} 해 준다. 
이러면 이 Dom에 직접 접근 가능하다. </p>
<pre><code>const onReset = ()=&gt;{
        setInputs({
            name: &#39;&#39;,
            nickname:&#39;&#39;,
        });
        nameInput.current.focus();
    };</code></pre><p>그런뒤 이렇게 해 주면 이름 쪽에 focus가 잡힘. </p>
<p>current라는 값이 들어있는데, current가 돔을 가리킨다.
dom API중에 focus()라는게 있다. </p>
<p>useRef는 Dom선택 말고도 렌더링과 관련 없는 변수 관리 할 때도 사용 된다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] 여러개의 input 상태 관리하기 ]]></title>
            <link>https://velog.io/@jeongyeon-park/React-%EC%97%AC%EB%9F%AC%EA%B0%9C%EC%9D%98-input-%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@jeongyeon-park/React-%EC%97%AC%EB%9F%AC%EA%B0%9C%EC%9D%98-input-%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 26 Jun 2021 01:20:37 GMT</pubDate>
            <description><![CDATA[<h3 id="여러개의-input-상태-관리하기">여러개의 input 상태 관리하기</h3>
<p>input 여러 개 일때 useState를 여러개 사용하는건 좋은 방법이 아님. 
좋은 방법은, input에 name이라는 값을 설정하고, 이벤트가 발생했을 때 이값을 참조하는거다. </p>
<p>여러개의 문자열 형태를 가지고 있는 객체 형태를 관리 해 줘야한다. </p>
<pre><code>function InputSample(){
    const [inputs, setInputs] = useState({
        name:&#39;&#39;,
        nickname:&#39;&#39;, 
    });
    const {name, nickname} = inputs;

    const onChange = (e)=&gt;{
        console.log(e.target.name);
        console.log(e.target.value);
    }

    const onReset = ()=&gt;{

    }
    return (
        &lt;div&gt;
            &lt;input name=&quot;name&quot; placeholder=&quot;이름&quot; onChange={onChange}/&gt;
            &lt;input name=&quot;nickname&quot; placeholder=&quot;닉네임&quot; onChange={onChange}/&gt;
            &lt;button onClick={onReset}&gt;초기화&lt;/button&gt;
            &lt;div&gt;
                &lt;b&gt;값: &lt;/b&gt;
                이름 (닉네임)
            &lt;/div&gt;
        &lt;/div&gt;
    );
}

export default InputSample;</code></pre><p>이 값들을 참조해서 객체를 업데이트 해 주면 되는건데,</p>
<h3 id="리액트에서-객체를-업데이트-할-때">리액트에서 객체를 업데이트 할 때</h3>
<ol>
<li>기존의 객체를 복사 해야한다. </li>
</ol>
<p>...inputs 이건 spread문법인데 이 문법은 객체 혹은 배열을 펼칠 수 있다. </p>
<p><a href="https://learnjs.vlpt.us/useful/07-spread-and-rest.html?q=">https://learnjs.vlpt.us/useful/07-spread-and-rest.html?q=</a></p>
<pre><code>import React , { useState } from &#39;react&#39;;

function InputSample(){
    const [inputs, setInputs] = useState({
        name:&#39;&#39;,
        nickname:&#39;&#39;, 
    });
    const {name, nickname} = inputs;

    const onChange = (e)=&gt;{
        const {name, value} = e.target;

        const nextInputs = {
            //spread 문법. 현재 상태의 내용이 이 자리로 온다. 
            ...inputs,
            [name] : value,
        };
        //객체를 새로운 상태로 쓰겠다. 
        setInputs(nextInputs);
    };

    const onReset = ()=&gt;{

    };

    return (
        &lt;div&gt;
            &lt;input name=&quot;name&quot; placeholder=&quot;이름&quot; onChange={onChange}/&gt;
            &lt;input name=&quot;nickname&quot; placeholder=&quot;닉네임&quot; onChange={onChange}/&gt;
            &lt;button onClick={onReset}&gt;초기화&lt;/button&gt;
            &lt;div&gt;
                &lt;b&gt;값: &lt;/b&gt;
                이름 (닉네임)
            &lt;/div&gt;
        &lt;/div&gt;
    );
}

export default InputSample;</code></pre><p>nextInputs 에 ...inputs을 사용해서 input한거 그대로 사용 하면서 name만 value로 덮어준다. </p>
<pre><code>const nextInputs = {
            //spread 문법. 현재 상태의 내용이 이 자리로 온다. 
            ...inputs,
            name:value,
        };</code></pre><p>이렇게 하면 문자열 name자체가 들어가지게 되는데 </p>
<pre><code>[name]:value,</code></pre><p>해주면 name값에 따라 다른 key값이 변경됨. </p>
<h3 id="정리">정리</h3>
<p>객체 상태를 업데이트 할 때는 꼭 기존의 상태를 한번 복사하고 나서 특정값을 덮어 씌우고 새로운 값을 설정 해주어야함. : 이걸 불변성을 지켜준다고 함. 
이렇게 해야 업데이트 된 것을 감지하고 랜더링이 됨. </p>
<p>객체 상태를 업데이트 할 때는 spread문법으로 객체를 복사하고, 특정값을 덮어씌워서 상태를 업데이트 해 주어야한다. </p>
<p>이건 배열 상태를 관리 할 때에도 마찬가지이고 불변성을 지켜줘야지만 최적화도 되는 것이다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] input 상태 관리하기]]></title>
            <link>https://velog.io/@jeongyeon-park/React-input-%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@jeongyeon-park/React-input-%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 25 Jun 2021 07:05:07 GMT</pubDate>
            <description><![CDATA[<h3 id="input-이벤트-관리하는-법">input 이벤트 관리하는 법.</h3>
<pre><code>import React , { useState } from &#39;react&#39;;

function InputSample(){
    const [text,setText] = useState(&#39;&#39;);
    const onChange = (e)=&gt;{
        setText(e.target.value);
    }

    const onReset = ()=&gt;{
        setText(&#39;&#39;);
    }
    return (
        &lt;div&gt;
            &lt;input onChange={onChange} value={text}&gt;&lt;/input&gt;
            &lt;button onClick={onReset}&gt;초기화&lt;/button&gt;
            &lt;div&gt;
                &lt;b&gt;값: &lt;/b&gt;
                {text}
            &lt;/div&gt;
        &lt;/div&gt;
    );
}

export default InputSample;</code></pre><p>onChange라는 함수 만들고 e.target하면 이벤트가 발생한 DOM이 들어옴. </p>
<p><input value={text}></input>
해서 value에 text해 주는것이 중요하다. 안그러면 초기화가 되지 않는다 ㅠㅠ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React]useState를 통한 동적 상태 관리]]></title>
            <link>https://velog.io/@jeongyeon-park/ReactuseState%EB%A5%BC-%ED%86%B5%ED%95%9C-%EB%8F%99%EC%A0%81-%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%AC</link>
            <guid>https://velog.io/@jeongyeon-park/ReactuseState%EB%A5%BC-%ED%86%B5%ED%95%9C-%EB%8F%99%EC%A0%81-%EC%83%81%ED%83%9C-%EA%B4%80%EB%A6%AC</guid>
            <pubDate>Fri, 25 Jun 2021 06:42:15 GMT</pubDate>
            <description><![CDATA[<p>사용자 인터렉션에 따라 동적으로 바뀌어야 할 때 어떻게 해야하는지.</p>
<p>리액트 16.8에서 hooks라는 기능이 도입되면서 
함수형 컴포넌트에서도 가능. </p>
<p>counter기능 구현하기 .</p>
<h3 id="이벤트-발생하면-특정-함수-실행-되도록-설정하기">이벤트 발생하면 특정 함수 실행 되도록 설정하기</h3>
<pre><code>import React from &#39;react&#39;

function Counter(){
    const onIncrease = ()=&gt;{
        console.log(&#39;+1&#39;);
    }
    const onDecrease = ()=&gt;{
        console.log(&#39;-1&#39;);
    }
    return(
        &lt;div&gt;
            &lt;h1&gt;0&lt;/h1&gt;
            &lt;button onClick={onIncrease}&gt;+1&lt;/button&gt;
            &lt;button onClick={onDecrease}&gt;-1&lt;/button&gt;
        &lt;/div&gt;
    );
}

export default Counter;</code></pre><h3 id="이벤트-설정할-때-주의-할-점">이벤트 설정할 때 주의 할 점</h3>
<p>여기에 함수를 넣어주는거지 onIncrease()이렇게 실행을 시켜주면 안됨. 
()하면 렌더링 될 때 호출되기 때문임. 함수를 넣어주는거지 여기서 호출해주는게 아님. </p>
<h3 id="component에-동적인-상태-넣어주기">Component에 동적인 상태 넣어주기.</h3>
<pre><code>import React, { useState } from &#39;react&#39;;

function Counter(){
    //useState라는 상태를 만들건데, 상태의 기본값은0으로 하겠다.
    //setNumber는 이 상태를 바꾸어주는 함수. 
    //배열 비구조 할당, 구조 분해 통해서 작성함. 
    //useState가 호출 될 때 배열 반환. 첫번째 원소를 number로 추출.

    const [number,setNumber] = useState(0);

    const onIncrease = ()=&gt;{
        setNumber(number + 1)
    }
    const onDecrease = ()=&gt;{
        setNumber(number - 1)
    }
    return(
        &lt;div&gt;
            &lt;h1&gt;{number}&lt;/h1&gt;
            &lt;button onClick={onIncrease}&gt;+1&lt;/button&gt;
            &lt;button onClick={onDecrease}&gt;-1&lt;/button&gt;
        &lt;/div&gt;
    );
}

export default Counter;</code></pre><h3 id="요약">요약</h3>
<ol>
<li>useState를 사용해서 바뀌는 값을 사용할 수 있고, 값의 기본값은 파라미터로 넘겨주면 된다. useState(0)이렇게. 이러면 0 이 기본값. </li>
<li>useState 는 배열을 반환하는데, 첫번째는 현재상태, 두번째는 이 상태를 바꾸는 함수. 이 함수에 새로운 상태를 넣어서 호출해주면 값이 바뀌는거다.</li>
</ol>
<h3 id="usestate할-때는-함수형-업데이트">useState할 때는 함수형 업데이트</h3>
<p>setNumber(다음 업데이트 하고싶은 값) 이렇게 했었는데, 이 값을 어떻게 할지에 대한 로직을 정의하는 함수를 넣어줄 수도 있음. </p>
<pre><code>const onIncrease = ()=&gt;{
        setNumber(prevNumber =&gt; prevNumber + 1)
    }</code></pre><p>값을 어떻게 할것이다. 라는 로직이 있는 함수를 넣어줄 수도 있음. 
이걸 업데이트 함수라고 함. 
리엑트 컴포넌트를 최적화 할 때 이런 함수형 업데이트를 하는 것이 필요하다. </p>
<pre><code>import React, { useState } from &#39;react&#39;;

function Counter(){
    //useState라는 상태를 만들건데, 상태의 기본값은0으로 하겠다.
    //setNumber는 이 상태를 바꾸어주는 함수. 
    //배열 비구조 할당, 구조 분해 통해서 작성함. 
    //useState가 호출 될 때 배열 반환. 첫번째 원소를 number로 추출.

    const [number,setNumber] = useState(0);

    const onIncrease = ()=&gt;{
        setNumber(prevNumber =&gt; prevNumber + 1)
    }
    const onDecrease = ()=&gt;{
        setNumber(prevNumber =&gt; prevNumber - 1)
    }
    return(
        &lt;div&gt;
            &lt;h1&gt;{number}&lt;/h1&gt;
            &lt;button onClick={onIncrease}&gt;+1&lt;/button&gt;
            &lt;button onClick={onDecrease}&gt;-1&lt;/button&gt;
        &lt;/div&gt;
    );
}

export default Counter;</code></pre><p>최적화와 관련이 있다. </p>
<h3 id="정리">정리</h3>
<p>setNumber는 두가지 용도가 있는데, 
그 다음 상태를 넣어줄 수도 있고
이 로직으로 업데이트 할거야. 하고 함수를 넣어줄 수도 있다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] 조건부 렌더링]]></title>
            <link>https://velog.io/@jeongyeon-park/React-%EC%A1%B0%EA%B1%B4%EB%B6%80-%EB%A0%8C%EB%8D%94%EB%A7%81</link>
            <guid>https://velog.io/@jeongyeon-park/React-%EC%A1%B0%EA%B1%B4%EB%B6%80-%EB%A0%8C%EB%8D%94%EB%A7%81</guid>
            <pubDate>Fri, 25 Jun 2021 06:00:34 GMT</pubDate>
            <description><![CDATA[<h3 id="조건부-렌더링이란">조건부 렌더링이란?</h3>
<p> 특정 조건이 참인지 거짓인지에 따라서 다른 결과를 보여주는것.</p>
<p> Hello 컴포넌트 내부에서 조건부 랜더링. </p>
<pre><code> function Hello({color, name, isSpecial}){
    return (
        &lt;div style={{
            color
        }}&gt;
            {isSpecial ? &lt;b&gt;*&lt;/b&gt; : null}
            안녕하세요 {name}
        &lt;/div&gt;
    );  
}</code></pre><p>삼항연산자 사용하여 true일때, false일때 다른 결과물 보여주기</p>
<pre><code>function Hello({color, name, isSpecial}){
    return (
        &lt;div style={{
            color
        }}&gt;
            {isSpecial &amp;&amp; &lt;b&gt;*&lt;/b&gt;}
            안녕하세요 {name}
        &lt;/div&gt;
    );  
}</code></pre><p>&amp;&amp;사용하여 true일때만 별표 표시 나타나게도 해줄 수 있음. </p>
<pre><code>function Hello({color, name, isSpecial}){
    return (
        &lt;div style={{
            color
        }}&gt;
            &lt;b&gt;{isSpecial ? &#39;스페셜!&#39;:&#39;낫스페셜&#39;}&lt;/b&gt;
            안녕하세요 {name}
        &lt;/div&gt;
    );  
}</code></pre><p>이렇게 true, false에 따라 값이 다를 때 말고는 &amp;&amp;연산자 사용하여 나타내는게 더 깔끔함</p>
<pre><code>function App() {

  return (

    //Hello Component
    //props를 전달하는 과정 
    // 태그가 두개 이상이므로 fragment로 감싸주기.
    &lt;Wrapper&gt;
      {/* true는 js 값이므로 {}로 감싸준다. */}
      &lt;Hello name=&quot;react&quot; color=&quot;red&quot; isSpecial/&gt;
      &lt;Hello  color=&quot;pink&quot;/&gt;
    &lt;/Wrapper&gt;
  )
}</code></pre><p>isSpecial = {true}
없이 그냥 isSpecial하면 true가 된다. 
boolean 사용할 때 참조하기 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] props를 통해 컴포넌트에게 값 전달하기]]></title>
            <link>https://velog.io/@jeongyeon-park/React-props%EB%A5%BC-%ED%86%B5%ED%95%B4-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EC%97%90%EA%B2%8C-%EA%B0%92-%EC%A0%84%EB%8B%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@jeongyeon-park/React-props%EB%A5%BC-%ED%86%B5%ED%95%B4-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EC%97%90%EA%B2%8C-%EA%B0%92-%EC%A0%84%EB%8B%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 25 Jun 2021 05:43:13 GMT</pubDate>
            <description><![CDATA[<h3 id="props-란">props 란?</h3>
<p>props = properties</p>
<p>컴포넌트 사용할 때 특정 값 전달 해 주고 싶을때 사용한다. </p>
<p>Hello Component에 name이라는 값을 전달 해 주고 싶다면?</p>
<p>props에는 우리가 넣어 준 값들이 객체 형태로 들어 가 있다. </p>
<p>App.js에서</p>
<pre><code>function App() {

  return (
    //Hello Component
    &lt;Hello name=&quot;react&quot;/&gt;
  )
}</code></pre><p>Hello.js는 이렇고 </p>
<pre><code>function Hello(props){
    console.log(props);
    return &lt;div&gt;안녕하세요&lt;/div&gt;;
}

// Hello 라는 component를 return 해 주겠다. 
// </code></pre><p>props에는 우리가 넣어 준 값들이 객체 형태로 들어 가 있기 때문에 
name = &quot;react&quot; 가 console창에 나타난다. </p>
<p><img src="https://images.velog.io/images/jeongyeon-park/post/b5eebf34-180c-4418-bff2-ae93fd4a4915/image.png" alt=""></p>
<p>js 의 변수를 사용 해 주고 싶으면 {} 괄호로 감싸주고
props.name 이렇게 해서 props 객체 안의 값 사용한다. </p>
<pre><code>import React from &#39;react&#39;;


function Hello(props){
    console.log(props);
    return &lt;div style={{
        color:props.color
    }}&gt;안녕하세요{props.name}&lt;/div&gt;;
}

// Hello 라는 component를 return 해 주겠다. 
// 
export default Hello;
</code></pre><p>props를 구조 분해 해서 color랑 name값을 미리 추출 해 줄 수 있다. </p>
<pre><code>function Hello({color, name}){
    return &lt;div style={{
        color:color
    }}&gt;안녕하세요{name}&lt;/div&gt;;
}</code></pre><pre><code>function Hello({color, name}){
    return &lt;div style={{
        color
    }}&gt;안녕하세요{name}&lt;/div&gt;;
}</code></pre><p>color:color 에서 :color 생략 가능</p>
<h3 id="default-props">Default Props</h3>
<ul>
<li>props설정하지 않았을때 기본적으로 설정하고 싶은값 어떻게 하면 좋을지</li>
</ul>
<pre><code>function Hello({color, name}){
    return &lt;div style={{
        color
    }}&gt;안녕하세요{name}&lt;/div&gt;;
}


//props가 지정되지 않았을때 기본값을 설정 해주고 싶다면?
Hello.defaultProps = {
    name: &#39;이름없음&#39;
};</code></pre><p>이게 바로 default props다. </p>
<h3 id="props-children">Props Children</h3>
<pre><code>//이 방법으로도 불러 올 수 있고 
import Wrapper from &#39;./Wrapper&#39;

//&lt;Wrapper&gt; 해 주면 자동으로 import 된다. 
&lt;Wrapper&gt;
      &lt;Hello name=&quot;react&quot; color=&quot;red&quot;/&gt;
      &lt;Hello  color=&quot;pink&quot;/&gt;
&lt;/Wrapper&gt;</code></pre><p><img src="https://images.velog.io/images/jeongyeon-park/post/93326fc8-2d61-4024-a986-d5d5a6b72ec2/image.png" alt=""></p>
<p>Wrapper Component로 감싸 주니까 Wrapper 컴포넌트에 가려서 Hello들이 나오지 않는데
Wrapper안에 Hello를 표현 해주고 싶을때 사용하는게 Props Children이다.</p>
<p><img src="https://images.velog.io/images/jeongyeon-park/post/845f0729-26e5-4021-8642-24ad231c77dc/image.png" alt=""></p>
<p>Wrapper에게 있어서는 children이라는 props가 자식 Component를 받아 온 것이다. 
name, color가 props고 이 값을 파라미터를 이용하여 받아올 수 있고 기본값 설정하기 위해서는 defaultprops를 사용하면 된다.. </p>
<p>태그와 태그 사이에 넣는 내용을 의미 하는게 children이다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] JSX 기본 문법 익히기]]></title>
            <link>https://velog.io/@jeongyeon-park/React-JSX-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95-%EC%9D%B5%ED%9E%88%EA%B8%B0</link>
            <guid>https://velog.io/@jeongyeon-park/React-JSX-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95-%EC%9D%B5%ED%9E%88%EA%B8%B0</guid>
            <pubDate>Tue, 22 Jun 2021 06:39:39 GMT</pubDate>
            <description><![CDATA[<ul>
<li>리액트 실행법
git bash에서 리액트 디렉토리로 들어가서 yarn start 입력합니다.
git bash에서 (master)가 뜬다면요.</li>
</ul>
<pre><code>cd react-tutorial
cd begin-react
yarn start </code></pre><ol>
<li>주의할 점</li>
</ol>
<ul>
<li><p>태그는 꼭 닫혀 있어야한다. </p>
<pre><code>&lt;input&gt;이나 &lt;br&gt;같은거도 꼭 닫아줘야함. </code></pre><pre><code>&lt;input /&gt; 이렇게 하거나
&lt;br /&gt; 이렇게 하거나
&lt;input&gt;&lt;/input&gt;
&lt;br&gt;&lt;/br&gt;이렇게 </code></pre></li>
<li><p>두개이상의 태그는 무조건 하나의 태그로 감싸져 있어야한다. 
<img src="https://images.velog.io/images/jeongyeon-park/post/ffa36a69-828f-45da-9e1b-384add574ab4/image.png" alt=""></p>
</li>
</ul>
<p><img src="https://images.velog.io/images/jeongyeon-park/post/18210d1a-b7a3-4acd-b95c-e3136ece08c1/image.png" alt=""></p>
<p>빈 이름으로 감싸 준다.
컴퓨넌트를 보면 괄호()로 감싸 져 있는데 이건 부가적인거. 
지금은 단순히 코드의 가독성을 위하여 사용되었다. </p>
<p>한줄 짜리는 괄호 없이도 작성 가능하다. </p>
<ol start="2">
<li>JSX내부에서 js값 사용하는 방법
const name = &#39;react&#39;;</li>
</ol>
<p><img src="https://images.velog.io/images/jeongyeon-park/post/dc3c6535-297f-4e72-bfd8-8affe4a8bd20/image.png" alt=""></p>
<p>이렇게 하면 그냥 name이 출력됨.
<img src="https://images.velog.io/images/jeongyeon-park/post/5e6ebf31-0fa5-4d99-9975-fb40c37c4811/image.png" alt=""></p>
<p>name 변수를 사용하고 싶으면 {} 괄호로 감싸주면 된다.</p>
<ol start="3">
<li>style과 classname 작성하는 방법 
const style = {
 backgroundColor: &#39;black&#39;,
 color: &#39;aqua&#39;,
 fontSize: 24,
 padding: &#39;1rem&#39;
};</li>
</ol>
<p><img src="https://images.velog.io/images/jeongyeon-park/post/d83ecb19-2ec7-4225-9781-c2bba3e16d86/image.png" alt=""></p>
<p>style을 저렇게 작성하고, </p>
<pre><code>&lt;div style ={style}&gt;{name}&lt;/div&gt;</code></pre><p>이렇게 해 주기
css를 적용 해 주고 싶다면 </p>
<pre><code>import React from &#39;react&#39;;
import Hello from &#39;./Hello&#39;
import &#39;./App.css&#39;;

function App() {
  const name = &#39;너무너무 힘들어요&#39;
  const style = {
    backgroundColor: &#39;black&#39;,
    color: &#39;aqua&#39;,
    fontSize: 24,
    padding: &#39;1rem&#39;
  };
  return (
    &lt;&gt;
      &lt;Hello /&gt;
      &lt;div style={style}&gt;{name}&lt;/div&gt;
      &lt;div className=&quot;gray-box&quot;&gt;&lt;/div&gt;
    &lt;/&gt;
  )
}

export default App;
</code></pre><p>App.css는 이렇게 되어있음</p>
<pre><code>.gray-box {
  background: gray;
  width: 64px;
  height: 64px;
}</code></pre><p>import &#39;./App.css&#39; 해 주고 
div에 className=&quot;gray-box&quot; 해 주면 적용 된다. </p>
<ol start="4">
<li>주석은 어떻게 적나?
<img src="https://images.velog.io/images/jeongyeon-park/post/1f06e3a9-0170-44ec-9969-cabc1ff222df/image.png" alt=""></li>
</ol>
<p>{/**/로 감싸 주고} 괄호로 묶어주기. </p>
<p><img src="https://images.velog.io/images/jeongyeon-park/post/97c62254-0cd1-4fc2-a637-75fec9498dd3/image.png" alt=""></p>
<p>태그 안에서의 주석은 //로도 가능 </p>
<ol start="5">
<li>정리</li>
</ol>
<ul>
<li>태그는 꼭 닫혀있어야한다. </li>
<li><img src="https://images.velog.io/images/jeongyeon-park/post/77ef6adb-0f5e-452e-a8ee-1a6605350955/image.png" alt=""></li>
<li><img src="https://images.velog.io/images/jeongyeon-park/post/c9bb0ee5-e931-4677-a940-4fea5a88cf3c/image.png" alt=""></li>
<li>style 사용하고 싶으면 객체 형태로 넣어주어야 한다. </li>
<li><img src="https://images.velog.io/images/jeongyeon-park/post/9868a522-d06b-4b19-bf09-a5406329a690/image.png" alt=""></li>
<li>css class를 사용할 때도 className = &quot;gray-box&quot; 이렇게. </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 알고리즘 10809번 알파벳 찾기 파이썬]]></title>
            <link>https://velog.io/@jeongyeon-park/%EB%B0%B1%EC%A4%80-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-10809%EB%B2%88-%EC%95%8C%ED%8C%8C%EB%B2%B3-%EC%B0%BE%EA%B8%B0-%ED%8C%8C%EC%9D%B4%EC%8D%AC</link>
            <guid>https://velog.io/@jeongyeon-park/%EB%B0%B1%EC%A4%80-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-10809%EB%B2%88-%EC%95%8C%ED%8C%8C%EB%B2%B3-%EC%B0%BE%EA%B8%B0-%ED%8C%8C%EC%9D%B4%EC%8D%AC</guid>
            <pubDate>Sat, 19 Jun 2021 03:06:36 GMT</pubDate>
            <description><![CDATA[<p>단계별로 풀기 &gt; 문자열 에 해당하는 문제이다.
<img src="https://images.velog.io/images/jeongyeon-park/post/0429657e-f438-4ed0-8ea4-997b1f829eb7/image.png" alt="">
<img src="https://images.velog.io/images/jeongyeon-park/post/1f90cb6f-5446-42de-b281-d130a34fd4dd/image.png" alt=""></p>
<p>이 문제에서 기억 해 둘 것 세 가지를 기록하려 한다. </p>
<ol>
<li>파이썬에서는 미리 등록 된 알파벳 상수를 제공한다. (import string)</li>
<li>리스트 연산 정리</li>
<li>join 함수와 map 함수 이용법</li>
</ol>
<h3 id="1-파이썬에서는-미리-등록-된-알파벳-상수를-제공한다-import-string">1. 파이썬에서는 미리 등록 된 알파벳 상수를 제공한다. (import string)</h3>
<p><img src="https://images.velog.io/images/jeongyeon-park/post/ff967ca5-9fcc-47fd-adc1-fcb2382c4e2f/image.png" alt=""></p>
<p>ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
일단 알파벳 하나하나 alpa 배열에 다 넣었었다.. ㅋ
import string
string.ascii_lowercase 
하면 소문자 전체 string을 불러올 수 있다. 이 string을 잘라서 alpa list에 넣었다. </p>
<p>출처&amp;더 많은 정보 :
<a href="https://programmers.co.kr/learn/courses/4008/lessons/12729">https://programmers.co.kr/learn/courses/4008/lessons/12729</a></p>
<h3 id="2-리스트-연산-정리">2. 리스트 연산 정리</h3>
<p>직접 써 보기 전엔 내 것이 아니라는게 뼈저리게 느껴졌다. 
이렇게 좋은 기능이 있는데 사용하자 ~</p>
<ul>
<li>del mylist[2] : 인덱스 2에 있는 요소를 삭제한다.</li>
<li>&quot;value&quot; in mylist : &quot;value&quot;가 mylist에 있으면 True</li>
<li>&quot;value&quot; not in mylist : &quot;value&quot;가 mylist에 없으면 True</li>
<li>mylist.index(&quot;value&quot;) : &quot;value&quot;가 발견된 위치를 반환한다.</li>
<li>mylist.remove(&quot;value&quot;) : &quot;value&quot;가 나타나는 위치 찾아서 삭제</li>
</ul>
<p>🙋‍♀️ 이 문제를 &quot;value&quot; in mylist, mylist.index(&quot;value&quot;)를 사용해서 쉽게 해결 할 수 있었다.</p>
<h3 id="3-join-함수와-map-함수-이용법">3. join 함수와 map 함수 이용법</h3>
<p>join과 map은 js에서도 있었으니 정리 해 두면 공부 할 때 훨씬 좋겠지..
join은 list를 string으로 합쳐주는 함수다. 
백준 제출을 위해서 list에 담았던 숫자들을 한 줄로 출력하고 싶었는데
그러기 위해서 join을 찾아 봤었다. </p>
<pre><code>&#39;구분자&#39;.join(리스트 이름)</code></pre><p>join 은 구분자를 기준으로 구분 된 string을 생성 해 준다. 
이렇게 사용하라고 했는데 int로 이루어진 list를 바로 join할 수 없었다. 
join은 string이 담긴 list만 바로 string으로 만들어 줄 수 있다.
그래서 map을 이용하여 일차적으로 int 요소를 str로 변환하고, join하여 한 줄로 합쳤다.</p>
<pre><code>map(int, a)</code></pre><pre><code>s = &#39; &#39;.join(map(str,array_string))</code></pre><h3 id="4-해결-코드">4. 해결 코드</h3>
<pre><code>import string
s = string.ascii_lowercase

alpa =[]
for i in s:
    alpa.append(i)

check_string = input()
array_string = []

for i in alpa:
    if i in check_string:
        array_string.append(check_string.index(i))
    else:
        array_string.append(-1)

print(&quot; &quot;.join(map(str, array_string)))</code></pre><h3 id="5-문제-푼-후-느낀점">5. 문제 푼 후 느낀점</h3>
<p>기초가 정말 중요하다.. 쉽다고 무시하지 말자.. 쉬운게 아니라 내 머리에 안들어온거다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[우당탕탕 git 오류 해결 일지 : branch 병합하기]]></title>
            <link>https://velog.io/@jeongyeon-park/%EC%9A%B0%EB%8B%B9%ED%83%95%ED%83%95-git-%EC%98%A4%EB%A5%98-%ED%95%B4%EA%B2%B0-%EC%9D%BC%EC%A7%80</link>
            <guid>https://velog.io/@jeongyeon-park/%EC%9A%B0%EB%8B%B9%ED%83%95%ED%83%95-git-%EC%98%A4%EB%A5%98-%ED%95%B4%EA%B2%B0-%EC%9D%BC%EC%A7%80</guid>
            <pubDate>Sun, 30 May 2021 05:43:17 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>git은 문제가 없다.. 내가 문제다</p>
</blockquote>
<p>내 로컬 저장소에 
master branch가 있고, jeongyeon-park브랜치가 있다. 
master branch에서 코드 작업을 하고 </p>
<pre><code>git push origin jeongyeon-park</code></pre><p>하려고 했는데 </p>
<p>🎁 오류 
updates were rejected because a pushed branch tip is behind its remote hint: counterpart. check out this branch and integrate the remote changes hint: (e.g. &#39;git pull ...&#39;) before pushing again. hint: see the &#39;note about fast-forwards&#39; in &#39;git push --help&#39; for details.</p>
<p>🎀오류
pulling is not possible because you have unmerged files. hint: fix them up in the work tree, and then use &#39;git add/rm <file>&#39; hint: as appropriate to mark resolution and make a commit. fatal: exiting because of an unresolved conflict</p>
<p>이런 오류가 났다. 
git 공부가 덜 된 상태에서 계속 push만 하려니 늘 할 때마다 다시 공부하고 또 다시 하고.. 
무한 반복이라 글을 쓰게 되었다. </p>
<pre><code>git checkout jeongyeon-park </code></pre><p>해서 브랜치 변경 한 후에는 git push 가 잘만 됐다. 
master 브랜치에서 push가 안되구나. 
내가 remote할 때 어떻게 했더라 .. 
하고 기록 안 해 둔걸 후회했다.</p>
<p>앞으로 무조건!
git 쓸 때는 하나하나 다 기록 할거다.. </p>
<p>아무튼 나는 master 브랜치에서 이미 작업을 해 버렸고, 
나는 jeongyeon-park 원격 브랜치에 로컬 master 브랜치에서 작업 한 걸 올리고 싶은 상태고, 
원격 jeongyeon-park에 올리려면, 로컬 jeongyeon-park에서 작업을 했었어야 한다. 
그래서 master 브랜치의 변경 사항을 jeongyeon-park에 병합해 보려 한다. </p>
<p><a href="https://backlog.com/git-tutorial/kr/stepup/stepup2_4.html">https://backlog.com/git-tutorial/kr/stepup/stepup2_4.html</a></p>
<p>위 게시글을 참조 했다. </p>
<h3 id="master-브랜치의-변경-사항을-jeongyeon-park에-병합하기">master 브랜치의 변경 사항을 jeongyeon-park에 병합하기</h3>
<ol>
<li>git checkout jeongyeon-park</li>
</ol>
<p>병합 할 곳에 checkout</p>
<ol start="2">
<li>git merge master</li>
</ol>
<p>했을 때
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
라는 오류가 떴는데, README.md에 auto-merging 문제가 있다는 말 이라서 README.md가서 수정 해 줌. 
고쳐 준 후 다시 git merge master</p>
<ol start="3">
<li>병합 완료 !
commit까지 모두 merge되는 것 같음. 
push 성공!
<img src="https://images.velog.io/images/jeongyeon-park/post/b25e3c1c-1071-430b-8214-490059b6b520/image.png" alt=""></li>
</ol>
<p>（づ￣3￣）づ╭❤～</p>
<h3 id="알게-된-점">알게 된 점</h3>
<ul>
<li>git merge branch_name  으로 branch를 병합할 수 있다. </li>
<li>merging이 덜 됐을 때 conflict 난 부분 수정하고 add,commit, push 해 주면 master|MERGING이라고 떠 있는 부분 해결 된다. </li>
<li>jeongyeon-park 브랜치에 push하고 싶을 떄 로컬 jeongyeon-park에서 작업하자. </li>
</ul>
<h3 id="느낀점">느낀점</h3>
<p>  나는 여전히 깃이 무섭다..
  이것때문에 2시간정도를 삽질 했는데 2시간 삽질하고 branch 병합하는거 배운거면 나쁘지 않은듯!
  GIT이 무섭지 않을 때  까지 열공하기 !! </p>
]]></description>
        </item>
    </channel>
</rss>