<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>marvin-j.log</title>
        <link>https://velog.io/</link>
        <description>Front Developer</description>
        <lastBuildDate>Thu, 09 Apr 2020 02:26:36 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>marvin-j.log</title>
            <url>https://images.velog.io/images/marvin-j/profile/b12e2670-3a5e-11ea-9f4e-135bbf7ce03b/04B0A31A-2A14-415F-94C4-70EFE6F0A2F1.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. marvin-j.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/marvin-j" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[chrome-extension] 설치]]></title>
            <link>https://velog.io/@marvin-j/chrome-extension-%EC%84%A4%EC%B9%98</link>
            <guid>https://velog.io/@marvin-j/chrome-extension-%EC%84%A4%EC%B9%98</guid>
            <pubDate>Thu, 09 Apr 2020 02:26:36 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="확장프로그램-설치">확장프로그램 설치</h3>
</blockquote>
<p>주소창에 chrome://extensions 로 이동해서 &#39;압축해제된 확장 프로그램을 로드합니다.&#39; 클릭후 프로그램 제작 폴더를 선택하면 아래 이미지와 같이 설치가 된다.</p>
<p>그후 상단에 아이콘이 노출된다</p>
<p><img src="https://images.velog.io/images/marvin-j/post/5c6705f3-ae36-4d3e-ba64-a725704f3125/image.png" alt=""></p>
<p>오른쪽 마우스를 클릭하면 &#39;팝업검사&#39;를 눌러 디버깅을 할 수 있다.
<img src="https://images.velog.io/images/marvin-j/post/0fc126ef-2452-4ed2-ba9f-afa87be8e1a5/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[chrome-extension] 설정]]></title>
            <link>https://velog.io/@marvin-j/chrome-extension-%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@marvin-j/chrome-extension-%EC%84%A4%EC%A0%95</guid>
            <pubDate>Thu, 09 Apr 2020 02:06:48 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="webstorm-셋팅">webstorm 셋팅</h3>
</blockquote>
<p><img src="https://images.velog.io/images/marvin-j/post/54ff317b-d157-4718-ac4a-10e3b04e011a/image.png" alt=""></p>
<p>Prefercences &gt; Languages &amp; Frameworks &gt; Javascript &gt; Libraries</p>
<p><img src="https://images.velog.io/images/marvin-j/post/40dac2be-eaed-4db4-920d-15e7409ab167/image.png" alt=""></p>
<p>Download &gt; chrome 선택해서 다운받은 다음 &#39;@types/chrome&#39; 를 선택하면 자동완성기능을 사용할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[expo] cli login]]></title>
            <link>https://velog.io/@marvin-j/expo-cli-login</link>
            <guid>https://velog.io/@marvin-j/expo-cli-login</guid>
            <pubDate>Fri, 21 Feb 2020 01:47:24 GMT</pubDate>
            <description><![CDATA[<pre><code>exop login -u username -p password</code></pre><p>로그인이 되어 있어야 브라우저에서 <code>&#39;Publish or republish project&#39;</code> 가 실행될때 문제가 없다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[RN : FlatList]]]></title>
            <link>https://velog.io/@marvin-j/RN-FlatList</link>
            <guid>https://velog.io/@marvin-j/RN-FlatList</guid>
            <pubDate>Mon, 17 Feb 2020 09:39:11 GMT</pubDate>
            <description><![CDATA[<h5 id="원문---httpsfacebookgithubioreact-nativedocsflatlist"><code>원문 :</code>  <a href="https://facebook.github.io/react-native/docs/flatlist">https://facebook.github.io/react-native/docs/flatlist</a></h5>
<blockquote>
<p>renderItem({item, index, separators})</p>
</blockquote>
<p><code>data</code> 데이터를 출력할 함수</p>
<hr>
<blockquote>
<p>data </p>
</blockquote>
<p><code>&lt;Array&gt;</code> 출력할 리스트 배열</p>
<hr>
<blockquote>
<p>ItemSeparatorComponent</p>
</blockquote>
<p><code>renderItem</code> 아이템 중간에 들어갈 수 있는 컴포넌트</p>
<hr>
<blockquote>
<p>ItemSeparatorComponent</p>
</blockquote>
<p>아이템 사이에 들어가면 최상위 하위는 들어가지 않는다.
<code>renderItem</code> 과 함께 연동해서 사용이 가능하다.</p>
<ul>
<li>separators.highlight </li>
<li>separators.unhighlight</li>
<li>separators.highlighted</li>
<li>separators.updateProps</li>
</ul>
<hr>
<blockquote>
<p>ListEmptyComponent</p>
</blockquote>
<p>목록이 비었을때 랜더링 (컴포넌트)</p>
<hr>
<blockquote>
<p>ListFooterComponent
ListFooterComponentStyle</p>
</blockquote>
<p>리스트 맨아래 랜더링 (컴포넌트)</p>
<hr>
<blockquote>
<p>ListHeaderComponent
ListHeaderComponentStyle</p>
</blockquote>
<p>리스트 맨위에 랜더링 (컴포넌트)</p>
<hr>
<blockquote>
<p>columnWrapperStyle</p>
</blockquote>
<p>리스트가 가로인 경우<code>horizontal=true</code> 에 사용 가능하다는데아무리 해봐도 무슨 기능인지 모름</p>
<hr>
<blockquote>
<p>extraData</p>
</blockquote>
<p>목록을 다시 랜더링 하도록 알리기위한 마커 </p>
<hr>
<blockquote>
<p>getItemLayout = {(data, index) =&gt; {length: 0, offset: 0, index: 0}}</p>
</blockquote>
<pre><code class="language-javascript"> getItemLayout={(data, index) =&gt; (
    {length: ITEM_HEIGHT, offset: ITEM_HEIGHT * index, index}
  )}</code></pre>
<p>높이 최적화 </p>
<hr>
<blockquote>
<p>horizontal</p>
</blockquote>
<p>가로로 랜더링함</p>
<hr>
<blockquote>
<p>initialNumToRender</p>
</blockquote>
<p>초기 배치에서 랜더링할 항목 수</p>
<hr>
<blockquote>
<p>initialScrollIndex</p>
</blockquote>
<p>첫번째가 아닌 시작 번호를 부터 랜더링을 한다.</p>
<hr>
<blockquote>
<p>inverted</p>
</blockquote>
<p>출력방향 설정 기본(false) 위-&gt;아래, (true) 아래 -&gt; 위</p>
<hr>
<blockquote>
<p>keyExtractor={(item, index) =&gt; string}</p>
</blockquote>
<p>리액트 <code>key</code> 로 사용될 값 </p>
<hr>
<blockquote>
<p>nymColumns </p>
</blockquote>
<p>값(숫자) 만큼 가로로 출력하고 다음열로 넘어간다.</p>
<hr>
<blockquote>
<p>onEndReached</p>
</blockquote>
<p>스크롤 위치가 <code>onEndReachedThreshold</code> 에 도착하면 한번 호출한다.</p>
<hr>
<blockquote>
<p>onEndReachedThreshold</p>
</blockquote>
<p><code>onEndReached</code> 콜백을 트리거 하기위한 값 목록의 중간은 0.5</p>
<hr>
<blockquote>
<p>onRefresh
refreshing</p>
</blockquote>
<p>사용하려면&#39;refreshing&#39; 값이 셋팅이 되야하며 
<code>refreshing={false}</code> 로 셋팅하면 &quot;Pull to Refresh&quot; 가 작동된다.</p>
<hr>
<blockquote>
<p>onViewableItemsChanged
viewabilityConfig
viewabilityConfigCallbackPairs</p>
</blockquote>
<p><code>viewabilityConfig</code> 에따라 아이템의 가시성이 변경될때 호출</p>
<hr>
<blockquote>
<p>progressViewOffset</p>
</blockquote>
<hr>
<blockquote>
<p>legacyImplementation</p>
</blockquote>
<p>디버깅및 성능 비교</p>
<hr>
<blockquote>
<p>removeClippedSubviews</p>
</blockquote>
<p>큰목록 성늘 향상 (컨텐츠 누락) 버그가 있을수 있음 위험 감수</p>
<hr>
<ul>
<li>scrollToEnd([param]) : 컨텐츠 스크롤 끝으로 이동</li>
<li>scrollToIndex(param) : 컨텐츠 스크롤 이동 (0: 앞, 0.5: 가운데, 1: 끝)</li>
<li>scrollToItem(param) : 아이템으로 스크롤 이동</li>
<li>scrollToOffset(param) : 스크롤할 오프셋</li>
<li>recordInteraction() : 상호 작용 발생한 목록</li>
<li>flashScrollIndicators() : 스크롤 표시기를 잠깐 표시함</li>
<li>() : 기본 스크롤 응답기 핸들 제공</li>
<li>getScrollableNode() : </li>
</ul>
<pre><code>param = {
  animated: true,
  index: 3,
  viewOffset: 2,
  viewPosition: 0.5
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[react-navigation]v5.x(2)]]></title>
            <link>https://velog.io/@marvin-j/react-navigationv5.x2</link>
            <guid>https://velog.io/@marvin-j/react-navigationv5.x2</guid>
            <pubDate>Tue, 11 Feb 2020 14:52:14 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="전체-해더-셋팅">전체 해더 셋팅</h2>
</blockquote>
<p><code>Stack.Navigator</code> 의 <code>screenOptions</code> 셋팅을 한다</p>
<pre><code class="language-javascript">&lt;Stack.Navigator
      screenOptions={{
        headerStyle: {
          backgroundColor: &#39;#f4511e&#39;,
        },
        headerTintColor: &#39;#fff&#39;,
        headerTitleStyle: {
          fontWeight: &#39;bold&#39;,
        },
      }}
    &gt; ...</code></pre>
<blockquote>
<h2 id="부분-해더-셋팅">부분 해더 셋팅</h2>
</blockquote>
<p><code>Stack.Screen</code> 의 <code>options</code> 값을 셋팅한다.</p>
<pre><code class="language-javascript">&lt;Stack.Screen
        name=&quot;Home&quot;
        component={HomeScreen}
        options={{
          title: &#39;My home&#39;,
          headerStyle: {
            backgroundColor: &#39;#f4511e&#39;,
          },
          headerTintColor: &#39;#fff&#39;,
          headerTitleStyle: {
            fontWeight: &#39;bold&#39;,
          },
        }}
      /&gt;...</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[react-navigation]4]]></title>
            <link>https://velog.io/@marvin-j/react-navigation4</link>
            <guid>https://velog.io/@marvin-j/react-navigation4</guid>
            <pubDate>Tue, 04 Feb 2020 14:50:28 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="createappcontainer">createAppContainer()</h2>
</blockquote>
<p>createAppContainer 은 네이티브의 back 액션을 당담한다.</p>
<blockquote>
<h2 id="onnavigationstatechangeprevstate-newstate-action">onNavigationStateChange(prevState, newState, action)</h2>
</blockquote>
<p>네비게이션 (navigate) 상태가 변경될때마다 호출되는 함수</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[react-navigation]3]]></title>
            <link>https://velog.io/@marvin-j/react-navigation3</link>
            <guid>https://velog.io/@marvin-j/react-navigation3</guid>
            <pubDate>Tue, 04 Feb 2020 05:05:59 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="navigationoptions--header">navigationOptions : Header</h2>
</blockquote>
<pre><code class="language-javascript">class Home extends React.component {
//static navigationOptios = ({navigation, navigationOptions, sceenProps}) =&gt; {
// 함수로 처리하면 navigation 을 이용해서 버튼에 커스텀 기능과 네비게이션 구현 가능
  static navigationOptios = {
    title: &quot;dddd&quot;,
    headerStyle: {    // 스타일 적용
      backgroundColor: &#39;#ff00ff&#39;,
    },
    headerTintColor: &#39;#00ff00&#39;,
    headerTitleStyle: {
      backgroundColor: &#39;#ff00ff&#39;,
    },
    header: ()=&gt; &lt;HeaderComponent/&gt;, // 해더 전체 적용
    headerTitle: ()=&gt; &lt;HeaderTitle/&gt;, // 해더 타이틀만 적용
    headerLeft: ()=&gt; &lt;HeaderLeft/&gt;, // 해더 left만 적용
    headerRight: ()=&gt; &lt;HeaderRight/&gt;, // 해더 right 만 적용
  }
}</code></pre>
<blockquote>
<h2 id="default-navigationoptions-setting">Default navigationOptions setting</h2>
<h5 id="기본셋팅은-상위-stack-에서-관리한다">기본셋팅은 상위 stack 에서 관리한다.</h5>
</blockquote>
<pre><code class="language-javascript">const AppNavigator = createStackNavigator(
  {
    Home: HomeScreen,
    Details: DetailsScreen,
  },
  {
    initialRouteName: &#39;Home&#39;,
    defaultNavigationOptions: {
      headerStyle: {
        backgroundColor: &#39;#f4511e&#39;,
      },
      headerTintColor: &#39;#fff&#39;,
      headerTitleStyle: {
        fontWeight: &#39;bold&#39;,
      }
    }
  }
);
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[react-navigation]2]]></title>
            <link>https://velog.io/@marvin-j/react-navigation2</link>
            <guid>https://velog.io/@marvin-j/react-navigation2</guid>
            <pubDate>Mon, 03 Feb 2020 15:19:04 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="navigationoptions">navigationOptions</h2>
</blockquote>
<ul>
<li>네비게이션 바의 타이틀이나 색상을 변경한다.</li>
<li>네비게이션은 static 정적 데이터나 함수를 사용가능하고</li>
<li>함수의 경우 리턴값으로 {navigation, navigationOptions} 를 전달한다.</li>
</ul>
<blockquote>
<h2 id="정적-데이터">정적 데이터</h2>
</blockquote>
<pre><code class="language-javascript">// 클래스 형태라면 내부에
class HomeScreen extends React.Component { 
  static navigationOptions = {
    title: &#39;Details&#39;,
    navigationOptions: {
    }
  }
...
}
// 함수 형태라면
const HomeScreen = () =&gt; { ... }
HomeScreen.navigationOptions = {
  title: &#39;Details&#39;
}
</code></pre>
<hr>
<blockquote>
<h2 id="함수">함수</h2>
</blockquote>
<pre><code class="language-javascript">// 클래스 형태라면 내부에
class HomeScreen extends React.Component { 
  static navigationOptions = ({navigation, navigationOptions, screenProps}) =&gt; {
    const { params } = navigation.state;
    return {
      title: &#39;Details&#39;,
      title: navigation.getParam(&#39;type&#39;) // 함수를 사용해서 가져올수도 있음
    }
}
// 함수 형태라면
const HomeScreen = () =&gt; { ... }
HomeScreen.navigationOptions = ({navigation, navigationOptions}) =&gt; {
  const { params } = navigation.state;
  return{
    title: &#39;Details&#39;
  }
}
</code></pre>
<hr>
<blockquote>
<h2 id="타이틀-스타일">타이틀 스타일</h2>
</blockquote>
<pre><code class="language-javascript">class HomeScreen extends React.Component { 
static navigationOptions = {
    title: &#39;Detail&#39;,
    headerStyle: {
      backgroundColor: &#39;#f4511e&#39;,
    },
    headerTintColor: &#39;#fff&#39;,
    headerTitleStyle: {
      fontWeight: &#39;bold&#39;,
    },
  };
...

// 전체에 default style 가능
const AppNavigator = createStackNavigator(
  {
    Home: HomeScreen,
    Details: DetailsScreen,
  },
  {
    initialRouteName: &#39;Home&#39;,
    defaultNavigationOptions: {
      headerStyle: {
        backgroundColor: &#39;#f4511e&#39;,
      },
      headerTintColor: &#39;#fff&#39;,
      headerTitleStyle: {
        fontWeight: &#39;bold&#39;,
      },
    },
  }
);</code></pre>
<blockquote>
<h2 id="커스텀-컴포넌트를-제목에-사용">커스텀 컴포넌트를 제목에 사용</h2>
</blockquote>
<pre><code class="language-javascript">const LogoTitle = () =&gt; {
  return (
    &lt;View style={{ flex: 1, height: 30 }}&gt;
      &lt;Text&gt;Logo&lt;/Text&gt;
    &lt;/View&gt;
  );
}

class HomeScreen extends React.Component {
  static navigationOptions = {
    // headerTitle instead of title
    headerTitle: () =&gt; &lt;LogoTitle /&gt;,
  };

  /* render function, etc */
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[react-navigation] 1]]></title>
            <link>https://velog.io/@marvin-j/react-navigation-1</link>
            <guid>https://velog.io/@marvin-j/react-navigation-1</guid>
            <pubDate>Mon, 03 Feb 2020 14:53:25 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="react-navigation">react-navigation</h2>
</blockquote>
<p>아래와 같이 세가지를 설치한다.</p>
<pre><code>&gt; npm install react-navigation
&gt; expo install react-native-gesture-handler react-native-reanimated react-native-screens react-native-
safe-area-context @react-native-community/masked-view
&gt; npm install react-navigation-stack @react-native-community/masked-view</code></pre><hr>
<blockquote>
<h2 id="기본-함수">기본 함수</h2>
</blockquote>
<p>기본적인 내비게이션 함수
props.navigation.push(&#39;화면이름&#39;)
props.navigation.navigate(&#39;화면이름&#39;)
props.navigation.goBack()
props.navigation.popToTop()</p>
<p>props.navigation.dismiss()
props.navigation.pop()
props.navigation.replace()
props.navigation.reset()
props.navigation.setParams()
props.navigation.getParams()</p>
<hr>
<blockquote>
<h2 id="매개변수-전달">매개변수 전달</h2>
</blockquote>
<p>push, navigate(&#39;indexName&#39;, {params}) 두번째 인자로 변수를 전달한다.</p>
<hr>
<blockquote>
<h2 id="매개변수-읽기">매개변수 읽기</h2>
</blockquote>
<pre><code>props.navigation.state.params
props.navigation.getParam(&#39;keyName&#39;, &#39;initValue&#39;)</code></pre><p>만약 키에 해당하는 값이 없다면 initValue 값을 반환한다.</p>
<hr>
<blockquote>
<h2 id="매개변수-셋팅">매개변수 셋팅</h2>
</blockquote>
<pre><code>props.navigation.setParams({&#39;key&#39;: &#39;value&#39;})</code></pre><p>setParams 는 setState 와 같은 재랜더링을 실행한다.</p>
<hr>
<blockquote>
<h2 id="스택-셋팅">스택 셋팅</h2>
</blockquote>
<pre><code class="language-javascript">import { createAppContainer } from &#39;react-navigation&#39;;
import {createStackNavigator} from &#39;react-navigation-stack&#39;

const RootStack = createStackNavigator(
  {
    Home: HomeScreen,
    Details: DetailsScreen,
  },
  {
    initialRouteName: &#39;Home&#39;,
  }
);
const AppContainer = createAppContainer(RootStack);</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[youtube] iframe-api]]></title>
            <link>https://velog.io/@marvin-j/youtube-iframe-api</link>
            <guid>https://velog.io/@marvin-j/youtube-iframe-api</guid>
            <pubDate>Thu, 30 Jan 2020 08:53:27 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="유투브-동영상이-모바일-앱에서-문제가-되는-경우가-있다">유투브 동영상이 모바일 앱에서 문제가 되는 경우가 있다.</h3>
<h5 id="공유하기share-와-나중에보기whatch-later">공유하기(share) 와 나중에보기(whatch-later)</h5>
</blockquote>
<hr>
<blockquote>
<h3 id="해결방안-1">해결방안 1</h3>
</blockquote>
<p>하나의 공유 주소를 사용하는 경우  <a href="https://www.youtube.com">https://www.youtube.com</a> 주소를 youtube-nocookie 로 변경하는 방법</p>
<pre><code class="language-html">&lt;iframe width=&quot;854&quot; height=&quot;480&quot; src=&quot;https://www.youtube-nocookie.com/embed/cPVgwz5aN1o&quot; frameBorder=&quot;0&quot; allowFullScreen /&gt;</code></pre>
<hr>
<blockquote>
<h3 id="해결방안-2">해결방안 2</h3>
</blockquote>
<h5 id="iframe-player-api-바로가기"><a href="https://developers.google.com/youtube/player_parameters">Iframe Player API 바로가기</a></h5>
<p><a href="https://www.youtube.com/iframe_api">https://www.youtube.com/iframe_api</a> 
api 를 사용하는 경우
Player 함수의 &#39;play&#39; 셋팅에서 &#39;host&#39;를 변경하는 방법</p>
<pre><code class="language-javascript">var tag = document.createElement(&#39;script&#39;);
tag.src = &quot;https://www.youtube.com/iframe_api&quot;;
var firstScriptTag = document.getElementsByTagName(&#39;script&#39;)[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

var player;
function onYouTubeIframeAPIReady() {
    player = new YT.Player(&#39;player&#39;, {
        height: &#39;390&#39;,
        width: &#39;640&#39;,
        videoId: &#39;M7lc1UVf-VE&#39;,
        wmode: &#39;transparent&#39;,
        host: &#39;https://www.youtube-nocookie.com&#39;, // 기본적으로는 값을 넣지 않는다.
        events: {
            &#39;onReady&#39;: onPlayerReady
        }
    });
}

function onPlayerReady(event) {
    player.setPlaybackRate(2);
    event.target.playVideo();
}</code></pre>
<hr>
<blockquote>
<h3 id="해결방안-3">해결방안 3</h3>
</blockquote>
<p>iframe embed 를 제어 하기 위해 css 를 이용 제어를 하고 
오토플레이를 이용 제어 버튼을 만든다.</p>
<pre><code class="language-html">&lt;div className=&quot;video-container&quot;&gt;
  &lt;div className=&quot;video-foreground&quot;&gt;
    &lt;div className=&quot;btn-stop-play&quot;&gt;play&lt;/div&gt;
    &lt;iframe width=&quot;854&quot; height=&quot;480&quot; src=&quot;https://www.youtube.com/embed/cPVgwz5aN1o?autoplay=1&quot; frameBorder=&quot;0&quot; allowFullScreen /&gt;
  &lt;/div&gt;
&lt;/div&gt;</code></pre>
<pre><code class="language-css">.video-container{
  position: absolute;
}
.video-container iframe {
  pointer-events: none;
}
.video-foreground{
  pointer-events:none;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React-native] Styles 구조]]></title>
            <link>https://velog.io/@marvin-j/React-native-Styles-%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@marvin-j/React-native-Styles-%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Tue, 21 Jan 2020 10:29:33 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="style-외부-파일을-만들어서-사용하기">style 외부 파일을 만들어서 사용하기</h2>
</blockquote>
<pre><code class="language-javascript">import { styleSheet } from &#39;react-native&#39;
const styles = styleSheet.create({
  container: {
    backgroundColor: &#39;#dddddd&#39;
    ...
  }
})
const button = styleSheet.create({
  container: {
    backgroundColor: &#39;#dddddd&#39;
    ...
  }
})
export {styles, button}</code></pre>
<hr>
<blockquote>
<h2 id="기본-스타일을-정의해두고-병합해서-사용하기">기본 스타일을 정의해두고 병합해서 사용하기</h2>
</blockquote>
<pre><code class="language-javascript">import { styleSheet } from &#39;react-native&#39;

const colors = {
  dark: &#39;black&#39;,
  light: &#39;white&#39;
}
const baseContainerStyle = {
  flex: 1
}
const baseButtonsStyle = {
  width: 150
}

const lightStyle = styleSheet.create({
  container: {
    ...baseContainerStyle,
    color: colors.light
  },
  button: {
    ...baseButtonsStyle,
    color: colors.light
  }
})

const darkStyle = styleSheet.create({
  container: {
    ...baseContainerStyle,
    color: colors.dark
  },
  button: {
    ...baseButtonsStyle,
    color: colors.light
  }
})

default export getStyles = (theme) =&gt; {
  return theme === &#39;dark&#39;? darkStyle : lightStyle
}</code></pre>
<hr>
<blockquote>
<h2 id="스타일은-중복에서-사용할수-있다">스타일은 중복에서 사용할수 있다</h2>
</blockquote>
<p>중복된 스타일의 경우 인라인코드가 우선이 된다.</p>
<pre><code class="language-javascript">...
&lt;View style={[styles.box, {backgroundColor:&#39;#ddd&#39;}]}&gt;...
...</code></pre>
<hr>
<h2 id="color-reference">Color Reference</h2>
<p><a href="https://facebook.github.io/react-native/docs/colors"><code>페이스북 컬러 바로가기</code></a></p>
<h2 id="view-style-props-reference">View Style Props Reference</h2>
<p><a href="https://facebook.github.io/react-native/docs/view-style-props"><code>스타일 바로가기</code></a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React Hook] useCallback()]]></title>
            <link>https://velog.io/@marvin-j/React-Hook-useCallback</link>
            <guid>https://velog.io/@marvin-j/React-Hook-useCallback</guid>
            <pubDate>Tue, 21 Jan 2020 08:47:04 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="메모제이션한-함수를-반환한다">메모제이션한 함수를 반환한다.</h2>
</blockquote>
<p><code>facebook: useCallback</code> <a href="https://ko.reactjs.org/docs/react-component.html"><code>link</code></a></p>
<pre><code class="language-javascript">const [list, setlist] = useState([])
const count = useCallback(() =&gt; { setCount(list)}, list)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React Hook] useMemo()]]></title>
            <link>https://velog.io/@marvin-j/React-Hook-useMemo</link>
            <guid>https://velog.io/@marvin-j/React-Hook-useMemo</guid>
            <pubDate>Tue, 21 Jan 2020 07:12:26 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="메모제이션한-값을-반환한다">메모제이션한 값을 반환한다.</h2>
</blockquote>
<p><code>facebook: useMemo</code> <a href="https://ko.reactjs.org/docs/react-component.html"><code>link</code></a>
함수는 특정값이 변경된게 아니라면 다시 계산하지 않기 위한 hook 함수다
즉 이 함수를 통해 들어온 값들은 저장되었다가 랜더가 돌때 다시 비교해서 필요한 경우만 실행한다.
다시 한번 계산이 필요한지를 검증한 후 필요한 경우에만 함수를 실행 시킨다.
shouldComponentUpdate() 함수와 비숫하지만 특정 값만을 지정한다.</p>
<pre><code class="language-javascript">const [list, setlist] = useState([])
const count = useMemo(() =&gt; { setCount(list)}, list)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React-navtive] useEffect()]]></title>
            <link>https://velog.io/@marvin-j/React-navtive-useEffect</link>
            <guid>https://velog.io/@marvin-j/React-navtive-useEffect</guid>
            <pubDate>Mon, 20 Jan 2020 14:59:57 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="useeffect">useEffect()</h2>
</blockquote>
<pre><code class="language-javascript">const app = () =&gt; {
  useEffect(() =&gt; {
    console.log(&quot;update&quot;)
    return () =&gt; {
      console.log(&quot;clearUp&quot;)
    }
  }, [limitValue])
}</code></pre>
<p><code>mount</code>&gt; &quot;update&quot;
<code>render</code>  &gt; &quot;cleanUp&quot; &gt; &quot;update&quot;
<code>unMount</code> &gt; &quot;cleanUp&quot;
<code>limitValue</code>를 없으면 매번 실행
<code>limitValue</code>를 설정하면 해당값이 변경될때만 실행
<code>limitValue</code>를 [] 빈값으로 설정하면 한번만 실행</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React-native] AsyncStorage]]></title>
            <link>https://velog.io/@marvin-j/React-native-AsyncStorage</link>
            <guid>https://velog.io/@marvin-j/React-native-AsyncStorage</guid>
            <pubDate>Sun, 19 Jan 2020 15:43:57 GMT</pubDate>
            <description><![CDATA[<h4 id="asyncstorage는-앱-전체적으로-사용할-수-있으며-비동기적이고-지속성있고-암호화-되어-있지-않는-모듈입니다">AsyncStorage는 앱 전체적으로 사용할 수 있으며 비동기적이고 지속성있고 암호화 되어 있지 않는 모듈입니다.</h4>
<ul>
<li>ios에서는 네이티브 코드 뒤에서 위치하며 작은 크기는 연속적으로 저장하며 큰 데이터는 분산하여 저장합니다. </li>
<li>안드로이드에서는 락스디비 혹은 sqllite를 기반으로 하여 사용할 수 있습니다. </li>
<li>error가 있으면 error를 반환하고 또는 Promise를 반환하기도 합니다. </li>
</ul>
<p>바로가기 : <a href="https://facebook.github.io/react-native/docs/asyncstorage">facebook AsyncStore</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React-native] 플랫폼별 특정 컴포넌트]]></title>
            <link>https://velog.io/@marvin-j/React-native-%ED%94%8C%EB%9E%AB%ED%8F%BC%EB%B3%84-%ED%8A%B9%EC%A0%95-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8</link>
            <guid>https://velog.io/@marvin-j/React-native-%ED%94%8C%EB%9E%AB%ED%8F%BC%EB%B3%84-%ED%8A%B9%EC%A0%95-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8</guid>
            <pubDate>Sun, 19 Jan 2020 15:30:48 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="특정-플랫폼별-규칙">특정 플랫폼별 규칙</h2>
</blockquote>
<ul>
<li><p>하나만 사용한다면 <NameIOS> <NameAndroid> 이런식으로 운영체제 명을 뒤에 붙인다</p>
<hr>
</li>
</ul>
<blockquote>
<h2 id="파일-확장자로-플랫폼-선택하기-naming-convention">파일 확장자로 플랫폼 선택하기 (naming convention)</h2>
</blockquote>
<ul>
<li>플랫폼별로 구현한 파일을 두개를 만들고 동일한 폴더에 넣는다</li>
</ul>
<p><code>Name.ios.js</code> <code>Name.android.js</code> 파일</p>
<pre><code class="language-javascript">  import Name from &#39;./Name&#39;</code></pre>
<hr>
<blockquote>
<h2 id="platform-모듈-사용">Platform 모듈 사용</h2>
</blockquote>
<ul>
<li><p>플랫폼 구분을 위한 모듈 사용</p>
<pre><code class="language-javascript">import {Platform, StyleSheet} from &#39;react-native&#39;
console.log(Platform.OS === &#39;ios&#39;)
console.log(Platform.Version)
...
const styles = StyleSheet.create({
color: Platform.OS === &#39;ios&#39;? &#39;#ddd&#39; : &#39;#ccc&#39;
})</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React-native] Flexbox  레이아웃]]></title>
            <link>https://velog.io/@marvin-j/React-native-Flexbox-%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%A0%88%EC%9D%B4%EC%95%84%EC%9B%83</link>
            <guid>https://velog.io/@marvin-j/React-native-Flexbox-%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%A0%88%EC%9D%B4%EC%95%84%EC%9B%83</guid>
            <pubDate>Sun, 19 Jan 2020 14:58:41 GMT</pubDate>
            <description><![CDATA[<h3 id="레이아웃과-밀접한-관계-속성">레이아웃과 밀접한 관계 속성</h3>
<ul>
<li>width, height, margin, border, padding</li>
</ul>
<blockquote>
<h1 id="flex">flex</h1>
</blockquote>
<ul>
<li>레이아웃 구성의 가중치를 말한다. </li>
<li>엘리먼트가 한개면 1 은 100%를 말하고 두개면 1은 50%를 말한다</li>
</ul>
<blockquote>
<h1 id="flexdirection">flexDirection</h1>
</blockquote>
<p>-<code>colum</code> 세로 레이아웃을 말한다
-<code>row</code> 가로 레이아웃을 말한다</p>
<blockquote>
<h1 id="alignitems">alignItems</h1>
</blockquote>
<p>-<code>flex-start</code>  상단으로 정렬이 된다.
-<code>center</code>중간에 정렬이 된다.
-<code>flex-end</code> 하단으로 정렬이 된다.</p>
<hr>
<blockquote>
<h2 id="절대위치-지정">절대위치 지정</h2>
</blockquote>
<p>-<code>position:&#39;absolute&#39;</code> 일반적인 css 와 같다
-부모의 <code>zIndex</code> 가 우선이 된다
-<code>position</code> 이 없어도 zIndex 를 사용할 수 있다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React-native] style2]]></title>
            <link>https://velog.io/@marvin-j/React-native-style2</link>
            <guid>https://velog.io/@marvin-j/React-native-style2</guid>
            <pubDate>Sun, 19 Jan 2020 14:34:25 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="일반적인-구조">일반적인 구조</h2>
</blockquote>
<ul>
<li>import 하여 사용하거나</li>
<li>부모가 props 로 넘겨줘서 사용한다.</li>
<li>공유 스타일은 외부에 폴더를 만들어 준다.</li>
</ul>
<pre><code class="language-html">-js
 |- Component
    |- Button
       |- index.js
       |- styles.js
 |- Styles
    |- styles.js
    |- color.js
    |- font.js</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React-native] style1]]></title>
            <link>https://velog.io/@marvin-j/React-native-style1</link>
            <guid>https://velog.io/@marvin-j/React-native-style1</guid>
            <pubDate>Sun, 19 Jan 2020 13:37:16 GMT</pubDate>
            <description><![CDATA[<ul>
<li>인라인으로 생성하는 스타일은 랜더링시 매번 생성된다.</li>
<li>styleSheet.create 로 생성된 스타일은 불변이다(immutable)</li>
</ul>
<blockquote>
<h3 id="inline으로-사용하기">inline으로 사용하기</h3>
</blockquote>
<pre><code class="language-javascript">&lt;Text&gt;
  dog is &lt;Text style={{fontStyle:&#39;italic&#39;}}&gt;Good&lt;/Text&gt;
&lt;/Text&gt;</code></pre>
<blockquote>
<h3 id="오브젝트로-사용하기">오브젝트로 사용하기</h3>
</blockquote>
<pre><code class="language-javascript">const italic = {fontStyle: &#39;intalic&#39;}
...
&lt;Text&gt;
  dog is &lt;Text style={italic}&gt;Good&lt;/Text&gt;
&lt;/Text&gt;</code></pre>
<blockquote>
<h3 id="stylesheetcreate-사용하기">StyleSheet.create() 사용하기</h3>
</blockquote>
<pre><code class="language-javascript">const styles = StlyeSheet.create({
  italic: {fontStyle: &#39;intalic&#39;}
})
...
&lt;Text&gt;
  dog is &lt;Text style={styles.italic}&gt;Good&lt;/Text&gt;
&lt;/Text&gt;</code></pre>
<blockquote>
<h3 id="스타일-병합하기">스타일 병합하기</h3>
<p>-배열로 병합내용을 넣으며 인라인으로도 넣을 수 있다.
-오른쪽의 객체의 스타일이 우선.
-부적값이 있다면 (false, undefined, null) 무시된다.</p>
</blockquote>
<pre><code class="language-javascript">const styles = StlyeSheet.create({
  button: {
    backgroundRadius: &#39;8px&#39;,
    backgroundColor: &#39;#99CCFF&#39;
  },
  accentText: {
    fontSize: 18,
    fontWeight: &#39;bold&#39;
  }
})
...
&lt;Text&gt;
  dog is &lt;Text style={[styles.button, styles.accentText, {color: &#39;#FFFFFF&#39;}]}&gt;Good&lt;/Text&gt;
&lt;/Text&gt;</code></pre>
<blockquote>
<h3 id="조건적인-스타일일-사용하기">조건적인 스타일일 사용하기</h3>
</blockquote>
<pre><code class="language-javascript">&lt;Text&gt;
  dog is &lt;Text style={[styles.button, this.state.isMove &amp;&amp; styles.accentText]}&gt;Good&lt;/Text&gt;
&lt;/Text&gt;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React-native] 컴포넌트]]></title>
            <link>https://velog.io/@marvin-j/React-native-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8</link>
            <guid>https://velog.io/@marvin-j/React-native-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8</guid>
            <pubDate>Sun, 19 Jan 2020 12:42:17 GMT</pubDate>
            <description><![CDATA[<h2 id="view"><View></h2>
<ul>
<li>가장 기본이 되는 뷰 컴포넌트</li>
</ul>
<h2 id="text"><Text></h2>
<ul>
<li>텍스트 문자를 사용할때 </li>
</ul>
<h2 id="image"><Image></h2>
<ul>
<li>내부 파일은 require(&quot;./주소&quot;)</li>
<li>외부 주소는 Url: 사용하고  width, height를 넣어줘야 한다.</li>
<li>파일명에 file.ios.png, file.android.png 를 사용 하여 각 OS 별 이미지를 사용 할 수 있다</li>
<li>파일명 끝에 @2x, @3x 로 지정하면 해상도에 맞는 이미지를 사용하게 된다. (<a href="mailto:file@2x.png">file@2x.png</a>)</li>
</ul>
<h2 id="button"><Button></h2>
<ul>
<li>버튼 컴포넌트</li>
</ul>
<h2 id="touchablehighlight"><TouchableHighlight></h2>
<ul>
<li>버튼, 링크등에 사용</li>
<li>이미지, 텍스트 컴포넌를 안에 넣어서 사용</li>
</ul>
<h2 id="flatlist"><FlatList></h2>
<ul>
<li>일반적인 리스트 뷰</li>
</ul>
<h2 id="sectionlist"><SectionList></h2>
<ul>
<li>섹션이 나눠져있는 리스트뷰</li>
</ul>
<h1 id="navigation-component">Navigation Component</h1>
<h2 id="navigator"><Navigator></h2>
<h2 id="navigationios"><NavigationIOS></h2>
<blockquote>
<h1 id="class">class</h1>
</blockquote>
<h2 id="panresponder">PanResponder</h2>
<ul>
<li>위치정보 등 원시 데이터에 접근가능</li>
<li>setNativeProps()</li>
</ul>
<table>
<thead>
<tr>
<th>컴포넌트</th>
<th>설명</th>
<th>기타</th>
</tr>
</thead>
<tbody><tr>
<td><view></td>
<td>.</td>
<td>.</td>
</tr>
<tr>
<td><Text></td>
<td>.</td>
<td>.</td>
</tr>
<tr>
<td><image></td>
<td>source={}</td>
<td>외부 주소는 Url: 사용하고  width, height를 넣어줘야 한다.</td>
</tr>
</tbody></table>
]]></description>
        </item>
    </channel>
</rss>