<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>kxg.lgs_.log</title>
        <link>https://velog.io/</link>
        <description>C# &amp; React &amp; Vue Dev</description>
        <lastBuildDate>Tue, 26 Jul 2022 03:34:14 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. kxg.lgs_.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/kxg_code_box" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Vue에서 watch의 deep 속성]]></title>
            <link>https://velog.io/@kxg_code_box/Vue%EC%97%90%EC%84%9C-watch%EC%9D%98-deep-%EC%86%8D%EC%84%B1</link>
            <guid>https://velog.io/@kxg_code_box/Vue%EC%97%90%EC%84%9C-watch%EC%9D%98-deep-%EC%86%8D%EC%84%B1</guid>
            <pubDate>Tue, 26 Jul 2022 03:34:14 GMT</pubDate>
            <description><![CDATA[<h1 id="watch란">watch란?</h1>
<h4 id="watch는-반응형-콜백으로-vue-인스턴스의-특정-프로퍼티가-변경될때-지정한-콜백함수가-실행되는-기능입니다">watch는 반응형 콜백으로 Vue 인스턴스의 특정 프로퍼티가 변경될때 지정한 콜백함수가 실행되는 기능입니다.</h4>
<p>한 마디로 변수의 변화를 감지해서 값이 변경될 경우 그 변수에 매핑된 함수를 실행시키는 기능입니다.</p>
<p>watch 속성의 구현 코드 형식은 다음과 같습니다.</p>
<pre><code>new Vue({
  data() {
    return {
      message: &#39;Hello&#39;
    }
  },
  watch: {
    message: function(value, oldValue) {
      console.log(value);
    }
  }
})</code></pre><p>위 코드는 message라는 데이터에 watch 속성을 지정한 코드입니다. message라는 데이터가 변할 때마다 watch 속성에 정의한 message 함수가 실행되면서 콘솔에 변한 데이터를 출력합니다.</p>
<h4 id="그런데-이렇게만-사용을-할-경우-watch로-배열-형태를-감지할-때-배열-안에-내부-내용만-바뀌었을경우-watch로-배열-형태의-값을-감지할-수-없습니다-배열-형태를-감지하기-위해서는-배열-외부의-컨테이너가-바뀌어야-watch로-감지가-됩니다">그런데 이렇게만 사용을 할 경우 watch로 배열 형태를 감지할 때 배열 안에 내부 내용만 바뀌었을경우 watch로 배열 형태의 값을 감지할 수 없습니다. 배열 형태를 감지하기 위해서는 배열 외부의 컨테이너가 바뀌어야 watch로 감지가 됩니다.</h4>
<p>따라서 배열 내부의 값만 바뀌어도 watch로 감지를 하기 위해서는 deep과 handler를 이용하여 해당 변수에 watch를 걸어줘야 합니다.</p>
<p>deep과 handler를 이용한 코드 형식은 다음과 같습니다.</p>
<pre><code>export default {
  name: &#39;ColourChange&#39;,
  props: {
    colours: {
      type: Array
    },
  },
  watch: {
    colours: {
      // This will let Vue know to look inside the array
      deep: true,

      // We have to move our method to a handler field
      handler()
        console.log(&#39;The list of colours has changed!&#39;);
      }
    }
  }
}</code></pre><p>이렇게 watch를 걸어주면 배열 내부의 데이터만 바뀌어도 watch로 해당 변수의 변화를 감지할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[npm ERR! ERESOLVE unable to resolve dependency tree 문제 해결]]></title>
            <link>https://velog.io/@kxg_code_box/npm-ERR-ERESOLVE-unable-to-resolve-dependency-tree-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0</link>
            <guid>https://velog.io/@kxg_code_box/npm-ERR-ERESOLVE-unable-to-resolve-dependency-tree-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0</guid>
            <pubDate>Fri, 20 May 2022 01:17:30 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/kxg_code_box/post/e4f6198c-c64c-4fda-8237-67faf706fcda/image.png" alt="">
다음과 같이 Version 간의 의존성 문제로 ERESOLVE 에러가 났을 경우 npm 명령 끝에</p>
<p>--force, or --legacy-peer-deps 를 추가적으로 입력 후 다시 실행하면 정상적으로 설치할 수 있다.
<img src="https://velog.velcdn.com/images/kxg_code_box/post/1c28a11e-45a4-4547-a7d9-e951eef111cd/image.png" alt="">
밑에 오류를 자세히 보면 with --force, or --legacy-peer-deps 를 통해 해결할 수 있다는 것을 알 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ useState에서 Set은 최소한으로]]></title>
            <link>https://velog.io/@kxg_code_box/UseState%EC%97%90%EC%84%9C-Set%EC%9D%84-%EC%B5%9C%EC%86%8C%ED%95%9C%EC%9C%BC%EB%A1%9C</link>
            <guid>https://velog.io/@kxg_code_box/UseState%EC%97%90%EC%84%9C-Set%EC%9D%84-%EC%B5%9C%EC%86%8C%ED%95%9C%EC%9C%BC%EB%A1%9C</guid>
            <pubDate>Tue, 10 May 2022 08:18:42 GMT</pubDate>
            <description><![CDATA[<p>프로그래밍을 하다 보면 간혹 불필요한 반복을 수행하여 시스템 자원을 낭비할 때가 있습니다.</p>
<p>예를 들어 어떠한 props Array에서 useState Array값을 set 시키기 위하여 반복문을 돌릴 때 반복문 안에서 계속 set을 할 경우 자원 낭비가 심하게 되는 경향이 있습니다. </p>
<p>따라서 이러한 경우 반복문 안에서 최종적으로 set을 시켜줄 Array를 리터럴 변수에 담고
그 후 반복문이 끝났을 때 set 시켜주면 같은 코드이지만 set을 1번만 진행함으로써 
전혀 다른 성능을 보여줄 수 있습니다.</p>
<pre><code>// Before Code

      let result = []
      setMissions([]) // 남아있는 데이터 초기화

      for(let i = 0; i &lt; props.Array[receive_data].length; ++i){ // 계속 반복문 안에서 set 하게 됨
          setMissions(mission=&gt;[...mission, {
            id: props.Array[receive_data][i].id,
            name: props.Array[receive_data][i].name,
              type: props.Array[receive_data][i].type,
              text: props.Array[receive_data][i].text
          }])
      }</code></pre><p>해당 코드를 다음과 같이 리팩토링 할 수 있습니다.</p>
<pre><code>// After Code

      let result = []

      for(let i = 0; i &lt; props.Array[receive_data].length; ++i){ // set에 접근하지 않음

        let mission:MissionModel = 
        {
          id: props.Array[receive_data][i].id,
          name: props.Array[receive_data][i].name,
          type: props.Array[receive_data][i].type,
          text: props.Array[receive_data][i].text
        }

        result.push(mission) // result 빈 배열에 Data 계속 push
      }

      setMissions(result) // 최종적으로 완성된 배열 set</code></pre><p>이러한 차이 하나하나가 프로그램을 더욱 효율적으로 동작시킬 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[useRef 사용 방법]]></title>
            <link>https://velog.io/@kxg_code_box/useRef-%EC%82%AC%EC%9A%A9-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@kxg_code_box/useRef-%EC%82%AC%EC%9A%A9-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Tue, 10 May 2022 01:53:43 GMT</pubDate>
            <description><![CDATA[<p>useRef()는 인자로 받은 값으로 초기화된 변경 가능한 ref 객체를 반환합니다. 이 객체는 컴포넌트의 전 생애주기동안 유지되며, ref.current와 같이 current 속성에 접근하여 현재 가리키는 객체에 접근할 수 있습니다.</p>
<p>select Tag에 useRef를 이용하여 props 데이터가 바뀔 때마다 select의 selectedIndex를 초기화 시키는 작업을 진행하였습니다.</p>
<pre><code>    const presetRef = useRef(null); // select tag 상태 감시 변수

    useEffect(() =&gt; { // props 데이터가 바뀌면 동작
      if(presetRef.current) // 초기에는 값이 없으므로 값이 들어있는지 확인
      {
        presetRef.current.selectedIndex = 0 // 선택된 option의 index를 초기값인 0으로 변경
      }
    }, [props.receive_data, presetRef]) // props 데이터 및 ref 감시</code></pre><p>이런 식으로 JSX Tag에 ref를 이용하여 Tag 상태에 접근하여 상태 값을 변경시킬 수 있습니다.</p>
<pre><code>&lt;select ref={presetRef}&gt; {option_rendering()} &lt;/select&gt;      </code></pre><p>select Tag에는 다음과 같이 ref를 등록할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Select Tag Option 동적 생성]]></title>
            <link>https://velog.io/@kxg_code_box/Select-Tag-Option-%EB%8F%99%EC%A0%81-%EC%83%9D%EC%84%B1</link>
            <guid>https://velog.io/@kxg_code_box/Select-Tag-Option-%EB%8F%99%EC%A0%81-%EC%83%9D%EC%84%B1</guid>
            <pubDate>Mon, 09 May 2022 08:09:12 GMT</pubDate>
            <description><![CDATA[<p>select안에 들어가는 option을 동적 생성하려면 다음과 같은 방식으로 접근할 수 있다.</p>
<pre><code>    const list = () =&gt; {
      let result = []

      Array_Data.map( (data, index) =&gt; {
        result.push(
          &lt;option key={index+&quot;_&quot;} value={index}&gt;{index + 1}&lt;/option&gt;
        )
      })

      return result
    }</code></pre><p>Array_Data 안에 있는 배열의 개수 만큼 .map으로 접근 후 loop를 돌려 result에 option 태그를 계속해서 넣어주었다. 그 후 JSX태그 안에 {list} 형식으로 넣어주면 끝이다. map의 특성상 key와 value를 요구하기 때문에 key를 넣어주었다. 없어도 된다.</p>
<pre><code>                {                     
                  props.data == 0 
                  ?
                  &lt;&gt;&lt;/&gt;
                  :
                  &lt;select onChange={ChangeValue}&gt;  
                  {list()}
                  &lt;/select&gt;
                }</code></pre><p>option의 값을 가져올 때는 onChange 이벤트로 접근하여 해당 이벤트에 등록된 함수에서 이벤트 파라미터를 이용하여 e.target.value 형태로 값을 가져올 수 있다.</p>
<pre><code>function ChangeValue(e){
      console.log(e.target.value)

      for(let i = 0; i &lt; Array_Data[e.target.value].length; ++i){
        props.setArray(lists =&gt; [...lists, {
          id: Array_Data[e.target.value][i].id,
          name: Array_Data[e.target.value][i].name,
          count: Array_Data[e.target.value][i].count,
          type: Array_Data[e.target.value][i].type
        }])
      }
    }</code></pre>]]></description>
        </item>
    </channel>
</rss>