<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>희락코딩</title>
    <link>https://joy-codeing-lee.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sun, 26 Jul 2026 00:23:30 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Hello JoyCoding</managingEditor>
    <image>
      <title>희락코딩</title>
      <url>https://tistory1.daumcdn.net/tistory/4668331/attach/7353eda26a544b62a6a369c436c2c392</url>
      <link>https://joy-codeing-lee.tistory.com</link>
    </image>
    <item>
      <title>return의 용도</title>
      <link>https://joy-codeing-lee.tistory.com/175</link>
      <description>&lt;h2&gt;return용도&lt;/h2&gt;
&lt;p&gt;함수에서 return 명령문에 도달하면 함수의 실행은 그 지점에서 중단되고, 값을 제공한 경우는 함수를 호출한 곳에 그 값을 반환합니다. 이때 값을 명시하지 않으면 undefined를 반환합니다. 아래와 같은 명령문은 모두 함수 실행을 중단합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;return;
return true;
return false;
return a+b /3;
return x;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;return;&lt;/code&gt;만 있는 경우는 아래 예시처럼 사용 할 수 있습니다. if문의 조건이 충족하는 경우 해당 함수를 실행을 중단하고 함수 자체에서 빠져나가는 것을 의미합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function () {
    if(num === 0){
        return;  // 위의 조건을 만족하면 해당 함수를 중단
    }
    //...샬라샬라~
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>프로그래밍/잡다한 Err Log 및 잡지식</category>
      <author>Hello JoyCoding</author>
      <guid isPermaLink="true">https://joy-codeing-lee.tistory.com/175</guid>
      <comments>https://joy-codeing-lee.tistory.com/175#entry175comment</comments>
      <pubDate>Sat, 12 Feb 2022 03:01:47 +0900</pubDate>
    </item>
    <item>
      <title>Parsing error : Cannot find module 'next/babel'</title>
      <link>https://joy-codeing-lee.tistory.com/173</link>
      <description>&lt;h2&gt;Parsing error : Cannot find module &amp;#39;next/babel&amp;#39;&lt;/h2&gt;
&lt;p&gt;next.js를 처음 접한 사람이라면 누구나 공감하는 에러인 것 같다. 코드를 작성하다 갑자기 vs코드 파일창이 빨간색으로 오류가 있는것마냥 표시가 되어 있을 것이다... 하지만 브라우저에서는 아무 문제 없이 잘 된다... 그래도 보기 싫어서 찾아 보았다&lt;/p&gt;
&lt;p&gt;해결방법은 간단하다.  &lt;code&gt;.eslintrc&lt;/code&gt; 파일에 가서 아래 코드를 추가 하였다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;{
  &amp;quot;extends&amp;quot;: [&amp;quot;next/babel&amp;quot;,&amp;quot;next/core-web-vitals&amp;quot;]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/68163385/parsing-error-cannot-find-module-next-babel&quot;&gt;참고 자료&lt;/a&gt;&lt;/p&gt;</description>
      <category>프로그래밍/잡다한 Err Log 및 잡지식</category>
      <author>Hello JoyCoding</author>
      <guid isPermaLink="true">https://joy-codeing-lee.tistory.com/173</guid>
      <comments>https://joy-codeing-lee.tistory.com/173#entry173comment</comments>
      <pubDate>Tue, 1 Feb 2022 01:48:51 +0900</pubDate>
    </item>
    <item>
      <title>npm ERR! code ERESOLVE</title>
      <link>https://joy-codeing-lee.tistory.com/172</link>
      <description>&lt;h2&gt;npm ERR! code ERESOLVE&lt;/h2&gt;
&lt;p&gt;라이브러리 설치 도중 &lt;code&gt;unable to resolve dependency tree&lt;/code&gt; 문구와 함께 에러가 발생했따.. 원인은 버전 문제였고 간단히 해결 할 수 있는 문제였다.&lt;br&gt;설치시 &lt;code&gt;npm install --force or npm install --legacy-peer-deps&lt;/code&gt; 둘중 하나를 뒤에 붙이면 된다.  문제는 해결 했지만 이 명령어가 무엇인지 궁금해져서 찾아 보았따.&lt;/p&gt;
&lt;p&gt;--force를 하면 package-lock.json에 몇가지의 다른 의존 버전들을 추가할수 있다.&lt;br&gt;--legacy를 하면 peerDependency가 맞지 않아도 일단 설치한다.&lt;/p&gt;
&lt;p&gt;결론은 force를 통해 우회적으로 해보고 안되면 legacy를 사용해서 진행하면 될 것 같다!&lt;/p&gt;
&lt;br /&gt;

&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/66020820/npm-when-to-use-force-and-legacy-peer-deps&quot;&gt;참고1&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://iancoding.tistory.com/154&quot;&gt;참고2&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://velog.io/@yonyas/Fix-the-upstream-dependency-conflict-installing-NPM-packages-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0%EA%B8%B0&quot;&gt;참고3&lt;/a&gt;&lt;/p&gt;</description>
      <category>프로그래밍/잡다한 Err Log 및 잡지식</category>
      <author>Hello JoyCoding</author>
      <guid isPermaLink="true">https://joy-codeing-lee.tistory.com/172</guid>
      <comments>https://joy-codeing-lee.tistory.com/172#entry172comment</comments>
      <pubDate>Tue, 1 Feb 2022 01:43:42 +0900</pubDate>
    </item>
    <item>
      <title>자바스크립트로 Momentum app 만들기!</title>
      <link>https://joy-codeing-lee.tistory.com/171</link>
      <description>&lt;h1&gt;Momentum-App&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://momentum-app.vercel.app/&quot;&gt;데모 사이트&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/75570030/150695227-4ed3e84f-abc9-43cc-a7fe-76a7ec1cb8e8.png&quot; alt=&quot;123&quot; width=&quot;1440&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;프로젝트 목표&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순수 자바스크립트만 활용하여 간단한 웹 어플리케이션 만들기, 또 한 dom조작 및 api를 활용하여 위치 기반 서비스 구현 해보기!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기능 구현 및 시연 영상&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기능 구현 리스트&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새로 고침시 랜덤 배경화면 출력&lt;/li&gt;
&lt;li&gt;실시간 시계 기능&lt;/li&gt;
&lt;li&gt;위치 기반 날씨 및 기상 정보&lt;/li&gt;
&lt;li&gt;todolist&lt;/li&gt;
&lt;li&gt;localstorege 리셋 기능&lt;/li&gt;
&lt;li&gt;랜덤 명언 출력&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시연 영상&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/75570030/150696090-86654ee9-9f65-4e52-9fb6-667fc52dbe7f.gif&quot; alt=&quot;name&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/75570030/150696091-d6db7ad2-76de-4d0c-bc8a-62ad11c34626.gif&quot; alt=&quot;reset&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/75570030/150696092-7eecdce3-d283-4b3b-be73-e41dfed49e20.gif&quot; alt=&quot;todo&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/75570030/150696129-49b90146-3e45-4b00-91c6-b5ef0182ffd0.gif&quot; alt=&quot;bg&quot; /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;회고...&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트의 힘을 다시 한번 느낀다!!! 뿌듯하다... 뭔가 만드는게 너무 재미있다...!!! 다음엔 무엇을 만들어 볼까나~@&lt;/p&gt;</description>
      <category>MiNI project</category>
      <author>Hello JoyCoding</author>
      <guid isPermaLink="true">https://joy-codeing-lee.tistory.com/171</guid>
      <comments>https://joy-codeing-lee.tistory.com/171#entry171comment</comments>
      <pubDate>Mon, 24 Jan 2022 05:18:28 +0900</pubDate>
    </item>
    <item>
      <title>form 태그 reload 현상</title>
      <link>https://joy-codeing-lee.tistory.com/170</link>
      <description>&lt;h2&gt;버튼 클릭시 reload되는 현상&lt;/h2&gt;
&lt;p&gt;문제 원인 - 우선 button이 form 태그 안에 있을 경우 발생합니다. 그이유는 form태그안에 있는 버튼은 기본적으로 type이 submit 으로 설정되어 있어서 어떠한 이벤트를 주었을 때 버튼 클릭을 하면 reload가 되는 현상이 나타 납니다. 일반 버튼일 경우 상관 없지만 form 태그 안에 버튼이 있는 경우에는 따로 type을 설정하지 않으면 reload현상이 나타납니다.&lt;/p&gt;
&lt;h2&gt;해결볍 1&lt;/h2&gt;
&lt;p&gt;html에서 button 태그 type을 &lt;code&gt;button&lt;/code&gt;으로 설정합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;//문제 코드
&amp;lt;form&amp;gt;
&amp;lt;button className=&amp;quot;user_update_btn&amp;quot; onClick={updateUser}&amp;gt;수정&amp;lt;/button&amp;gt;
&amp;lt;/form&amp;gt;

// 해결 코드
&amp;lt;form&amp;gt;
&amp;lt;button type=&amp;quot;button&amp;quot; className=&amp;quot;user_update_btn&amp;quot; onClick={updateUser}&amp;gt;수정&amp;lt;/button&amp;gt;
&amp;lt;/form&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;

&lt;h2&gt;해결법 2&lt;/h2&gt;
&lt;p&gt;자바스크립트에서 event.preventDefault()로 제어 해줍니다. preventDefault()는 브라우저의 기본 동작을 제어 해주는 역할을 합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function joycoding(event) {
    event.preventDefault();
    //...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그외 참고 사항&lt;/p&gt;
&lt;br /&gt;

&lt;p&gt;&lt;a href=&quot;https://dololak.tistory.com/763&quot;&gt;참고 레퍼런스1&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://devhoma.tistory.com/90&quot;&gt;참고 레퍼런스2&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://stackoverflow.com/questions/7803814/prevent-refresh-of-page-when-button-inside-form-clicked&quot;&gt;참고 레퍼런스3&lt;/a&gt;  &lt;/p&gt;</description>
      <category>프로그래밍/잡다한 Err Log 및 잡지식</category>
      <category>form</category>
      <category>reload</category>
      <author>Hello JoyCoding</author>
      <guid isPermaLink="true">https://joy-codeing-lee.tistory.com/170</guid>
      <comments>https://joy-codeing-lee.tistory.com/170#entry170comment</comments>
      <pubDate>Sun, 16 Jan 2022 21:57:24 +0900</pubDate>
    </item>
    <item>
      <title>react_up down 간단한 웹 게임 만들기!</title>
      <link>https://joy-codeing-lee.tistory.com/169</link>
      <description>&lt;h1&gt;up_and_down_game&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://up-and-down-github-io.vercel.app/&quot;&gt;게임즐기기!!&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;미니 프로젝트 목표&lt;/h2&gt;
&lt;p&gt;React에서 useState와 input값에 대한 이해를 향상 시키고 렌덤함수와 setTimeout를 응용해서 간단한 웹 게임 구현하기!&lt;/p&gt;
&lt;h2&gt;미니 프로젝트 내용&lt;/h2&gt;
&lt;p&gt;리엑트를 활용한 up down 간단한 웹 게임 입니다.&lt;/p&gt;
&lt;h2&gt;사용 스택&lt;/h2&gt;
&lt;p&gt;react, html, css&lt;/p&gt;
&lt;h2&gt;기능 및 시연 영상&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;1부터 30까지의 임의 수를 맞추는 게임 입니다.&lt;/li&gt;
&lt;li&gt;정답을 맞추면 셋타임아웃을 통해 새로운 렌덤 숫자가 생성됩니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/75570030/147887562-25d32940-14f8-4fbd-8631-5613c25b493b.gif&quot; alt=&quot;upanddown&quot;&gt;&lt;/p&gt;
&lt;h2&gt;코드&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import React,{useState} from &amp;#39;react&amp;#39;
import &amp;#39;./App.css&amp;#39;;

function App() {
const [status, setStatus] = useState(&amp;#39;1~30 사이의 숫자를 맞춰보세요!&amp;#39;);
const [answer, setAnswer] = useState(0);
const [righyAnswer, setRightAnser] = useState(Math.ceil(Math.random()*30));


function returnFunc(e){

  e.preventDefault();
  if(+answer === righyAnswer){
    console.log(answer)
    setStatus(&amp;quot;정답!!!&amp;quot;)
    setTimeout(function(){
      resetFunc();
    }, 2000)

  }else if(answer &amp;lt; righyAnswer){
    setStatus(&amp;quot;업 ▲&amp;quot;)
  }else{
    setStatus(&amp;quot;다운 ▼&amp;quot;)
  }
}

// 게임 리셋 후 또 다른 렌덤 숫자 생성, 
// 텍스트 상태 변경
// 현재 input 초기값 설정
function resetFunc(){
  setRightAnser(Math.ceil(Math.random()*30))
  setStatus(&amp;quot;한번더! 1~30 사이의 숫자를 맞춰보세요!&amp;quot;)
  setAnswer(0);
}


// input 값을 가져올수 있는 함수
function changeAnswer(e){
  setAnswer(e.target.value);
}


  return (
    &amp;lt;div class=&amp;quot;background-card&amp;quot;&amp;gt;
       &amp;lt;form onSubmit={returnFunc}&amp;gt;
      &amp;lt;h1&amp;gt;Up and Down&amp;lt;/h1&amp;gt;
      &amp;lt;p&amp;gt;{status}&amp;lt;/p&amp;gt;
      &amp;lt;input 
      type=&amp;quot;number&amp;quot;  max=&amp;quot;30&amp;quot; min=&amp;quot;1&amp;quot;
      value={answer} onChange={changeAnswer} /&amp;gt;
      &amp;lt;button&amp;gt;확인&amp;lt;/button&amp;gt;
      &amp;lt;/form&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;자바스크립트의 기본적 지식만 있다면 리엑트로 충분히 간단한 게임을 만들수 있습니다!&lt;/p&gt;</description>
      <category>MiNI project</category>
      <author>Hello JoyCoding</author>
      <guid isPermaLink="true">https://joy-codeing-lee.tistory.com/169</guid>
      <comments>https://joy-codeing-lee.tistory.com/169#entry169comment</comments>
      <pubDate>Mon, 3 Jan 2022 14:08:27 +0900</pubDate>
    </item>
    <item>
      <title>Vue로 웹 사이트 만들기!</title>
      <link>https://joy-codeing-lee.tistory.com/168</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;애플코딩 짱짱&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애플코딩 완강 후 vue로 개인 프로젝트를 진행하였다. 배울땐 쉬웠는데 막상 직접 해보려고 하니 막히는 경우가 많아서 애먹었다... 그래도 한달 공부하고 결과물을 만들어 낸 것에 대해 만족한다!!! 그리고 공부한 걸 직접 활용해서 프로젝트를 진행해보니 내가 놓쳐던 부분이나 애매하게 알게 된 내용들을 알수 있어서 좋았따!!! 다음 미니 프로젝트를 기약하며 !!!&lt;/p&gt;
&lt;h1&gt;Art_Shop_ground_vue&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/75570030/147211156-0947abe7-7b23-4bfa-a766-312a5736fea1.png&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;데모 사이트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://art-ground-shop-github-io.vercel.app/&quot;&gt;https://art-ground-shop-github-io.vercel.app/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우는 깨지는... 맥용으로 만들었음...&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;프로젝트 목표&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Vue에 쓰여지는 다양한 메서드와 더미 api를 활용하여 데이터 바인딩을 하고 vue에 대한 전반적인 지식을 습득하기 위한 연습용 프로젝트 입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;프로젝트 내용&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;미술 작품을 쇼핑하고 본인이 좋아하는 예술 작품을 다이어리에 공유하는 간단한 웹 사이트 입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;사용 스택&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Vue, axios, bootstrap, vue-router, css, vuex&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기능 구현 및 시연 영상&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;shop page shop page 전체&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/75570030/147208359-2c6a1606-a391-4786-bfd5-4988e2a0ec1d.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정렬 기능&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/75570030/147210185-d27c14cd-7698-4f64-b56e-692eb97c147c.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;api 호출(더보기 기능)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/75570030/147208488-263177c2-11ae-4313-9480-03a8a363a784.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상세페이지(유효성 검사)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/75570030/147208139-b3ad0ecf-0ceb-40be-8e4a-04ccf821099d.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;diary page diary page 전체&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/75570030/147210414-5e9400ca-10fc-4d3f-9628-011afb62dda3.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지 업로드 및 글 발행 기능&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/75570030/147207927-a242efb5-2d27-4e4c-bdf1-ce4468804d44.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋아요 기능&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/75570030/147207632-4dbe3f1a-28a0-4d2f-8fb5-3e2431fb3c30.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리...&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 개인 프젝을 통해 뷰에 대한 전반적인 학습을 할 수 있어서 좋았다!!! 뭔가 뿌듯하다!!! 하지만 아쉬운 점이 한두가지가 아니다. 이번 프로젝트를 통해 아쉬운 점에 대해 적어 보려고 한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기능적인 측면&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;검색기능이 없어서 아쉽다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;검색기능을 도전 하다 잠시 보류하다 결국 검색기능을 놓쳤다... 이부분은 좀 더 공부하고 보완 해야 될 것 같다. 좀만 생각하면 충분히 해결 할 수 있을 것 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;좋아요 기능
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋아요 기능을 구현 하였지만 좋아요 버튼을 누를때 다른 좋아요 데이터도 클릭이 되는 현상이 나타난다... 이 것 또한 해결 해야 할 숙제 중 하나다. 애초에 store에서 데이터를 관리해서 시작했으면 꼬일 일이 없을 것 같다. 처음에 그냥 더미 데이터를 만들어서 시작해서 애매했다.. 분명 다른 방법이 있을 것 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;글 수정 및 삭제 기능
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;글 쓰기는 가능 하지만 수정 및 삭제 기능이 없는게 아쉽다. 리엑트랑 비슷해서 충분히 할 수 있는 숙제 인 것 같다. 나중에 여유 있을 때 다시 도전 해보자!!!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드적인 측면&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더보기 기능에서 api 호출 할 때 이게 맞을까? 하는 의구심이 들 정도이다. 시간적인 측면에서도 그렇고 콜백지옥을 연상케 하는 코드 이다. 분명 리펙토링이 필요하고 좀 더 간결하고 효율적으로 코드를 작성 할 방법이 있을 것 같다.. 좀 더 생각해보고 연구해보자.&lt;/p&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt; methods: {
         more(){
            axios.get('https://run.mocky.io/v3/b5a2228a-deaf-405f-af77-85b4a955b6d9%27')
             .then((a)=&amp;gt;{
                 // console.log(a)
                 // console.log(a.data)
                 this.artData.push(a.data)
                 axios.get('https://run.mocky.io/v3/c1d882fc-08e4-46e9-acf4-a3ae2e14636a%27')
                 .then((b)=&amp;gt;{
                     // console.log(b)
                     this.artData.push(b.data)
                     axios.get('https://run.mocky.io/v3/2834c58c-0530-4a8e-8762-dd330745db8c%27')
                     .then((c)=&amp;gt;{
                         this.artData.push(c.data)
                     }).catch((err)=&amp;gt;{
                         console.log(err)
                     })
                 })
             })
         },&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전반적으로 많이 부족하고 고쳐야 할 점이 한 두가지가 아니지만 한 달 동안 공부해서 이정도로 만들수 있는 것에 대해 자신감을 얻게 된 계기가 되었고 부족한 부분은 좀 더 공부해서 보완하는 방향으로 가야 할 것 같다. 코딩 공부 너무 재밌다!!! 끝@!&lt;/p&gt;</description>
      <category>MiNI project</category>
      <author>Hello JoyCoding</author>
      <guid isPermaLink="true">https://joy-codeing-lee.tistory.com/168</guid>
      <comments>https://joy-codeing-lee.tistory.com/168#entry168comment</comments>
      <pubDate>Fri, 24 Dec 2021 00:27:25 +0900</pubDate>
    </item>
    <item>
      <title>#18. Vue_vuex</title>
      <link>https://joy-codeing-lee.tistory.com/167</link>
      <description>&lt;h2&gt;vuex 사용법&lt;/h2&gt;
&lt;p&gt;vuex는 props와 custom event로 데이터 주고받는게 힘들때 사용합니다. vuex를 설치하면 js 파일하나에다 모든 데이터를 저장 할 수있습니다. 그럼 모든 컴포넌트를 그 데이터를 직접 꺼내고 수정할 수 있어 프롭스 필요없이 모든 컴포넌트가 데이터에 직접 접근이 가능합니다. 그리고 vue파일과 데이터, 규모가 클 때 사용합니다. 리엑트에서 리덕스 개념으로 생각하면 편합니다.&lt;/p&gt;
&lt;h2&gt;vuex 셋팅&lt;/h2&gt;
&lt;p&gt;우선 터미널에서 vuex를 설치합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm i vuex@next --save&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;그리고 js파일을 만들어 아래와 같이 기본 셋팅을 합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// store.js
import (createStore) from &amp;#39;vuex`

const store = createStore({
    state(){
        return {

        }
    },
})

export default store&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;그다음 store.js 파일을 main.js에 등록하면 됩니다. (꼭 등록해야합니다.)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import store from &amp;#39;./store.js&amp;#39;
app.use(store).mount(&amp;#39;#app&amp;#39;)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;그럼 store.js에 저장한 데이터들을 모든 컴포넌트가 가져다 쓸 수 있습니다. 데이터 저장은 store.js에 저장하면 되고 출력하려면 vue파일에서 {{$store.state.데이터명}}해서 사용하면 됩니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;vuex mutations&lt;/h2&gt;
&lt;p&gt;mutatuons는 데이터 수정방법을 정의합니다. 오브젝트 항목을 만든 다음에 거기다 state 수정 방법을 함수로 만들어 정의합니다. 예를 들어 vue파일에 어떤 버튼을 누루면 age라는 state를 1더해주는 기능을 만들고 싶을때 아래 예시와 같습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// store.js
import (createStore) from &amp;#39;vuex`

const store = createStore({
    state(){
        return {
            name : &amp;#39;Lee&amp;#39;,
            age : 20,
        }
    },
    mutations :{
        plusAge(state){
            state.age++
        }
    },
})&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;plusAge()함수에 파라미터 state는 위에 있는 age상태 입니다. 그다음에 vue파일에서 버튼 누를때 age + 1을 해주고 싶을때 위에 함수를 통해 vue파일에서 부탁할 수있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- app.vue --&amp;gt;
&amp;lt;button @click=&amp;quot;$store.commit(&amp;#39;plusAge&amp;#39;)&amp;quot;&amp;gt;버튼&amp;lt;/button&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;vue파일은 $store.commit(함수명) 이런 형식에 맞춰 부탁 할 수 있습니다. 이게 vuex에 있는 state수정 방법입니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;vuex action&lt;/h2&gt;
&lt;p&gt;vuex에서 상태를 수정할때 mutations함수를 활용해 수정합니다. 하지만 서버에서 데이터를 가져와서 데이터를 수정하고 싶을때가 있습니다. 이때 mutation이 아닌 actions라는 항목에 작성해서 사용하면 됩니다.&lt;/p&gt;
&lt;h3&gt;actions step 1&lt;/h3&gt;
&lt;p&gt;우선 데이터를 보관함을 만들어 줍니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// store.js
import (createStore) from &amp;#39;vuex`

const store = createStore({
    state(){
        return {
            more : {},
        }
    },
})&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;actions step 2&lt;/h3&gt;
&lt;p&gt;state를 수정하는 함수는 mutations에다 작성하고 ajax요청은 넣지 않습니다. actions에서 다해주기 때문입니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// store.js
import (createStore) from &amp;#39;vuex`

const store = createStore({
    state(){
        return {
            name : &amp;#39;Lee&amp;#39;,
            age : 20,
        }
    },
      mutations:{
        setMore(state , data){
            state.more = data
        },
})&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;actions step3&lt;/h3&gt;
&lt;p&gt;mutations함수를 사용할 땐 예외없이 commit()라고 써야합니다. 그리고 그걸 쓰기 위해선 함수에 context라는 파라미터를 추가해주면 됩니다. context 대신 작명 가능하며 $store 변수 같은거라고 생각하면 됩니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// store.js
const store = createStore({
    state(){
        return {
            more : {},
        }
    },
    mutations:{
        setMore(state , data){
            state.more = data
        },
    },
    actions : {
        getData(context){
            axios.get(`요청코드`)
            .then((a)=&amp;gt;{
                //성공시 실행할 코드
                console.log(a.data) 
                context.commit(&amp;#39;setMore&amp;#39;, a.data)
            })
        },
    },
})&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;actions step 4&lt;/h3&gt;
&lt;p&gt;actions 항목을 다만들었으면 $store.dispatch(&amp;#39;action함수이름&amp;#39;) 를 사용해서 데이터를 가져옵니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- app.vue --&amp;gt;
&amp;lt;p&amp;gt;{{$store.state.more}}&amp;lt;/p&amp;gt;
&amp;lt;button @click=&amp;quot;$store.dispatch(&amp;#39;getData&amp;#39;)&amp;quot;&amp;gt;더보기버튼&amp;lt;/button&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2&gt;vuex mapstate&lt;/h2&gt;
&lt;p&gt;state를 vue파일에서 꺼내 쓸 때 $store.state.변경할거 이런식으로 꺼내 썼는데 이게 너무 길고 줄이고 싶으면 mapState라는 함수를 사용할 수 있습니다. 그전에 computed라는 항목을 알고 넘어가야 합니다.&lt;/p&gt;
&lt;h2&gt;computed&lt;/h2&gt;
&lt;p&gt;함수를 만들때 methods:{}안에 만들수 있는데 실은 computed:{}안에도 만들수 있습니다. 다만 차이점은 methods는 함수를 부를때마다 안의 코드가 실행되고 computed는 함수를 불러도 실행이 안됩니다. 즉 일종의 계산결과 저장공간이라고 생각하면 됩니다. 트위터 기입 날짜, 인스타 그램 기입 날을 입력할 떄 좋습니다.&lt;/p&gt;
&lt;h2&gt;mapState 사용법&lt;/h2&gt;
&lt;p&gt;사용할때 무조건 import를 해서 사용할수 있습니다. 그리고 꺼내야할 상태가 100개가 있다고 가정했을 때 mapState를 쓰면 알아서 computed에다가 state를 등록해 줍니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;//사용법 1
import {mapState} from &amp;#39;vuex&amp;#39;

computed : {
    ...mapState([&amp;#39;state1&amp;#39;,&amp;#39;state2&amp;#39;])
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;그리고 객체 자료형을 넣으면 이름 변경도 가능합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;//사용법 2
import {mapState} from &amp;#39;vuex&amp;#39;

computed : {
    ...mapState({작명,&amp;#39;state이름1&amp;#39;})
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;또 한 mutations 함수도 쉽게 가져다 쓸 수 있습니다. 그래서 $store.commit(&amp;#39;함수1&amp;#39;) 가아닌 함수1()로 쓸수있어서 코드를 줄일수 있는 장점이 있습니다!&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;//사용법 3
import {mapState} from &amp;#39;vuex&amp;#39;

computed : {
    ...mapState({작명,&amp;#39;state이름1&amp;#39;})
    ...mapMutations([&amp;#39;함수1&amp;#39;,&amp;#39;함수2&amp;#39;])
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>프로그래밍/Vue</category>
      <author>Hello JoyCoding</author>
      <guid isPermaLink="true">https://joy-codeing-lee.tistory.com/167</guid>
      <comments>https://joy-codeing-lee.tistory.com/167#entry167comment</comments>
      <pubDate>Thu, 23 Dec 2021 19:35:20 +0900</pubDate>
    </item>
    <item>
      <title>#16. Vue_mitt</title>
      <link>https://joy-codeing-lee.tistory.com/166</link>
      <description>&lt;h2&gt;mitt&lt;/h2&gt;
&lt;p&gt;mitt은 상위-상위 컴포넌트나 아니면 동떨어진 컴포넌트에 데이터를 전송 할 때 사용하면 매우 유용합니다. 사용법도 간단합니다. 우선 설치부터 하기!&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm i mitt&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;설치가 끝나면 main.js파일에 가서 mitt 환경 셋팅을 합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import { createApp } from &amp;#39;vue&amp;#39;
import App from &amp;#39;./App.vue&amp;#39;

// mitt 라이브 셋팅
import mitt from &amp;#39;mitt&amp;#39;
let emitter = mitt();
let app = createApp(App);

// 글로벌한 변수 보관함
app.config.globalProperties.emitter = emitter;

app.mount(&amp;#39;#app&amp;#39;)&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;

&lt;h2&gt;사용법&lt;/h2&gt;
&lt;p&gt;데이터 보내고 싶은 곳에 아래와 같이 작성합니다. this.emitter.emit하면 전송이 가능합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;methods :{
        hello(){
            this.emitter.emit(&amp;#39;작명&amp;#39;,&amp;#39;데이터&amp;#39;)
        }
    },&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그리고 데이터 수신하고 싶은 곳에서 아래와 같이 작성하면 됩니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;//...생략
 mounted(){
    this.emitter.on(&amp;#39;작명&amp;#39;,(a)=&amp;gt;{
        // 데이터 수신시 실행할 코드
        // a는 데이터
      console.log(a)
    })
  },&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;보통 수신하는 코드는 mounted()안에 적습니다. 이러면 위에 했던 내용을 수신 받을수 있습니다.&lt;/p&gt;</description>
      <category>프로그래밍/Vue</category>
      <author>Hello JoyCoding</author>
      <guid isPermaLink="true">https://joy-codeing-lee.tistory.com/166</guid>
      <comments>https://joy-codeing-lee.tistory.com/166#entry166comment</comments>
      <pubDate>Thu, 23 Dec 2021 19:33:08 +0900</pubDate>
    </item>
    <item>
      <title>#17. Vue_slot</title>
      <link>https://joy-codeing-lee.tistory.com/165</link>
      <description>&lt;h2&gt;slot문법&lt;/h2&gt;
&lt;p&gt;자식이 부모데이터를 사용하고 싶을때 사용합니다. 다만 프롭스는 src, style속성에서도 사용가능하지만 slot은 html태그이기 떄문에 html태그처럼만 사용이 가능합니다.&lt;/p&gt;
&lt;br /&gt;

&lt;h3&gt;1. 자식 컴포넌트&lt;/h3&gt;
&lt;p&gt;&lt;slot&gt;&lt;/slot&gt;태그를 이용해서 데이터를 표시할 곳을 정합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;div :class=&amp;quot;filterData + &amp;#39; filter-item&amp;#39;&amp;quot; :style=&amp;quot;`background-image:url(${upLoadUrl})`&amp;quot;&amp;gt;
      &amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;

&lt;h3&gt;2. 부모 컴포넌트&lt;/h3&gt;
&lt;p&gt;부모는 &amp;lt;자식컴포넌트&amp;gt;데이터&amp;lt;/자식컴포넌트&amp;gt; 이렇게 자식컴포넌트 사이에 데이터를 작성해서 보냅니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;FilterBox :filterData= &amp;quot;filterData[i]&amp;quot; :upLoadUrl= &amp;quot;upLoadUrl&amp;quot; v-for=&amp;quot;(a,i) in filterData&amp;quot; :key=&amp;quot;i&amp;quot;&amp;gt;
      {{filterData[i]}}
&amp;lt;/FilterBox&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>프로그래밍/Vue</category>
      <author>Hello JoyCoding</author>
      <guid isPermaLink="true">https://joy-codeing-lee.tistory.com/165</guid>
      <comments>https://joy-codeing-lee.tistory.com/165#entry165comment</comments>
      <pubDate>Sat, 18 Dec 2021 01:38:40 +0900</pubDate>
    </item>
  </channel>
</rss>