<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Developer Story House</title>
    <link>https://maengmo.tistory.com/</link>
    <description>IT계의 큰손이 되고 싶은 개린이의 Log 일지</description>
    <language>ko</language>
    <pubDate>Thu, 18 Jun 2026 10:18:26 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>IT의 큰손</managingEditor>
    <image>
      <title>Developer Story House</title>
      <url>https://tistory1.daumcdn.net/tistory/5443551/attach/c5877c4cee35451fba4ebe2d3e738122</url>
      <link>https://maengmo.tistory.com</link>
    </image>
    <item>
      <title>React STEP 27 - jquery + react</title>
      <link>https://maengmo.tistory.com/464</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;⭐ jquery&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;jQuery는&amp;nbsp;클릭&amp;nbsp;이벤트,&amp;nbsp;체인지&amp;nbsp;이벤트&amp;nbsp;등&amp;nbsp;웹&amp;nbsp;페이지&amp;nbsp;동작의&amp;nbsp;기능을&amp;nbsp;조작할&amp;nbsp;때&amp;nbsp;브라우저의&amp;nbsp;영향을&amp;nbsp;받지&amp;nbsp;않고&amp;nbsp;원하는&amp;nbsp;기능을&amp;nbsp;제작할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;브라우저의&amp;nbsp;버전에&amp;nbsp;따라&amp;nbsp;작동하지&amp;nbsp;않는&amp;nbsp;코드를&amp;nbsp;&amp;nbsp;jQuery로&amp;nbsp;변경해서&amp;nbsp;사용하면&amp;nbsp;브라우저&amp;nbsp;문제&amp;nbsp;없이&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jquery.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jquery.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1741067404665&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;jQuery&quot; data-og-description=&quot;What is jQuery? jQuery is a fast, small, and feature-rich JavaScript library. It makes things like HTML document traversal and manipulation, event handling, animation, and Ajax much simpler with an easy-to-use API that works across a multitude of browsers.&quot; data-og-host=&quot;jquery.com&quot; data-og-source-url=&quot;https://jquery.com/&quot; data-og-url=&quot;https://jquery.com/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://jquery.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jquery.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;jQuery&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;What is jQuery? jQuery is a fast, small, and feature-rich JavaScript library. It makes things like HTML document traversal and manipulation, event handling, animation, and Ajax much simpler with an easy-to-use API that works across a multitude of browsers.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jquery.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. jquery install&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;install&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741067446494&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install jquery&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;import&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741067458547&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import $ from 'jquery';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 페이지 구조 생성하기&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;jquery.css&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741076034188&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@import url(https://fonts.googleapis.com/css?family=Roboto+Slab:300,400,700);

body, h1, h2, h3, h4, h5, h6, p, ul, ol, table, dl, dd {
	margin: 0;
	padding: 0;
}
h1 {
	font-size: 16px;
}
a {
	text-decoration: none;
	color: #000;
}
ul, ol {
	list-style: none;
}
img {
	max-width: 100%;
	vertical-align: top;
	border: none;
}
body {
	font-family: &quot;Roboto Slab&quot;, serif;
	font-size: 16px;
	font-weight: 400;
}
#header {
	position: fixed;
	left: 0;
	top: 0;
	padding: 0 22px;
	width: 316px;
	height: 100%;
	background-color: #f5f6f8;
	box-sizing: border-box;
	transition: left 0.4s;
}
#header .title_area {
	position: relative;
	margin-top: 20px;
	width: 64px;
	height: 40px;
	line-height: 40px;
}
#header .title_area::after {
	content: &quot;&quot;;
	display: block;
	position: absolute;
	top: 100%;
	width: 100%;
	height: 3px;
	background-color: #f66a69;
}
#header .title_area h2 {
	font-size: 15px;
	font-weight: 700;
}
#menu {
	margin-top: 34px;
}
#menu &amp;gt; ul &amp;gt; li {
	border-bottom: 1px solid #e1e1e1;
}
#menu &amp;gt; ul &amp;gt; li &amp;gt; a {
	display: block;
	line-height: 46px;
	text-transform: uppercase;
	font-size: 12px;
	font-weight: 400;
	color: #4a4a4a;
}
#menu ul ul {
	display: none;
	margin-bottom: 16px;
}
#menu &amp;gt; ul &amp;gt; li.active &amp;gt; a {
	color: #f66a69;
}
#menu &amp;gt; ul &amp;gt; li.active ul {
	display: block;
}
#menu ul ul a {
	display: block;
	padding-left: 12px;
	line-height: 36px;
	text-transform: uppercase;
	font-size: 12px;
	color: #bfbfbf;
}
.right_area {
	margin-left: 316px;
	width: auto;
	height: 800px;
	transition: margin-left 0.4s;
}
.right_area .tab {
	display: none;
	margin: 12px 0 0 12px;
	width: 60px;
	height: 42px;
	text-indent: -9999px;
	background: url(/public/assets/images/ico/btn_tab.jpg) no-repeat;
}

@media only screen and (max-width: 736px) {
	#header {
		left: -316px;
	}
	#header.open {
		left: 0;
	}
	.right_area .tab {
		display: block;
	}
	.right_area {
		margin-left: 0;
	}
	.right_area.open {
		margin-left: 316px;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;App.js&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741076052481&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { Component } from 'react';
import Header from './js2/step4/Header';
import Content from './js2/step4/Content';
import './css/jquery.css';

class App extends Component {
	render(){
		return(
			&amp;lt;div className=&quot;wrap&quot;&amp;gt;
				&amp;lt;Header /&amp;gt;
				&amp;lt;Content /&amp;gt;
			&amp;lt;/div&amp;gt;
		);
	}
}

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Header.js&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741076066910&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { Component } from 'react';
import $ from 'jquery';

class Header extends Component {
	componentDidMount(){
		$(window).on(&quot;resize&quot;, function(){
			if($(window).width() &amp;gt; 736 &amp;amp;&amp;amp; $(&quot;#header&quot;).hasClass(&quot;open&quot;) === true){
				$(&quot;#header&quot;).removeClass(&quot;open&quot;);
				$(&quot;.right_area&quot;).removeClass(&quot;open&quot;);
			}
		});
		$(&quot;.tab&quot;).on(&quot;click&quot;, function(e){
			e.preventDefault();

			if($(window).width() &amp;gt; 735) return;

			if($(&quot;#header&quot;).hasClass(&quot;open&quot;) === true){
				$(&quot;#header&quot;).removeClass(&quot;open&quot;);
				$(&quot;.right_area&quot;).removeClass(&quot;open&quot;);
			}
			else{
				$(&quot;#header&quot;).addClass(&quot;open&quot;);
				$(&quot;.right_area&quot;).addClass(&quot;open&quot;);
			}
		});
		$(&quot;#menu &amp;gt; ul &amp;gt; li&quot;).on(&quot;click&quot;, function(e){
			e.preventDefault();

			let idx=$(this).index();

			for(let i=0; i&amp;lt;$(&quot;#menu &amp;gt; ul &amp;gt; li&quot;).length; i++){
				if(i === idx){
					$(&quot;#menu &amp;gt; ul &amp;gt; li&quot;).eq(i).addClass(&quot;active&quot;);
				}
				else{
					$(&quot;#menu &amp;gt; ul &amp;gt; li&quot;).eq(i).removeClass(&quot;active&quot;);
				}
			}
		});
	}

	render(){
		return(
			&amp;lt;header id=&quot;header&quot;&amp;gt;
				&amp;lt;div className=&quot;title_area&quot;&amp;gt;
					&amp;lt;h2&amp;gt;Menu&amp;lt;/h2&amp;gt;
				&amp;lt;/div&amp;gt;
				&amp;lt;nav id=&quot;menu&quot;&amp;gt;
					&amp;lt;ul&amp;gt;
						&amp;lt;li&amp;gt;
							&amp;lt;a href=&quot;&quot;&amp;gt;homepage&amp;lt;/a&amp;gt;
							&amp;lt;ul className=&quot;sub&quot;&amp;gt;
								&amp;lt;li&amp;gt;&amp;lt;a href=&quot;&quot;&amp;gt;lorem dolor&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
								&amp;lt;li&amp;gt;&amp;lt;a href=&quot;&quot;&amp;gt;ipsum adipiscing&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
								&amp;lt;li&amp;gt;&amp;lt;a href=&quot;&quot;&amp;gt;tempus magna&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
								&amp;lt;li&amp;gt;&amp;lt;a href=&quot;&quot;&amp;gt;feugiat veroeros&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
							&amp;lt;/ul&amp;gt;
						&amp;lt;/li&amp;gt;
						&amp;lt;li&amp;gt;
							&amp;lt;a href=&quot;&quot;&amp;gt;generic&amp;lt;/a&amp;gt;
							&amp;lt;ul className=&quot;sub&quot;&amp;gt;
								&amp;lt;li&amp;gt;&amp;lt;a href=&quot;&quot;&amp;gt;lorem dolor&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
								&amp;lt;li&amp;gt;&amp;lt;a href=&quot;&quot;&amp;gt;ipsum adipiscing&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
								&amp;lt;li&amp;gt;&amp;lt;a href=&quot;&quot;&amp;gt;tempus magna&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
								&amp;lt;li&amp;gt;&amp;lt;a href=&quot;&quot;&amp;gt;feugiat veroeros&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
							&amp;lt;/ul&amp;gt;
						&amp;lt;/li&amp;gt;
						&amp;lt;li&amp;gt;&amp;lt;a href=&quot;&quot;&amp;gt;elements&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
						&amp;lt;li&amp;gt;&amp;lt;a href=&quot;&quot;&amp;gt;submenu&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
					&amp;lt;/ul&amp;gt;
				&amp;lt;/nav&amp;gt;
			&amp;lt;/header&amp;gt;
		);
	}
}

export default Header;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Content.js&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741076083381&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { Component } from 'react';

class Content extends Component {
	render(){
		return(
			&amp;lt;div className=&quot;right_area&quot;&amp;gt;
                &amp;lt;a href=&quot;&quot; className=&quot;tab&quot;&amp;gt;Tab Menu&amp;lt;/a&amp;gt;
            &amp;lt;/div&amp;gt;
		);
	}
}

export default Content;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결과 - PC&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1914&quot; data-origin-height=&quot;1065&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLbM7I/btsMz6z4naW/4s1SR7eliRw86xItEc1kz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLbM7I/btsMz6z4naW/4s1SR7eliRw86xItEc1kz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLbM7I/btsMz6z4naW/4s1SR7eliRw86xItEc1kz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLbM7I%2FbtsMz6z4naW%2F4s1SR7eliRw86xItEc1kz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1914&quot; height=&quot;1065&quot; data-origin-width=&quot;1914&quot; data-origin-height=&quot;1065&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;894&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMWmVQ/btsMB2ivPQE/fWH6pFKHwxZZsvMzkkzkB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMWmVQ/btsMB2ivPQE/fWH6pFKHwxZZsvMzkkzkB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMWmVQ/btsMB2ivPQE/fWH6pFKHwxZZsvMzkkzkB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMWmVQ%2FbtsMB2ivPQE%2FfWH6pFKHwxZZsvMzkkzkB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;418&quot; height=&quot;894&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;894&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>React</category>
      <category>example</category>
      <category>Front</category>
      <category>jquery</category>
      <category>js</category>
      <category>Native</category>
      <category>Node.js</category>
      <category>npm</category>
      <category>React</category>
      <category>WEB</category>
      <category>반응형</category>
      <author>IT의 큰손</author>
      <guid isPermaLink="true">https://maengmo.tistory.com/464</guid>
      <comments>https://maengmo.tistory.com/464#entry464comment</comments>
      <pubDate>Tue, 4 Mar 2025 17:17:11 +0900</pubDate>
    </item>
    <item>
      <title>React STEP 26 - gsap + react</title>
      <link>https://maengmo.tistory.com/463</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;⭐ Gsap&lt;/p&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;li&gt;GSAP를 이용해서 멋진 인터랙티브한 웹사이트를 만들 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://greensock.com/react&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://greensock.com/react&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/gsap&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.npmjs.com/package/gsap&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1741064410414&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;gsap&quot; data-og-description=&quot;GSAP is a framework-agnostic JavaScript animation library that turns developers into animation superheroes. Build high-performance animations that work in **every** major browser. Animate CSS, SVG, canvas, React, Vue, WebGL, colors, strings, motion paths,.&quot; data-og-host=&quot;www.npmjs.com&quot; data-og-source-url=&quot;https://www.npmjs.com/package/gsap&quot; data-og-url=&quot;https://www.npmjs.com/package/gsap&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/tHoZs/hyYmQqKJRO/57Ek6F8qlvtXlGFIPt0qR1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/8402t/hyYmUzVMZJ/NneBX0PKdlUToAlRvpoje1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/mgYCb/hyYnao6ITp/zLYFNQG6OvlQlpwbeLosw0/img.jpg?width=480&amp;amp;height=252&amp;amp;face=0_0_480_252&quot;&gt;&lt;a href=&quot;https://www.npmjs.com/package/gsap&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.npmjs.com/package/gsap&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/tHoZs/hyYmQqKJRO/57Ek6F8qlvtXlGFIPt0qR1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/8402t/hyYmUzVMZJ/NneBX0PKdlUToAlRvpoje1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/mgYCb/hyYnao6ITp/zLYFNQG6OvlQlpwbeLosw0/img.jpg?width=480&amp;amp;height=252&amp;amp;face=0_0_480_252');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;gsap&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;GSAP is a framework-agnostic JavaScript animation library that turns developers into animation superheroes. Build high-performance animations that work in **every** major browser. Animate CSS, SVG, canvas, React, Vue, WebGL, colors, strings, motion paths,.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.npmjs.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. gsap install&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;install&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741064439258&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install gsap&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;import&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741064497121&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import gsap from 'gsap';
import ScrollToPlugin from 'gsap/ScrollToPlugin';

gsap.registerPlugin(ScrollToPlugin);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. gsap - step1&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;기본 구조 및 css 정의&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;gsap1.css&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741064776088&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@import url(https://fonts.googleapis.com/css?family=Open+Sans:400,300,300italic,400italic,600,600italic,700,700italic,800,800italic);

body, h1, h2, h3, h4, h5, h6, p, ul, ol, table, dl, dd {
	margin: 0;
	padding: 0;
}
h1 {
	font-size: 16px;
}
a {
	text-decoration: none;
	color: #000;
}
ul, ol {
	list-style: none;
}
img {
	max-width: 100%;
	vertical-align: top;
	border: none;
}
body {
	margin: 20px;
	padding: 20px;
	line-height: 1;
	font-family: &quot;Open Sans&quot;, sans-serif;
	font-size: 1em;
	background-color: #f1f1f1;
	color: #555;
}
.title {
	margin: 0;
	padding: 0;
	font-size: 1.5em;
	font-weight: 300;
	color: #555;
}
.container {
	margin-top: 50px;
}
.ball {
	position: absolute;
	left: 0;
	top: 200px;
	width: 50px;
	height: 50px;
	background-color: #8ac007;
	border-radius: 25px;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;App.js&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741065171412&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { Component, Fragment } from 'react';
import './App.css';
import gsap from 'gsap';
import './css/gsap1.css';

 class App extends Component {
    componentDidMount() {
        let ball = document.getElementsByClassName(&quot;ball&quot;)[0];

        ball.addEventListener(&quot;click&quot;, function() {
            gsap.fromTo(ball, {opacity: 0}, {opacity: 1, left: 300, duration: 0.3, delay: 2});
        });
    }

    render() {
        return (
            &amp;lt;Fragment&amp;gt;
                &amp;lt;h1 className='title'&amp;gt;basic :: React Example&amp;lt;/h1&amp;gt;
                &amp;lt;div className='container'&amp;gt;
                    &amp;lt;div className='ball'&amp;gt;&amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/Fragment&amp;gt;
        )
    }
 }

 export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. gsap - step2&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;헤더, 콘텐트, Scroll Page 만들기&lt;/li&gt;
&lt;li&gt;gsap2.css&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741066567522&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@import url(https://fonts.googleapis.com/css?family=Open+Sans:400,300,300italic,400italic,600,600italic,700,700italic,800,800italic);

body, h1, h2, h3, h4, h5, h6, p, ul, ol, table, dl, dd {
	margin: 0;
	padding: 0;
}
h1 {
	font-size: 16px;
}
a {
	text-decoration: none;
	color: #2f2f2f;
}
ul, ol {
	list-style: none;
}
img {
	max-width: 100%;
	vertical-align: top;
	border: none;
}
body {
	line-height: 1;
	font-family: &quot;Open Sans&quot;, sans-serif;
	font-size: 1em;
}
.top {
	position: absolute;
	left: 0;
	top: 0;
	width: 100%;
	min-width: 1100px;
	background-color: transparent;
}
.top.fixed {
	position: fixed;
	background-color: rgba(0,0,0,.1);
}
.top .top_inner {
	margin: 0 auto;
	padding: 30px 0;
	width: 1100px;
	height: 100px;
	box-sizing: border-box;
}
.top .logo {
	float: left;
	height: 40px;
}
.top .logo a img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
}
#gnb {
	float: left;
	margin-left: 80px;
}
#gnb li {
	display: inline-block;
}
#gnb li a {
	display: block;
	padding: 0 25px;
	line-height: 40px;
	text-transform: uppercase;
	font-size: 0.875em;
	font-weight: 400;
	color: #000;
}
#gnb li a:hover,
#gnb li.active a {
	color: #e5493a;
}
.content div {
	padding: 120px 40px 40px;
	height: 900px;
	text-transform: uppercase;
	font-size: 2em;
	font-weight: 300;
	color: #ccc;
	border-bottom: 1px solid #eaeaea;
	box-sizing: border-box;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;App.js&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741066548060&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { Component, Fragment } from 'react';
import './App.css';
import gsap from 'gsap';
import './css/gsap2.css';
import Logo from './js2/step3/Logo';
import Navigation from './js2/step3/Navigation';
import Content from './js2/step3/Content';

 class App extends Component {
    render() {
        return (
            &amp;lt;div className='container'&amp;gt;
                &amp;lt;div className='top'&amp;gt;
                    &amp;lt;div className=&quot;top_inner&quot;&amp;gt;
                        &amp;lt;Logo /&amp;gt;
                        &amp;lt;Navigation /&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;Content /&amp;gt;
            &amp;lt;/div&amp;gt;
        )
    }
 }

 export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Content.js : Content의 영역을 담을 컴포넌트&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741066598827&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { Component } from 'react';
import ContentList from './ContentList';

class Content extends React.Component {
    render() {
        return (
            &amp;lt;div className='content'&amp;gt;
                &amp;lt;ContentList id=&quot;area1&quot;&amp;gt;content1&amp;lt;/ContentList&amp;gt;
                &amp;lt;ContentList id=&quot;area2&quot;&amp;gt;content2&amp;lt;/ContentList&amp;gt;
                &amp;lt;ContentList id=&quot;area3&quot;&amp;gt;content3&amp;lt;/ContentList&amp;gt;
                &amp;lt;ContentList id=&quot;area4&quot;&amp;gt;content4&amp;lt;/ContentList&amp;gt;
                &amp;lt;ContentList id=&quot;area5&quot;&amp;gt;content5&amp;lt;/ContentList&amp;gt;
                &amp;lt;ContentList id=&quot;area6&quot;&amp;gt;content6&amp;lt;/ContentList&amp;gt;
                &amp;lt;ContentList id=&quot;area7&quot;&amp;gt;content7&amp;lt;/ContentList&amp;gt;
                &amp;lt;ContentList id=&quot;area8&quot;&amp;gt;content8&amp;lt;/ContentList&amp;gt;
            &amp;lt;/div&amp;gt;
        )
    }
}

export default Content;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ContentList.js : Content의 공통 사용 컴포넌트&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741066619033&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { Component } from 'react';

class ContentList extends React.Component {
    render() {
        return (
            &amp;lt;div id={this.props.id}&amp;gt;{this.props.children}&amp;lt;/div&amp;gt;
        );
    }
}

export default ContentList;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Logo.js : 헤더의 로고 컴포넌트&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741066635684&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { Component } from 'react';

class Logo extends React.Component {
    render() {
        return (
            &amp;lt;h1 className='logo'&amp;gt;
                &amp;lt;a href=''&amp;gt;
                    &amp;lt;img src=&quot;/assets/images/logo.png&quot; alt='logo'&amp;gt;&amp;lt;/img&amp;gt;
                &amp;lt;/a&amp;gt;
            &amp;lt;/h1&amp;gt;
        )
    }
}

export default Logo;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Navigation.js : 실제 Navagation 행위가 이루어질 컴포넌트&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741066655191&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { Component } from 'react';
import gsap from 'gsap';
import ScrollToPlugin from 'gsap/ScrollToPlugin';

class Navigation extends Component {
    componentDidMount() {
        gsap.registerPlugin(ScrollToPlugin);

        let n = 0;
        let t = 0;
        let targety = 0;
        let scrollTimer = 0;
        let winHalf;

        let top = document.getElementsByClassName(&quot;top&quot;)[0];
        let content=document.getElementsByClassName(&quot;content&quot;)[0];
		let contentLi=content.children;
		let gnb=document.getElementById(&quot;gnb&quot;);
		let gnbLi=gnb.firstElementChild.children;
		gnbLi[n].classList.add(&quot;active&quot;);

		let init=() =&amp;gt; winHalf=window.innerHeight/2;

		init();
        window.addEventListener(&quot;resize&quot;, init);

		window.addEventListener(&quot;scroll&quot;, () =&amp;gt; {
			clearTimeout(scrollTimer);

			scrollTimer=setTimeout(() =&amp;gt; {
				t=window.scrollY;

				if(t &amp;lt; contentLi[1].offsetTop-winHalf){
					n=0;
				}
				else if(t &amp;lt; contentLi[2].offsetTop-winHalf){
					n=1;
				}
				else if(t &amp;lt; contentLi[3].offsetTop-winHalf){
					n=2;
				}
				else if(t &amp;lt; contentLi[4].offsetTop-winHalf){
					n=3;
				}
				else if(t &amp;lt; contentLi[5].offsetTop-winHalf){
					n=4;
				}
				else if(t &amp;lt; contentLi[6].offsetTop-winHalf){
					n=5;
				}
				else if(t &amp;lt; contentLi[7].offsetTop-winHalf){
					n=6;
				}
				else{
					n=7;
				}

				// console.log(&quot;n : &quot;+n);

				for(let i=0; i&amp;lt;gnbLi.length; i++){
					if(i === n){
						gnbLi[i].classList.add(&quot;active&quot;);
					}
					else{
						gnbLi[i].classList.remove(&quot;active&quot;);
					}
				}

				if(t &amp;gt; 80){
					if(top.classList.contains(&quot;fixed&quot;) === false){
						top.classList.add(&quot;fixed&quot;);
						gsap.fromTo(top, {top: -100}, {top: 0, duration: 0.3, delay: 0.5});
					}
				}
				else{
					if(top.classList.contains(&quot;fixed&quot;) === true){
						top.classList.remove(&quot;fixed&quot;);
						top.removeAttribute(&quot;style&quot;);
					}
				}
			}, 50);
		});

		for(let i=0; i&amp;lt;gnbLi.length; i++){
			gnbLi[i].addEventListener(&quot;click&quot;, e =&amp;gt; {
				e.preventDefault();
				targety=contentLi[i].offsetTop;
				gsap.to(window, {scrollTo: targety, duration: 0.5});
			});
		}		
	}

	render(){
		return(
			&amp;lt;nav id=&quot;gnb&quot;&amp;gt;
				&amp;lt;ul&amp;gt;
					&amp;lt;li&amp;gt;&amp;lt;a href=&quot;#area1&quot;&amp;gt;HOME&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
					&amp;lt;li&amp;gt;&amp;lt;a href=&quot;#area2&quot;&amp;gt;ABOUT US&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
					&amp;lt;li&amp;gt;&amp;lt;a href=&quot;#area3&quot;&amp;gt;PAGES&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
					&amp;lt;li&amp;gt;&amp;lt;a href=&quot;#area4&quot;&amp;gt;FEATURES&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
					&amp;lt;li&amp;gt;&amp;lt;a href=&quot;#area5&quot;&amp;gt;PORTFOLIO&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
					&amp;lt;li&amp;gt;&amp;lt;a href=&quot;#area6&quot;&amp;gt;BLOG&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
					&amp;lt;li&amp;gt;&amp;lt;a href=&quot;#area7&quot;&amp;gt;SHOP&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
					&amp;lt;li&amp;gt;&amp;lt;a href=&quot;#area8&quot;&amp;gt;CONTACT US&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
				&amp;lt;/ul&amp;gt;
			&amp;lt;/nav&amp;gt;
		);
	}
}

export default Navigation;&lt;/code&gt;&lt;/pre&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1889&quot; data-origin-height=&quot;1052&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YqfdY/btsMzRpqK9d/2CwvyM3BDIled06905r5l0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YqfdY/btsMzRpqK9d/2CwvyM3BDIled06905r5l0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YqfdY/btsMzRpqK9d/2CwvyM3BDIled06905r5l0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYqfdY%2FbtsMzRpqK9d%2F2CwvyM3BDIled06905r5l0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1889&quot; height=&quot;1052&quot; data-origin-width=&quot;1889&quot; data-origin-height=&quot;1052&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>React</category>
      <category>Component</category>
      <category>example</category>
      <category>Front</category>
      <category>gsap</category>
      <category>gsap+react</category>
      <category>js</category>
      <category>Navigation</category>
      <category>Node.js</category>
      <category>npm</category>
      <category>React</category>
      <author>IT의 큰손</author>
      <guid isPermaLink="true">https://maengmo.tistory.com/463</guid>
      <comments>https://maengmo.tistory.com/463#entry463comment</comments>
      <pubDate>Tue, 4 Mar 2025 14:43:32 +0900</pubDate>
    </item>
    <item>
      <title>React STEP 25 - 기본 구조 사용하기</title>
      <link>https://maengmo.tistory.com/462</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;⭐ React 기본 구조&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTML : 컴포넌트 방식으로 로딩합니다.&lt;/li&gt;
&lt;li&gt;CSS : import 방식으로 로딩합니다.&lt;/li&gt;
&lt;li&gt;Script: 생명주기 함수로 스크립트 작업을 할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Form 형식 페이지&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본 사용 Form 페이지, title, description, form 각각의 컴포넌트로 분리 및 사용&lt;/li&gt;
&lt;li&gt;App.js&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741053416982&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { Component } from 'react';
import './App.css';
import './css/basic1.css';
import Component1 from './js2/Component1_1';
import Component2 from './js2/Component1_2';
import Component3 from './js2/Component1_3';

 class App extends Component {
    constructor(){
		super();

		this.state={
			title: &quot;Contact Me&quot;,
			description: &quot;Integer eu ante ornare amet commetus vestibulum blandit integer in curae ac faucibus integer non. Adipiscing cubilia elementum integer. Integer eu ante ornare amet commetus.&quot;
		};
	}

	render(){
		return(
			&amp;lt;div className=&quot;container&quot;&amp;gt;
				&amp;lt;section id=&quot;contact&quot;&amp;gt;
					&amp;lt;Component1 propsValue={this.state.title} /&amp;gt;
					&amp;lt;Component2 propsValue={this.state.description} /&amp;gt;
					&amp;lt;Component3 /&amp;gt;
				&amp;lt;/section&amp;gt;
			&amp;lt;/div&amp;gt;
		);
	}
 }

 export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Component1_1.js ~ Component1_3.js&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741053592336&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { Component } from 'react';

class Component1_1 extends React.Component {
    render() {
        return (
            &amp;lt;h2&amp;gt;{this.props.propsValue}&amp;lt;/h2&amp;gt;
        );
    }
}

export default Component1_1;

import React, { Component } from 'react';

class Component1_2 extends Component {
    render() {
        return (
            &amp;lt;p&amp;gt;{this.props.propsValue}&amp;lt;/p&amp;gt;
        );
    }
}

export default Component1_2;

import React, { Component } from 'react';

class Component1_3 extends Component {
    render() {
        return (
            &amp;lt;form&amp;gt;
                &amp;lt;input type=&quot;text&quot; placeholder='Name' className='name' /&amp;gt;
                &amp;lt;input type=&quot;email&quot; placeholder=&quot;Email&quot; className=&quot;email&quot; /&amp;gt;
				&amp;lt;input type=&quot;text&quot; placeholder=&quot;Subject&quot; className=&quot;subject&quot; /&amp;gt;
				&amp;lt;textarea placeholder=&quot;Message&quot; className=&quot;message&quot; /&amp;gt;
				&amp;lt;input type=&quot;submit&quot; value=&quot;Send Message&quot; /&amp;gt;
				&amp;lt;input type=&quot;reset&quot; value=&quot;Reset Form&quot; /&amp;gt;
            &amp;lt;/form&amp;gt;
        );
    }
}

export default Component1_3;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/deRPHJ/btsMBEoqP9J/QFaH0vSTrgNQrQQbLZGg61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/deRPHJ/btsMBEoqP9J/QFaH0vSTrgNQrQQbLZGg61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/deRPHJ/btsMBEoqP9J/QFaH0vSTrgNQrQQbLZGg61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdeRPHJ%2FbtsMBEoqP9J%2FQFaH0vSTrgNQrQQbLZGg61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1044&quot; height=&quot;472&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 푸터 사용하기&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본 사용 Footer : List 형식으로 요소들을 state를 사용하여 동적 반영&lt;/li&gt;
&lt;li&gt;App.js&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741064066631&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { Component } from 'react';
import './App.css';
import './css/basic2.css';
import Component1 from './js2/step2/Component2_1';
import Component2 from './js2/step2/Component2_2';
import Component3 from './js2/step2/Component2_3';

 class App extends Component {
    constructor(){
		super();

		this.state={
			logo: &quot;React Example&quot;,
            navigation: [
                {menu : &quot;Tutorials&quot;},
                {menu : &quot;Referenece&quot;},
                {menu : &quot;Example&quot;}
            ],
            sns: [
                {icon: &quot;facebook&quot;},
                {icon: &quot;twitter&quot;},
                {icon: &quot;google-plus&quot;}
            ]
		};
	}

	render(){
		return(
			&amp;lt;section className=&quot;main&quot;&amp;gt;
				&amp;lt;footer&amp;gt;
					&amp;lt;div className=&quot;wrap&quot;&amp;gt;
						&amp;lt;Component1 propsValue={this.state.logo} /&amp;gt;
						&amp;lt;Component2 propsValue={this.state.navigation} /&amp;gt;
						&amp;lt;Component3 propsValue={this.state.sns} /&amp;gt;
					&amp;lt;/div&amp;gt;
				&amp;lt;/footer&amp;gt;
			&amp;lt;/section&amp;gt;
		);
	}
 }

 export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Component2_1.js ~ Component2_3.js&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741064124936&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { Component } from 'react';

class Component2_1 extends React.Component {
    render() {
        return (
            &amp;lt;div className='logo'&amp;gt;
                &amp;lt;a href=''&amp;gt;
                    {this.props.propsValue}
                &amp;lt;/a&amp;gt;
            &amp;lt;/div&amp;gt;
        )
    }
}

export default Component2_1;

import React, { Component } from 'react';

class Component2_2 extends React.Component {
    constructor(props) {
        super();

        this.state= {
            navigationData : props.propsValue
        }
    }

    render() {
        let data = this.state.navigationData;

        let navigationList = data.map((d, i) =&amp;gt; &amp;lt;li key={i+1}&amp;gt;
            &amp;lt;a href=&quot;&quot;&amp;gt;
                {d.menu}
            &amp;lt;/a&amp;gt;
        &amp;lt;/li&amp;gt;);

        return (
            &amp;lt;div className='navi'&amp;gt;
                &amp;lt;ul&amp;gt;
                    {navigationList}
                &amp;lt;/ul&amp;gt;
            &amp;lt;/div&amp;gt;
        )
    }
}

export default Component2_2;

import React, { Component } from 'react';

class Component2_3 extends React.Component {
    constructor(props) {
        super();

        this.state = {
            snsData : props.propsValue 
        };
    }

    render() {
        let data = this.state.snsData;

        let snsList = data.map((d, i) =&amp;gt; 
        &amp;lt;li key={i+1}&amp;gt;
            &amp;lt;a href='' className={&quot;fa fa-&quot; + d.icon} title={d.icon}&amp;gt;&amp;lt;/a&amp;gt;
        &amp;lt;/li&amp;gt;)

        return (
            &amp;lt;div className='sns'&amp;gt;
                &amp;lt;ul className='clearfix'&amp;gt;
                    {snsList}
                &amp;lt;/ul&amp;gt;
            &amp;lt;/div&amp;gt;
        );
    }
}

export default Component2_3;&lt;/code&gt;&lt;/pre&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1157&quot; data-origin-height=&quot;136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMKylI/btsMzd0qVmq/49ZyRWzrGbgCbj6yzM0Fb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMKylI/btsMzd0qVmq/49ZyRWzrGbgCbj6yzM0Fb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMKylI/btsMzd0qVmq/49ZyRWzrGbgCbj6yzM0Fb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMKylI%2FbtsMzd0qVmq%2F49ZyRWzrGbgCbj6yzM0Fb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1157&quot; height=&quot;136&quot; data-origin-width=&quot;1157&quot; data-origin-height=&quot;136&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>React</category>
      <category>Component</category>
      <category>css</category>
      <category>example</category>
      <category>Front</category>
      <category>html</category>
      <category>js</category>
      <category>Node.js</category>
      <category>npm</category>
      <category>React</category>
      <category>WEB</category>
      <author>IT의 큰손</author>
      <guid isPermaLink="true">https://maengmo.tistory.com/462</guid>
      <comments>https://maengmo.tistory.com/462#entry462comment</comments>
      <pubDate>Tue, 4 Mar 2025 13:58:13 +0900</pubDate>
    </item>
    <item>
      <title>React STEP 24 - TODO 리스트 예제</title>
      <link>https://maengmo.tistory.com/461</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;⭐ TODO LIST&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 단계 1&lt;/p&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;li&gt;AddTask.js&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1739256014388&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class AddTask extends React.Component {
    render() {
        let inputStyle = {
            marginTop : 20,
            padding: &quot;0px 10px&quot;,
            width: 125,
            lineHeight: &quot;32px&quot;,
            fontSize : 14,
            border: &quot;1px solid #ccc&quot;
        };
        let buttonStyle = {
            margin: &quot;20px 0px 0px 5px&quot;,
            padding: 10,
            fontSize: 14,
            backgroundColor: &quot;#999&quot;,
            color: &quot;#fff&quot;,
            border: &quot;none&quot;,
            cursor: &quot;pointer&quot;
        };

        return (
            &amp;lt;div className=&quot;main&quot;&amp;gt;
                &amp;lt;div className=&quot;header&quot;&amp;gt;
                    &amp;lt;form&amp;gt;
                        &amp;lt;input type=&quot;text&quot; placeholder='Add Task' style={inputStyle}&amp;gt;
                        &amp;lt;/input&amp;gt;
                        &amp;lt;button type=&quot;submit&quot; style={buttonStyle}&amp;gt;Added&amp;lt;/button&amp;gt;
                    &amp;lt;/form&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
        )
    }
}

export default AddTask;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 단계 2&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;React에서의 ref 속성은 HTML 요소의 레퍼런스를 변수에 저장하기 위해서 사용합니다.&lt;/li&gt;
&lt;li&gt;특히 &amp;lt;input&amp;gt; 을 통해 변수를 저장할 때 유용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1739256555617&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class AddTask2 extends React.Component {
    addTask(e) {
        e.preventDefault();
        console.log(this._input.value);
    }

    render() {
        let inputStyle={
            marginTop: 20,
            padding: &quot;0px 10px&quot;,
            width: 125,
            lineHeight: &quot;32px&quot;,
            fontSize: 14,
            border: &quot;1px solid #ccc&quot;
        };
        let buttonStyle={
            margin: &quot;20px 0px 0px 5px&quot;,
            padding: 10,
            fontSize: 14,
            backgroundColor: &quot;#999&quot;,
            color: &quot;#fff&quot;,
            border: &quot;none&quot;,
            cursor: &quot;pointer&quot;
        };

        return (
            &amp;lt;div className='main'&amp;gt;
                &amp;lt;div className=&quot;header&quot;&amp;gt;
                    &amp;lt;form onSubmit={this.addTask.bind(this)}&amp;gt;
                        &amp;lt;input type='text' placeholder='Add Task' style={inputStyle} 
                        ref={
                            function(e) {
                                this._input=e;
                            }.bind(this)
                        }
                        &amp;gt;&amp;lt;/input&amp;gt;
                        &amp;lt;button type='submit' style={buttonStyle}&amp;gt;Added&amp;lt;/button&amp;gt;
                    &amp;lt;/form&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
        )
    }
}

export default AddTask2;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 단계 3&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;state를 활용&lt;/li&gt;
&lt;li&gt;state -&amp;gt; tasks:[] -&amp;gt; taskArray&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1739257073293&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class AddTask3 extends React.Component {
    constructor() {
        super();

        this.state = {
            tasks: []
        }
    }

    addTask = e =&amp;gt; {
        e.preventDefault();

        let taskArray = this.state.tasks;

        if(this._input.value != '') {
            taskArray.push(
                {
                    key: Date.now(),
                    msg: this._input.value
                }
            );
        }

        console.log(taskArray);
    };

    render() {
        let inputStyle={
            marginTop: 20,
            padding: &quot;0px 10px&quot;,
            width: 125,
            lineHeight: &quot;32px&quot;,
            fontSize: 14,
            border: &quot;1px solid #ccc&quot;
        };
        let buttonStyle={
            margin: &quot;20px 0px 0px 5px&quot;,
            padding: 10,
            fontSize: 14,
            backgroundColor: &quot;#999&quot;,
            color: &quot;#fff&quot;,
            border: &quot;none&quot;,
            cursor: &quot;pointer&quot;
        };

        return (
            &amp;lt;div className=&quot;main&quot;&amp;gt;
                &amp;lt;div className=&quot;header&quot;&amp;gt;
                    &amp;lt;form onSubmit={this.addTask}&amp;gt;
                        &amp;lt;input
                            type=&quot;text&quot;
                            placeholder=&quot;Add Task&quot;
                            style={inputStyle}
                            ref={e =&amp;gt; this._input=e}
                        &amp;gt;
                        &amp;lt;/input&amp;gt;
                        &amp;lt;button type=&quot;submit&quot; style={buttonStyle}&amp;gt;Added&amp;lt;/button&amp;gt;
                    &amp;lt;/form&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
        )
    }
}

export default AddTask3;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 단계 4&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;setState() 를 사용해, 상태를 업데이트&lt;/li&gt;
&lt;li&gt;등록되는 항목에 대한 List&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1739258252908&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class AddTask4 extends React.Component {
    constructor() {
        super();
        
        this.state = {
            tasks : []
        };
    }

    addTask = e =&amp;gt; {
        e.preventDefault();

        let taskArray = this.state.tasks;

        if(this._input.value !='') {
            taskArray.push(
                {
                    key: Date.now(),
                    msg: this._input.value
                }
            );
        }
        this.setState({
            tasks: taskArray
        });
    }
    
    render() {
        let inputStyle={
            marginTop: 20,
            padding: &quot;0px 10px&quot;,
            width: 125,
            lineHeight: &quot;32px&quot;,
            fontSize: 14,
            border: &quot;1px solid #ccc&quot;
        };
        let buttonStyle={
            margin: &quot;20px 0px 0px 5px&quot;,
            padding: 10,
            fontSize: 14,
            backgroundColor: &quot;#999&quot;,
            color: &quot;#fff&quot;,
            border: &quot;none&quot;,
            cursor: &quot;pointer&quot;
        };
        let liStyle={
            marginTop: 10
        }

        let data = this.state.tasks;

        let listTasks = data.map(function(task) {
            return &amp;lt;li key={task.key} style={liStyle}&amp;gt;{task.msg}&amp;lt;/li&amp;gt;
        })

        return (
            &amp;lt;div className='main'&amp;gt;
                &amp;lt;div className='header'&amp;gt;
                    &amp;lt;form onSubmit={this.addTask}&amp;gt;
                    &amp;lt;input
                            type=&quot;text&quot;
                            placeholder=&quot;Add Task&quot;
                            style={inputStyle}
                            ref={e =&amp;gt; this._input=e}
                        &amp;gt;
                        &amp;lt;/input&amp;gt;
                        &amp;lt;button type=&quot;submit&quot; style={buttonStyle}&amp;gt;Added&amp;lt;/button&amp;gt;
                        &amp;lt;ul&amp;gt;
                            {listTasks}
                        &amp;lt;/ul&amp;gt;
                    &amp;lt;/form&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
        )
    }
}

export default AddTask4;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 단계 5&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;src/AddTask.js&lt;/li&gt;
&lt;li&gt;TaskList -&amp;gt; 컴포넌트로 분리하여, import 방식으로 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1739259390958&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class AddTask5 extends React.Component {
    constructor() {
        super();

        this.state = {
            tasks : []
        }
    }

    addTask = e =&amp;gt; {
        e.preventDefault();

        let taskArray = this.state.tasks;

        if(this._input.value != '') {
            taskArray.push({
                key: Date.now(),
                msg: this._input.value
            })
        }

        this.setState({
            tasks: taskArray
        })
    }
    render() {
        let inputStyle={
            marginTop: 20,
            padding: &quot;0px 10px&quot;,
            width: 125,
            lineHeight: &quot;32px&quot;,
            fontSize: 14,
            border: &quot;1px solid #ccc&quot;
        };
        let buttonStyle={
            margin: &quot;20px 0px 0px 5px&quot;,
            padding: 10,
            fontSize: 14,
            backgroundColor: &quot;#999&quot;,
            color: &quot;#fff&quot;,
            border: &quot;none&quot;,
            cursor: &quot;pointer&quot;
        }

        return (
            &amp;lt;div className='main'&amp;gt;
                &amp;lt;div className='header'&amp;gt;
                    &amp;lt;form onSubmit={this.addTask}&amp;gt;
                        &amp;lt;input type='text' placeholder='Add Task' style={inputStyle}
                        ref={e =&amp;gt; this._input = e}&amp;gt;
                        &amp;lt;/input&amp;gt;
                        &amp;lt;button type='submit' style={buttonStyle}&amp;gt;Added&amp;lt;/button&amp;gt;
                        &amp;lt;AddTaskList propsValue={this.state.tasks} /&amp;gt;
                    &amp;lt;/form&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
        )
    }
}

export default AddTask5;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AddTaskList.js&lt;/li&gt;
&lt;li&gt;props의 value를 가져와 date형식으로 변환 후, TODO List를 노출&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1739259410058&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class AddTaskList extends React.Component {
    render() {
        let liStyle={
            marginTop: 10
        }
        let data=this.props.propsValue;

        let listTasks = data.map(task =&amp;gt; {
            let date = new Date(task.key);
            let formattedDate = `${date.getFullYear()}년 ${date.getMonth() + 1}월 ${date.getDate()}일 ` +
                                `${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}`;
        
            return (
                &amp;lt;li key={task.key} style={liStyle}&amp;gt;
                    {task.msg} ({formattedDate})
                &amp;lt;/li&amp;gt;
            );
        });

        return (
            &amp;lt;ul&amp;gt;
                {listTasks}
            &amp;lt;/ul&amp;gt;
        )
    }
}

export default AddTaskList;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>React</category>
      <category>Component</category>
      <category>css</category>
      <category>Front</category>
      <category>html</category>
      <category>JavaScript</category>
      <category>js</category>
      <category>React</category>
      <category>react js</category>
      <category>ToDo List</category>
      <category>웹기술</category>
      <author>IT의 큰손</author>
      <guid isPermaLink="true">https://maengmo.tistory.com/461</guid>
      <comments>https://maengmo.tistory.com/461#entry461comment</comments>
      <pubDate>Tue, 11 Feb 2025 16:38:57 +0900</pubDate>
    </item>
    <item>
      <title>React STEP 23 - Create React App - 5</title>
      <link>https://maengmo.tistory.com/460</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;⭐ Create React App&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;1. 단계 1&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;src/DataComponent.js&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1739249717816&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class DataComponent extends React.Component {
    render() {
        let ulStyle = {
            marginTop : 15
        }
        let liStyle = {
            lineHeight : 1.8
        }

        return (
            &amp;lt;ul style={ulStyle}&amp;gt;
                &amp;lt;li style={liStyle}&amp;gt;member1&amp;lt;/li&amp;gt;
                &amp;lt;li style={liStyle}&amp;gt;member2&amp;lt;/li&amp;gt;
                &amp;lt;li style={liStyle}&amp;gt;member3&amp;lt;/li&amp;gt;
            &amp;lt;/ul&amp;gt;
        )
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 단계 2&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;src/App.js&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1739249746991&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; class App extends Component {
    constructor(props) {
        super(props);

        this.state = {
            loginData : [
                {name: &quot;member1&quot;, age: 21},
                {name: &quot;member2&quot;, age: 22},
                {name: &quot;member3&quot;, age: 23},
            ]
        }
    }
    render() {
        return (
            &amp;lt;div className=&quot;container&quot;&amp;gt;
                &amp;lt;h1&amp;gt;React Example&amp;lt;/h1&amp;gt;
                &amp;lt;DataComponent loginData={this.state.loginData}&amp;gt;&amp;lt;/DataComponent&amp;gt;
            &amp;lt;/div&amp;gt;
        )
    }
 }&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;src/DataComponent.js&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1739249772207&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class DataComponent2 extends React.Component {
    constructor(props) {
        super(props);
        this.state = {loginData: props.loginData}
    }
    render() {
        let ulStyle={
            marginTop: 15
        };
        let liStyle={
            lineHeight: 1.8
        };
        let data=this.state.loginData;
        let dataList=data.map((d, i) =&amp;gt; &amp;lt;li key={i+1} style={liStyle}&amp;gt;{d.name}, {d.age}&amp;lt;/li&amp;gt;);
        return (
            &amp;lt;ul style={ulStyle}&amp;gt;
                {dataList}
            &amp;lt;/ul&amp;gt;
        );
    }
}

export default DataComponent2;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>React</category>
      <category>array</category>
      <category>Component</category>
      <category>css</category>
      <category>html</category>
      <category>JavaScript</category>
      <category>js</category>
      <category>React</category>
      <category>react js</category>
      <category>리엑트</category>
      <category>프론트</category>
      <author>IT의 큰손</author>
      <guid isPermaLink="true">https://maengmo.tistory.com/460</guid>
      <comments>https://maengmo.tistory.com/460#entry460comment</comments>
      <pubDate>Tue, 11 Feb 2025 13:59:08 +0900</pubDate>
    </item>
    <item>
      <title>React STEP 22 - Create React App - 4</title>
      <link>https://maengmo.tistory.com/459</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;⭐ Create React App&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;map() 함수로 태그 반환하기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 단계 1&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;반복해서 출력해야 하는 태그들을 배열에 넣어두고 map() 함수로 순서대로 나열해 컴포넌트를 return 할 수 있습니다.&lt;/li&gt;
&lt;li&gt;src/ReturnMap.js&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1739247056677&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class ReturnMap extends React.Component {
    render() {
        let ulStyle= {
            marginTop: 15
        }
        let liStyle = {
            lineHeight: 1.8
        }
        let forArray = [
            &amp;lt;li key=&quot;1&quot; style={liStyle}&amp;gt;React&amp;lt;/li&amp;gt;,
            &amp;lt;li key=&quot;2&quot; style={liStyle}&amp;gt;18.2.0&amp;lt;/li&amp;gt;,
            &amp;lt;li key=&quot;3&quot; style={liStyle}&amp;gt;Array Map&amp;lt;/li&amp;gt;
        ];

        return (
            &amp;lt;ul style={ulStyle}&amp;gt;
                {forArray}
            &amp;lt;/ul&amp;gt;
        )
    }
}

export default ReturnMap;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 단계 2&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새로운 array에 옮겨 담기&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1739247837879&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class ReturnMap2 extends React.Component {
    render() {
        let ulStyle = {
            marginTop : 15
        };
        let liStyle = {
            lineHeight : 1.8
        };
        let forArray = [
            &amp;lt;li key=&quot;1&quot; style={liStyle}&amp;gt;React&amp;lt;/li&amp;gt;,
            &amp;lt;li key=&quot;2&quot; style={liStyle}&amp;gt;18.2&amp;lt;/li&amp;gt;,
            &amp;lt;li key=&quot;3&quot; style={liStyle}&amp;gt;Array Map&amp;lt;/li&amp;gt;
        ];
        let forNewArray = [];

        for(let i=0; i&amp;lt;forArray.length; i++) {
            forNewArray.push(forArray[i]);
        }

        return (
            &amp;lt;ul style={ulStyle}&amp;gt;
                {forNewArray}
            &amp;lt;/ul&amp;gt;
        )
    }
}

export default ReturnMap2;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 단계 3&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;forEach문을 통한 더욱 편리한 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1739248303986&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class ReturnMap3 extends React.Component {
    render() {
        let ulStyle = {
            marginTop : 15
        }
        let liStyle = {
            lineHeight : 1.8
        }
        let forEachArray = [
            &amp;lt;li key=&quot;1&quot; style={liStyle}&amp;gt;React&amp;lt;/li&amp;gt;,
            &amp;lt;li key=&quot;2&quot; style={liStyle}&amp;gt;18.2.0&amp;lt;/li&amp;gt;,
            &amp;lt;li key=&quot;3&quot; style={liStyle}&amp;gt;Array Map&amp;lt;/li&amp;gt;
        ];
        let forEachNewArray = [];

        forEachArray.forEach(result =&amp;gt; {
            forEachNewArray.push(result);
        });

        return (
            &amp;lt;ul style={ulStyle}&amp;gt;
                {forEachNewArray}
            &amp;lt;/ul&amp;gt;
        )
    }
}

export default ReturnMap3;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 단계 4&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;map 함수를 사용하여 더 간단한 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1739248614016&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class ReturnMap4 extends React.Component {
    render() {
        let ulStyle = {
            marginTop : 15
        }
        let liStyle = {
            lineHeight : 1.8
        }
        let mapArray = [
            &amp;lt;li key=&quot;1&quot; style={liStyle}&amp;gt;React&amp;lt;/li&amp;gt;,
            &amp;lt;li key=&quot;2&quot; style={liStyle}&amp;gt;18.2.0&amp;lt;/li&amp;gt;,
            &amp;lt;li key=&quot;3&quot; style={liStyle}&amp;gt;Array Map&amp;lt;/li&amp;gt;
        ]
        let mapNewArray = mapArray.map(arrayVal =&amp;gt; arrayVal);

        return (
            &amp;lt;ul style={ulStyle}&amp;gt;
                {mapNewArray}
            &amp;lt;/ul&amp;gt;
        )
    }
}

export default ReturnMap4;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 단계 5&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;elementArray 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1739248978191&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class ReturnMap5 extends React.Component {
    render() {
        let ulStyle = {
            marginTop : 15
        }
        let liStyle = {
            lineHeight : 1.8
        }
        let elementArray = [
            &amp;lt;li key=&quot;1&quot; style={liStyle}&amp;gt;React&amp;lt;/li&amp;gt;,
            &amp;lt;li key=&quot;2&quot; style={liStyle}&amp;gt;18.2.0&amp;lt;/li&amp;gt;,
            &amp;lt;li key=&quot;3&quot; style={liStyle}&amp;gt;Array Map&amp;lt;/li&amp;gt;
        ]

        return (
            &amp;lt;ul style={ulStyle}&amp;gt;
                {elementArray.map(arrayVal =&amp;gt; arrayVal)}
            &amp;lt;/ul&amp;gt;
        )
    }
}

export default ReturnMap5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>React</category>
      <category>css</category>
      <category>Front</category>
      <category>html</category>
      <category>JavaScript</category>
      <category>js</category>
      <category>map()</category>
      <category>React</category>
      <category>react js</category>
      <category>개발자</category>
      <category>리엑트</category>
      <author>IT의 큰손</author>
      <guid isPermaLink="true">https://maengmo.tistory.com/459</guid>
      <comments>https://maengmo.tistory.com/459#entry459comment</comments>
      <pubDate>Tue, 11 Feb 2025 13:44:33 +0900</pubDate>
    </item>
    <item>
      <title>React STEP 21 - Create React App - 3</title>
      <link>https://maengmo.tistory.com/458</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;⭐ Create React App&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. state 정의 하기&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;App.js&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1739232912997&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { Component } from 'react';
import SetState from './js/14_setState';
import './App.css';
 class App extends Component {
    render(){
        return (
            &amp;lt;div className=&quot;container&quot;&amp;gt;
                &amp;lt;h1&amp;gt;React Example&amp;lt;/h1&amp;gt;
                &amp;lt;SetState&amp;gt;&amp;lt;/SetState&amp;gt;
            &amp;lt;/div&amp;gt;
        );
    }
 }
export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SetState.js&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1739232931095&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { Component } from 'react';
import ReactDOM from 'react-dom/client';

const root = ReactDOM.createRoot(document.getElementById('root'));

class SetState extends React.Component {
    constructor() {
        super();

        this.state = {
            comment: &quot;Original State&quot;
        }
    }

    modifyComment=() =&amp;gt; {
        this.setState({
            comment: &quot;Change State&quot;
        });
    };
    render(){
        let buttonStyle={
            marginTop: 20,
            padding: 10,
            fontSize: 14,
            backgroundColor: &quot;#999&quot;,
            color: &quot;#fff&quot;,
            border: &quot;none&quot;,
            cursor: &quot;pointer&quot;
        };
        return (
            &amp;lt;div&amp;gt;
                &amp;lt;p&amp;gt;{this.state.comment}&amp;lt;/p&amp;gt;
                &amp;lt;button onClick={this.modifyComment} style={buttonStyle}&amp;gt;Modify Comment&amp;lt;/button&amp;gt;
            &amp;lt;/div&amp;gt;
        );
    }
}

export default SetState;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Fragments 이해하기&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴포넌트 단위로 태그를 return 할 때, HTML 태그로 전체를 감싸지 않으면 에러가 발생합니다.&lt;/li&gt;
&lt;li&gt;이때 &amp;lt;Fragment&amp;gt; 태그로 감싸면 불필요한 HTML 태그를 추가하지 않고 사용할 수 있습니다.&lt;/li&gt;
&lt;li&gt;App.js&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1739236255351&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { Component } from 'react';
import './App.css';
import Fragments from './js/15_fragments';
 class App extends Component {
    render(){
        return (
            &amp;lt;div className=&quot;container&quot;&amp;gt;
                &amp;lt;h1&amp;gt;React Example&amp;lt;/h1&amp;gt;
                &amp;lt;Fragments&amp;gt;&amp;lt;/Fragments&amp;gt;
            &amp;lt;/div&amp;gt;
        );
    }
 }
export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;fragments.js&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1739236281917&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { Component } from 'react';
import ReactDOM from 'react-dom/client';

const root = ReactDOM.createRoot(document.getElementById('root'));

class Fragments extends React.Component {
    render() {
        return (
            &amp;lt;Fragments&amp;gt;
                &amp;lt;p&amp;gt;P tag&amp;lt;/p&amp;gt;
                &amp;lt;span&amp;gt;SPAN tag&amp;lt;/span&amp;gt;
            &amp;lt;/Fragments&amp;gt;
        )
    }
}

export default Fragments;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>React</category>
      <category>css</category>
      <category>Fragments</category>
      <category>Front</category>
      <category>html</category>
      <category>JavaScript</category>
      <category>js</category>
      <category>node</category>
      <category>React</category>
      <category>react js</category>
      <category>개발자</category>
      <author>IT의 큰손</author>
      <guid isPermaLink="true">https://maengmo.tistory.com/458</guid>
      <comments>https://maengmo.tistory.com/458#entry458comment</comments>
      <pubDate>Tue, 11 Feb 2025 10:12:39 +0900</pubDate>
    </item>
    <item>
      <title>React STEP 20 - Create React App - 2</title>
      <link>https://maengmo.tistory.com/457</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;⭐ 생명주기 함수 이해하기&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴포넌트의 정보를 보여주는 도구를 설치 -&amp;gt; 크롬 브라우저에서 해당 URL 접속&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chrome.google.com/webstore&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://chrome.google.com/webstore&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1739173309283&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Chrome Web Store&quot; data-og-description=&quot;브라우저에 새로운 기능을 추가하고 탐색 환경을 맞춤설정합니다.&quot; data-og-host=&quot;chromewebstore.google.com&quot; data-og-source-url=&quot;https://chrome.google.com/webstore&quot; data-og-url=&quot;https://chromewebstore.google.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b2riOd/hyYb9SkEAr/3trIKv9NAA0tERYCKVI1E1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/udr2e/hyYckl0VJ2/xKYAwdUSuiWDQ4ql85C421/img.png?width=440&amp;amp;height=280&amp;amp;face=0_0_440_280&quot;&gt;&lt;a href=&quot;https://chrome.google.com/webstore&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://chrome.google.com/webstore&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b2riOd/hyYb9SkEAr/3trIKv9NAA0tERYCKVI1E1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/udr2e/hyYckl0VJ2/xKYAwdUSuiWDQ4ql85C421/img.png?width=440&amp;amp;height=280&amp;amp;face=0_0_440_280');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Chrome Web Store&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;브라우저에 새로운 기능을 추가하고 탐색 환경을 맞춤설정합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;chromewebstore.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;React Developer Tool 검색 및 [Chrome에 추가] 버튼을 눌러 확장 프로그램을 설치&lt;/li&gt;
&lt;li&gt;React 개발상에서의 컴포넌트를 보고 싶을 때, [Components]라는 탭이 앞에서 설치한 확장 프로그램에 의해 개발자 도구에 추가되어 있습니다.&lt;/li&gt;
&lt;li&gt;실제 태그를 보고 싶을 때는 [Elements] 탭을 쓰면 되지만, React 코드를 분석할 때는 [Components] 탭을 쓰면 컴포넌트들을 볼 수 있습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 단계 1&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;src/App.js&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1739173459575&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { Component } from 'react';
 import Lifecycle from './Lifecycle';
 import './App.css';
 class App extends Component {
    render(){
        return (
            &amp;lt;div className=&quot;container&quot;&amp;gt;
                &amp;lt;h1&amp;gt;React Example&amp;lt;/h1&amp;gt;
                &amp;lt;Lifecycle propValue=&quot;fromApp&quot; /&amp;gt;
            &amp;lt;/div&amp;gt;
        );
    }
 }
 export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;src/Lifecycle.js&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1739173505223&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt; import React, { Component } from 'react';
 class Lifecycle extends Component {
    constructor(props){
        super(props);
        this.state={};
        console.log(&quot;1. constructor()&quot;);
        console.log(props);
    }
    static getDerivedStateFromProps(props, state){
        console.log(&quot;2. getDerivedStateFromProps(), &quot;+props.propValue);
        console.log(props);
        console.log(state);
        return {};
    }
    render(){
        console.log(&quot;3. render()&quot;);
 1-1) 단계1
 src/App.js
 src/Lifecycle.js
        return (
            &amp;lt;h2&amp;gt;This is Render Function.&amp;lt;/h2&amp;gt;
        );
    }
 }
 export default Lifecycle;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 단계 2&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;src/Lifecycle.js&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1739173553224&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { Component } from 'react';
 class Lifecycle extends Component {
    constructor(props){
        super(props);
        this.state={};
        console.log(&quot;1. constructor()&quot;);
        console.log(props);
    }
    static getDerivedStateFromProps(props, state){
        console.log(&quot;2. getDerivedStateFromProps(), &quot;+props.propValue);
        return {tempState: props.propValue};
    }
    componentDidMount(){
        console.log(&quot;4. componentDidMount()&quot;);
        console.log(&quot;5. tempState : &quot;+this.state.tempState);
        console.log(this.state);
    }
    render(){
        console.log(&quot;3. render()&quot;);
        return (
            &amp;lt;h2&amp;gt;This is Render Function.&amp;lt;/h2&amp;gt;
        );
    }
 }
 1-2) 단계2
 src/Lifecycle.js
export default Lifecycle;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 단계 3&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;src/Lifecycle.js&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1739173739666&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { Component } from 'react';
 class Lifecycle extends Component {
    constructor(props){
        super(props);
        this.state={};
        console.log(&quot;1. constructor()&quot;);
        console.log(props);
    }
    static getDerivedStateFromProps(props, state){
        console.log(&quot;2. getDerivedStateFromProps(). &quot;+props.propValue);
        return {tempState1: props.propValue};
    }
    componentDidMount(){
        console.log(&quot;4. componentDidMount()&quot;);
        console.log(&quot;5. tempState1 : &quot;+this.state.tempState1);
        this.setState({tempState2: true});
    }
    shouldComponentUpdate(props, state){
        console.log(&quot;6. shouldComponentUpdate(), tempState2 : &quot;+state.tempState2);
        return state.tempState2;
        // return false;
    }
    render(){
        console.log(&quot;3. render()&quot;);
        return (
            &amp;lt;h2&amp;gt;This is Render Function.&amp;lt;/h2&amp;gt;
        );
    }
 }
 
 export default Lifecycle;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>React</category>
      <category>css</category>
      <category>Front</category>
      <category>html</category>
      <category>JavaScript</category>
      <category>js</category>
      <category>Lifecycle</category>
      <category>node</category>
      <category>React</category>
      <category>react js</category>
      <category>리엑트</category>
      <author>IT의 큰손</author>
      <guid isPermaLink="true">https://maengmo.tistory.com/457</guid>
      <comments>https://maengmo.tistory.com/457#entry457comment</comments>
      <pubDate>Mon, 10 Feb 2025 17:09:51 +0900</pubDate>
    </item>
    <item>
      <title>React STEP 19 - Create React App - 1</title>
      <link>https://maengmo.tistory.com/456</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;⭐ 기본 구조 이해하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. src/index.js&lt;/p&gt;
&lt;pre id=&quot;code_1739171757923&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; import React from 'react';
 import ReactDOM from 'react-dom/client';
 import './index.css';
 import App from './App';
 import reportWebVitals from './reportWebVitals';
 const root=ReactDOM.createRoot(document.getElementById(&quot;root&quot;));
 root.render(
 	&amp;lt;App /&amp;gt;
 );
 // If you want to start measuring performance in your app, pass a function
 // to log results (for example: reportWebVitals(console.log))
 // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
 reportWebVitals()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. src/App.css&lt;/p&gt;
&lt;pre id=&quot;code_1739171873833&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.container {
    padding: 10px;
 }
 .container h1 {
    font-size: 25px;
    font-weight: normal;
 }
 .container h2 {
    margin-top: 16px;
    font-size: 16px;
    font-weight: normal;
 }
 .container p {
    margin-top: 16px;
    font-weight: normal;
 }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. src/App.js&lt;/p&gt;
&lt;pre id=&quot;code_1739171895186&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; import React, { Component } from 'react';
 import './App.css';
 // class App extends React.Component {
 class App extends Component {
    constructor(props){
        super(props);
    }
    render(){
        return (
            &amp;lt;div className=&quot;container&quot;&amp;gt;
                &amp;lt;h1&amp;gt;React Example&amp;lt;/h1&amp;gt;
                &amp;lt;p&amp;gt;HTML 적용하기&amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
        );
    }
 }
 export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⭐ React 컴포넌트 이해하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. src/App.js&lt;/p&gt;
&lt;pre id=&quot;code_1739171949728&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { Component } from 'react';
 import ImportComponent from './ImportComponent';
 import './App.css';
 class App extends Component {
    render(){
        return(
            &amp;lt;div className=&quot;container&quot;&amp;gt;
                &amp;lt;h1&amp;gt;React Example&amp;lt;/h1&amp;gt;
                &amp;lt;ImportComponent /&amp;gt;
            &amp;lt;/div&amp;gt;
        );
    }
 }
 export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. src/ImportComponent.js&lt;/p&gt;
&lt;pre id=&quot;code_1739171973400&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; import React, { Component } from 'react';
 class ImportComponent extends Component {
    render(){
        return (
            &amp;lt;h2&amp;gt;This is Imported Component.&amp;lt;/h2&amp;gt;
        );
    }
 }
 export default ImportComponent&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⭐ 생명주기 함수 이해하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. src/App.js&lt;/p&gt;
&lt;pre id=&quot;code_1739172004316&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React, { Component } from 'react';
 import Lifecycle from './Lifecycle';
 import './App.css';
 class App extends Component {
    render(){
        return(
            &amp;lt;div className=&quot;container&quot;&amp;gt;
                &amp;lt;h1&amp;gt;React Example&amp;lt;/h1&amp;gt;
                &amp;lt;Lifecycle /&amp;gt;
            &amp;lt;/div&amp;gt;
        );
    }
 }
 export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. src/Lifecycle.js&lt;/p&gt;
&lt;pre id=&quot;code_1739172027777&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; import React, { Component } from 'react';
 class Lifecycle extends Component {
    render(){
        console.log(&quot;3. render()&quot;);
        return (
            &amp;lt;h2&amp;gt;This is Render Function.&amp;lt;/h2&amp;gt;
        );
    }
 }
 export default Lifecycle;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>React</category>
      <category>Component</category>
      <category>css</category>
      <category>Front</category>
      <category>html</category>
      <category>JavaScript</category>
      <category>js</category>
      <category>Lifecycle</category>
      <category>React</category>
      <category>react 기본구조</category>
      <category>리엑트</category>
      <author>IT의 큰손</author>
      <guid isPermaLink="true">https://maengmo.tistory.com/456</guid>
      <comments>https://maengmo.tistory.com/456#entry456comment</comments>
      <pubDate>Mon, 10 Feb 2025 16:21:24 +0900</pubDate>
    </item>
    <item>
      <title>React STEP 18 - React 이벤트</title>
      <link>https://maengmo.tistory.com/455</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;⭐ React Event&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JavaScript에서의 이벤트를 React에서도 사용 할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 단계 1&lt;/p&gt;
&lt;pre id=&quot;code_1739171248935&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class CounterText extends React.Component {
  render() {
    let textStyle = {
      paddingBottom: 20,
      fontSize: 36,
      color: &quot;#333&quot;
    };

    return (
      &amp;lt;div style={textStyle}&amp;gt;
        {this.props.countProps}
      &amp;lt;/div&amp;gt;
    )
  }
}

class App2 extends React.Component {
  constructor(props) {
    super(props);

    this.state= {
      count: 0
    }
  }

  countPlus() {
    this.setState({
      count: this.state.count +1
    });
  }

  countMinus() {
    this.setState({
      count: this.state.count -1
    })
  }

  render() {
    let backgroundStyle = {
      display: &quot;inline-block&quot;,
      padding: 20,
      textAlign: &quot;center&quot;,
      backgroundColor: &quot;#f4f4f4&quot;,
      borderRadius: 10
    }
    let buttonStyle = {
      margin: 2,
      width: 40,
      height: 30,
      textAlign: &quot;center&quot;,
      fontSize: 14,
      fontWeight: &quot;bold&quot;,
      color: &quot;#666&quot;
    }

    return (
      &amp;lt;div style={backgroundStyle}&amp;gt;
        &amp;lt;CounterText countProps={this.state.count}&amp;gt;&amp;lt;/CounterText&amp;gt;
        &amp;lt;button onClick={this.countPlus} style={buttonStyle}&amp;gt;+&amp;lt;/button&amp;gt;
        &amp;lt;button onClick={this.countMinus} style={buttonStyle}&amp;gt;-&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
    )
  }
}

root.render (
  &amp;lt;App2&amp;gt;&amp;lt;/App2&amp;gt;
)&lt;/code&gt;&lt;/pre&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;pre id=&quot;code_1739171263183&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; countPlus(){
     this.setState({
     count: this.state.count+1
     });
 }
 countMinus(){
     this.setState({
     count: this.state.count-1
     });
 }
 countPlus(), countMinus() 함수에서의 this는 컴포넌트를 참조할 수 없습니다. 따라서 버튼을 
클릭하더라도 숫자가 증가되거나 감소되지 않습니다&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 단계 2&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해결 방법 1 : 화살표 함수 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1739171347336&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;countPlus=() =&amp;gt; {
    this.setState({
        count: this.state.count+1
    });
};
countMinus=() =&amp;gt; {
    this.setState({
        count: this.state.count-1
    });
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해결 방법 2 : bind(this) 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1739171429202&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;return(
    &amp;lt;div style={backgroundStyle}&amp;gt;
    &amp;lt;CounterText countPros={this.state.count} /&amp;gt;
    &amp;lt;button onClick={this.countPlus.bind(this)} style={buttonStyle}&amp;gt;+&amp;lt;/button&amp;gt;
    &amp;lt;button onClick={this.countMinus.bind(this)} style={buttonStyle}&amp;gt;-&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>React</category>
      <category>Component</category>
      <category>css</category>
      <category>html</category>
      <category>JavaScript</category>
      <category>js</category>
      <category>React</category>
      <category>react js</category>
      <category>리엑트</category>
      <category>리엑트 이벤트</category>
      <category>프론트</category>
      <author>IT의 큰손</author>
      <guid isPermaLink="true">https://maengmo.tistory.com/455</guid>
      <comments>https://maengmo.tistory.com/455#entry455comment</comments>
      <pubDate>Mon, 10 Feb 2025 16:11:37 +0900</pubDate>
    </item>
  </channel>
</rss>