<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>yhy21.log</title>
        <link>https://velog.io/</link>
        <description>장미꽃 한송이 놓고갑니다 @----&gt;--&gt;-------</description>
        <lastBuildDate>Thu, 02 Dec 2021 05:03:39 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>yhy21.log</title>
            <url>https://velog.velcdn.com/images/dbsgml_doit26/profile/37dbed03-a723-4317-b61b-bc861c10a354/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. yhy21.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dbsgml_doit26" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[리디셀렉트 vs 밀리의 서재 후기 ]]></title>
            <link>https://velog.io/@dbsgml_doit26/%EB%A6%AC%EB%94%94%EC%85%80%EB%A0%89%ED%8A%B8-vs-%EB%B0%80%EB%A6%AC%EC%9D%98-%EC%84%9C%EC%9E%AC-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@dbsgml_doit26/%EB%A6%AC%EB%94%94%EC%85%80%EB%A0%89%ED%8A%B8-vs-%EB%B0%80%EB%A6%AC%EC%9D%98-%EC%84%9C%EC%9E%AC-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Thu, 02 Dec 2021 05:03:39 GMT</pubDate>
            <description><![CDATA[<p>일단 제일 중요한 가격 (2021년 12월 2일 시점)
리디셀렉트 : 4900원 
밀리의 서재 : 9900원 </p>
<p>두 개의 서비스를 계속 이용하다가 어제 리디셀렉트를 해지했습니다.
일단 써보면서 느꼈던 주관적인 장단점을 설명해보겠습니다!</p>
<h2 id="리디셀렉트">리디셀렉트</h2>
<ul>
<li><p>장점 </p>
<ul>
<li>직관적인 UI 화면 (인기 도서와 주제별 책을 한 페이지에서 깔끔하게 보여준다)
<img src="https://images.velog.io/images/dbsgml_doit26/post/a2b091cf-cda4-4cba-b963-4025629c610f/image.png" alt=""></li>
</ul>
</li>
</ul>
<ul>
<li><p>단점</p>
<ul>
<li>책의 종류가 생각보다 적다 </li>
</ul>
</li>
</ul>
<h2 id="밀리의-서재">밀리의 서재</h2>
<ul>
<li><p>장점 </p>
<ul>
<li>책의 가짓수가 더 다양하고 많다 </li>
<li>오디오북이 있다! </li>
</ul>
</li>
<li><p>단점 </p>
<ul>
<li>너무 잦은 업데이트 </li>
<li>너무 많은 기능때문에 어지러운 UI</li>
<li>복잡한 로직</li>
</ul>
</li>
</ul>
<h2 id="해지한-이유">해지한 이유?</h2>
<ul>
<li><p>밀리의 서재 단점을 더 많이 적었음에도 리디 셀렉트를 해지한 이유는 </p>
<ul>
<li>리디셀렉트는 내가 느끼기에 책의 가짓수가 적고 오디오북이 없었기 때문이다.</li>
<li>밀리의 서재 단점으로 너무 많은 기능과 수시의 업데이트를 적긴 했지만 그만큼 사용자를 신경쓴다는 느낌을 받았다.</li>
</ul>
</li>
</ul>
<h2 id="잡담">잡담</h2>
<p>개발자를 준비하고 있기에 두 가지의 서비스다 정말 잘 이용했고 클론코딩해보고 싶다. 개인적으로 개발 관련 서적이 밀리의 서재에 좀 더 많았기에 자주 사용했다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] Todolist 클론코딩 ➀ 기능 구현]]></title>
            <link>https://velog.io/@dbsgml_doit26/React-Todolist-%ED%81%B4%EB%A1%A0%EC%BD%94%EB%94%A9-%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84</link>
            <guid>https://velog.io/@dbsgml_doit26/React-Todolist-%ED%81%B4%EB%A1%A0%EC%BD%94%EB%94%A9-%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84</guid>
            <pubDate>Wed, 20 Oct 2021 06:52:52 GMT</pubDate>
            <description><![CDATA[<h2 id="📒-intro">📒 Intro</h2>
<ol>
<li>velopert님의 <a href="https://react.vlpt.us/mashup-todolist/01-create-components.html">Todolist</a> UI만을 보고 구현</li>
<li>내가 짠 거랑 velopert님 꺼랑 소스코드 비교  </li>
</ol>
<h3 id="📌-기본-동작-원리">📌 기본 동작 원리</h3>
<p>무지성으로 컴포넌트 두개...
<img src="https://images.velog.io/images/dbsgml_doit26/post/7df6278c-7546-41ee-9e72-294fd23da6f4/image.png" alt=""></p>
<h3 id="📌-오늘-날짜-들고-오기">📌 오늘 날짜 들고 오기</h3>
<pre><code class="language-js">let today = new Date(); 
  let year = today.getFullYear();
  let month = today.getMonth() + 1;
  let date = today.getDate();
  let day = today.getDay();
  const weekday = [&#39;일&#39;,&#39;월&#39;,&#39;화&#39;,&#39;수&#39;,&#39;목&#39;,&#39;금&#39;,&#39;토&#39;];
  return (
    &lt;div&gt;
        &lt;h1&gt;{year}년 {month}월 {date}일&lt;/h1&gt;
        &lt;h2&gt;{weekday[day]}요일&lt;/h2&gt;
    &lt;/div&gt;
);</code></pre>
<h3 id="📌-crud-기능-추가">📌 CRUD 기능 추가</h3>
<p>CREATE, DELETE 만 있어서 두 개만 구현함.</p>
<ul>
<li>CREATE
Enter -&gt; 입력 -&gt; input 창 초기화(오류)</li>
</ul>
<pre><code class="language-js">const onCreate = (e) =&gt; {
    var newTodos= [...todos];
    newTodos.push({ text:e.target.value, active:false});
    if(e.key==&#39;Enter&#39;){
      setTodos(newTodos);    
      // setInputValue(&#39;&#39;); (오류) 첫 입력후 inputValue값이 null로 고정됨      
    }   
  } </code></pre>
<ul>
<li>Delete 
button Click event -&gt; 삭제 <pre><code class="language-js">const onRemove = (e) =&gt; {
  setTodos(todos.filter(todo =&gt; todos.indexOf(todo) !== Number(e.target.id)));    
}
</code></pre>
</li>
</ul>
<pre><code>### 📌 남은 할 일 보여주기
```js
const undoneTasks= useMemo(() =&gt; {
    return todos.filter((todo) =&gt; !todo.done).length
  },[todos]);</code></pre><h3 id="📌-마주친-오류들">📌 마주친 오류들</h3>
<ul>
<li><p><code>TypeError : items.map is not a function.</code></p>
<ul>
<li>오브젝트는 map()함수를 가지고있지 않아 사용할 수가 없다. 배열만 가능하다.</li>
<li>원인 : <code>newItems += e.target.value;</code></li>
<li>해결 : <code>newItems.push(e.target.value);</code></li>
<li>이상한 점 : <code>setItems(prev =&gt; [...prev+e.target.value])</code> 하면 글자 하나씩 배열에 들어감 </li>
<li>[참고] (<a href="https://www.techiediaries.com/react-usestate-hook-update-array/">https://www.techiediaries.com/react-usestate-hook-update-array/</a>)</li>
</ul>
</li>
<li><p><code>JSX expressions must have one parent element</code> </p>
<ul>
<li>원인 : 여러 개 요소를 <div></div>나 fragement로 감싸지 않음 </li>
<li>이유 : 여러개의 요소를 하나의 요소로 감싸주는 이유는 컴포넌트 내부는 하나의 DOM 트리 구조로 이루어져야 하는 규칙이 있기 때문이다.</li>
<li>[참고] (<a href="https://dlthdud091.tistory.com/34">https://dlthdud091.tistory.com/34</a>)</li>
</ul>
</li>
</ul>
<ul>
<li><p>filter -&gt; button의 key를 item의 index로 할당해서 나중에 key랑 item의 index를 비교해서 삭제할려고 했는데 안됨.</p>
<ul>
<li><p>원인 : 
<code>typeof(e.target.id) = string 
typeof(items.indexOf(item)) = number</code> </p>
</li>
<li><p>해결 : <code>items.indexOf(item) !== Number(e.target.id)</code> </p>
<ul>
<li>li태그를 checkbox type인 input으로 바꾸고 li 내용을 value로 넣으니까 화면상에 아무것도 보이지 않음 </li>
</ul>
</li>
<li><p>코드 : <code>&lt;input value={item} type=&quot;checkbox&quot; key={index} /&gt;</code></p>
</li>
<li><p>해결 : </p>
<pre><code class="language-js">&lt;input id={index} type=&quot;checkbox&quot; /&gt;
&lt;li type=&quot;checkbox&quot; key={index} style={{display:&quot;inline-block&quot;}} &gt;{item}&lt;/li&gt;</code></pre>
</li>
<li><p>[참고] (<a href="https://egg-programmer.tistory.com/282">https://egg-programmer.tistory.com/282</a>)</p>
<ul>
<li><p><code>Objects are not valid as a React child 에러 처리</code></p>
</li>
<li><p>원인 : source data인 Followings가 데이터타입이 array인데, 각 요소(여기서는 <code>item</code>, 데이터 타입은 <code>Object</code>)객체를 그대로 렌더링 하려고 했기 때문에 에러가 발생하였다.
즉, <strong><code>Object</code>데이터를 그대로 렌더링 하려고 했기 때문에 에러가 발생한 것이다.</strong></p>
</li>
</ul>
</li>
<li><p>[참고] (<a href="https://velog.io/@bigbrothershin/React-Objects-are-not-valid-as-a-React-child-%EC%97%90%EB%9F%AC-%EC%B2%98%EB%A6%AC">https://velog.io/@bigbrothershin/React-Objects-are-not-valid-as-a-React-child-%EC%97%90%EB%9F%AC-%EC%B2%98%EB%A6%AC</a>)</p>
<ul>
<li><code>input</code> 에 <code>type=&quot;checkbox&quot; value={items[index].text}</code>했는데 화면에 value값 표현되지 않음</li>
</ul>
</li>
<li><p>원인 : ?</p>
</li>
</ul>
</li>
</ul>
<h3 id="📌-원본에-없는-기능-추가-추후-구현">📌 원본에 없는 기능 추가 (추후 구현)</h3>
<ul>
<li>예외처리 : input값이 비어있으면 입력되게 하지 않기</li>
<li>Update랑 Read 기능 추가 </li>
</ul>
]]></description>
        </item>
    </channel>
</rss>