반응형

html 태그로 표현되어있는 문법을 createElement 로 변환해준다.

const vdom = <p>
  <h1>헤더</h1>
  <ul>
    <li style="color:red">첫번째</li>
    <li style="color:blue">두번째</li>
  </ul>
</p>

위에 있는 코드가 아래와 같이 변환이 된다.

"use strict";

const vdom = /*#__PURE__*/React.createElement("p", null, /*#__PURE__*/React.createElement("h1", null, "\uD5E4\uB354"), /*#__PURE__*/React.createElement("ul", null, /*#__PURE__*/React.createElement("li", {
  style: "color:red"
}, "\uCCAB\uBC88\uC9F8"), /*#__PURE__*/React.createElement("li", {
  style: "color:blue"
}, "\uB450\uBC88\uC9F8")));

출처 : https://babeljs.io/ 에서 변환함.

왜 저렇게 변환이 필요한가?? 

// app.js
const vdom = createElement(
  "p",
  {},
  createElement("h1", {}, "헤더"),
  createElement(
    "ul",
    {},
    createElement("li", { style: "color:red" }, "첫번째"),
    createElement("li", { style: "color:blue" }, "두번째")    
  )
);

// react.js
export function createElement(tag, props, ...children) {
  props = props || {}
  return {
    tag,
    props,
    children,
  };
}

JSX 를 사용하지 않으면 위와같이 코드를 작성해줘야 한다. 하지만 위보다는 html 태그 구조가 눈에 더 잘 들어온다.

한가지 더 기본적으로 JSX 가 변환을 할때에 메소드를 보면 React.createElement를 사용한다. 하지만 위에 작성된 코드에서는 createElement를 사용하고 있다. 이걸 변경해주려면 다음과 같이 표시해 주면된다. 변환된 코드는 아래와 같다.

/* @jsx createElement */
// app.js
const vdom = createElement(
  "p",
  {},
  createElement("h1", {}, "헤더"),
  createElement(
    "ul",
    {},
    createElement("li", { style: "color:red" }, "첫번째"),
    createElement("li", { style: "color:blue" }, "두번째")    
  )
);

실제로 babel 사이트에서 변환된 것을 봐도 변경된 것을 알수 있다.

"use strict";

// app.js
const vdom = createElement("p", {}, createElement("h1", {}, "헤더"), createElement("ul", {}, createElement("li", {
  style: "color:red"
}, "첫번째"), createElement("li", {
  style: "color:blue"
}, "두번째")));

 

728x90
반응형
반응형

여러가지 배열 연산 형태 
함수 형태나 쓰임이 많다보니 코드를 봤을때 대체 무슨 의미인지 파악이 어려워서 공부하다가 형태를 기억하면 좋을것 같아서 남겨놔봤다. 

type Book = {
    title: string;
    copyright?: string;
    author?: string;
};

const books: string[] = [
    "헨리 6세",
    "리처드 3세",
    "실수 연발",
    "말괄량이 길들이기",
    "헨리 8세",
];

// foreach 문
books.forEach((book: string, idx: number, books: string[]) => {
    console.log(book, idx);
})

// map 사용1
const bookObject: Book[] = books.map((book:string) =>{
    return {
        title:book,
        author: undefined,
    };
});

console.log(bookObject); 
/*  [ { author: undefined, title: '헨리 6세' },
  { author: undefined, title: '리처드 3세' },
  { author: undefined, title: '실수 연발' },
  { author: undefined, title: '말괄량이 길들이기' },
  { author: undefined, title: '헨리 8세' } ] */

// map 사용2
const ShakespeareOneBooks: Book[] = books.map((book: string) => ({
    title:book
}))
.map((book: Book) => ({
    ...book,
    author: "William Shakespeare"
}));

console.log(ShakespeareOneBooks);

// map 사용2 와 형태가 다르지만 동일 동작임.
const bookTitleToBookObject = (book: string) => ({title:book});
const makeAuthor = (name: string) => (book: Book) => ({
    ...book,
    author: name
});

const shakespeareTwoBooks: Book[] = books
.map(bookTitleToBookObject)
.map(makeAuthor("William Shakespeare"));

console.log(shakespeareTwoBooks);

// filter
const henry: Book[] = shakespeareTwoBooks.filter((book: Book) =>
    book.title.includes("헨리")
);

console.log(henry);

// reduce
// reduce 는 함수와 초기화 값을 넘겨줌
// 함수에는 2개의 인자를 넘겨주는데 첫번째에는 초기값, 두번째는 배열의 값을 넘겨줌
// 함수가 반복되면서 첫번째 인자에는 다시 결과값을 계속 넣어주게됨.
// 0, 10 -> 10, 5 -> 15, 3 .. 이런 형태로 값이 들어감.
const someNumbers: number[] = [10,5,3,14,56];
const someNumber = someNumbers.reduce((a:number, b:number) => a + b , 0)

console.log(someNumber);	// 88

type SomeObject = {
    [key: string]: string | number;
};

// reduce object
const someObjects: SomeObject[] = [
    { border: "none"},
    { fontSize: 24},
    {className: "box sm-box"},
];

const someObject: SomeObject = someObjects.reduce(
    (a: SomeObject, b: SomeObject) => ({...a, ...b}),
    {}
);
console.log(someObject) // { border: 'none', className: 'box sm-box', fontSize: 24}

(출처 : 패스트 캠퍼스 - 김민태의 프론트엔드 아카데미 : https://fastcampus.co.kr/dev_academy_kmt1)

728x90
반응형
반응형

매일 봐도 까먹는 자바스크립트 함수형태들...

function fn(x){
	return x + 100;
}

const result = fn(10);

# 이름없는 함수
const fn2 = function (){
	return 100;
};

fn2();

# 즉시 실행 함수
(function(){
	console.log('test')
})();

# Arrow 함수
const fn3 = () => {
	return 100;
}

const fn4 = () => 100;

# Generator 함수
# 최초 호출하면 함수가 실행되지 않고 실행 준비상태로 만듬. 
# 그리고 객체를 반환하며 이 객체에는 함수를 실행할 도구가 담겨져 있다.
# 도구를 이용해서 함수를 실행하고 멈추고 할수 있음.
function* fn5(){
	yield 10; 
	yield 20;
	return 30;
}

const g = fn5();
g.next();  // {value: 10, done: false}
g.next();  // {value: 20, done: false}
g.next();  // {value: 30, done: true}


# 비동기 함수
async function fn6(){
    
}

 

 

728x90
반응형
반응형



  요즘 보면 JavaScript 라이브러리와 프레임워크들을 정말 많이 사용하고 있고 그 사용 폭도 점점 넓어지고 있다. 종류도 많지만 각각의 특성도 다양해서 정말 따라가기 힘들다. 워낙 넓다보니 뭐부터 시작해야 할지도 잘 모르겠다. 최근 동기들과 React를 조금씩 공부하고 있는데 React 와 Vue의 차이를 좀 알아볼겸 이번 리뷰 도서로 선택을 했다. 



보통 모르는 언어를 처음 접할때에는 가장 중요한게 이론이다. 아무생각없이 Copy&Paste만 해가지고는 처음에는 좀 빠를지 몰라도 나중에는 막히게 된다. 이 책도 읽다보면 빠르게 진도를 나갈수 있는 책은 아니었다. 특히 나같이 Javascript 에 대해서 많은 지식을 가지고 있지 않은 사람들에게는 정말 천천히 끈기를 가지고 읽어야 하는 책이다. 책 내용을 보면 정의나 속성, 원리에 대해서 정말 자세하게 설명해주고 있다. 그래서 읽다가 혹시 이거 번역서인가? 라는 생각도 했다. 책 구성이나 디자인이 약간 O'reilly 에서 나오는 책같은 느낌이 들어서였다. 그런데 그게 아니었다. 정말 이렇게 자세하고 꼼꼼하게 설명해준 저자 분이 정말 대단하다는 생각이 들었다.


특히 Chapter 3에 나와있는 Vue.js 의 주요 개념들은 처음 접하는 나에게 많은 도움을 주었다. 보통 Chapter 별로 하나씩 하나씩 설명해주는게 일반적인데 일단 먼저  개념에 대해서 설명을 해주니 전체적인 연결고리들을 좀더 이해하기 쉬웠다.


쉽지는 않겠지만 Vue.js에 대해서 관심이 있거나 시작하려는 사람들은 이책을 읽어보면 많은 도움을 받을 수 있을거 생각이 된다. 


"<Vue.js 첫걸음>" 의 대한  자세한 내용은 한빛미디어 홈페이지에서 확인 하실 수 있습니다."


728x90
반응형
반응형

edX사이트에서 Introduction to ReactJS 강의를 들으면서 내용을 정리해봤다.


What is ReactJS?

ReactJS 는 상태에 따라서 View 레이어를 만들어 주는 라이브러리이다.

React Compnents는 Virtual DOM 을 생성한다. ReactCompnent의 상태가 변경되면 새로운 Virtual DOM을 생성하고 차이점을 분석한다. 그리고 효과적인 방법으로 HTML  DOM 에 반영한다.


Rendering Elements

- React Elements

React Elements 는 DOM 노드에 표현되는 Object 이다. JSX를 사용해서 syntax를 작성한다. React Elements와 React Components는 다르다. React Elements를  DOM 에 표현하기 위헤서는 ReactDOM.render() 메소드를 사용해야 한다.


- ReactDOM.render()

ReactDOM.render() 메소드는 HTML DOM의 특정 부분에 React Elements를  렌더링하는데 사용된다. 대부분 React 어플리케이션에는 한개의 root node 가 있고 그 안에 렌더링 되는데 root node가 여러개 있을수도 있다.


1
<div id="root"></div>
cs


1
2
3
4
ReactDOM.render(
        <h1>Hello World!</h1>,
        document.getElementById("root")
)
cs


JSX

- What is JSX?

JSX는 Javascript의 syntax 를 확장한 것으로 HTML 태그를 사용해서 Javascript안에 React Elements를 작성할수 있게 해준다.


1
var element = <h1>Hello World!</h1>
cs


- Using JSX with JavaScript Expressions

Curly braces ({}) 를 사용해서 표현한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var str = "World!" 
var element =  <h1> Hello {str}</h1>
 
var item = {
    name"Cheese",
    price: 5
}
var element = <p>{item.name} : ${item.price} </p>
 
var length = 20
var width = 10
function calculateArea(x,y){
    return x * y
}
 
var element = <div>The Area is: {calculateArea(length,width)}</div>
cs


- Using JSX with Attributes

Attribute 표현시 절대로 curly braces를 quotes("")로 감싸면 안된다. 


1
 var element = <img src ={product.imageURL}></img>
cs


- Style Object

위에서와 같이 동일하게 style object 를 curly braces  안에 넣어주면 된다.

1
2
3
4
5
6
7
var styleObject = {
        backgroundColor: 'red',
        color:'blue',
        fontSize: 25,
        width: 100
}
var element = <input style = {styleObject}/>
cs


object 로 정의 안하고 바로 사용할 경우에 바깥쪽 {} 는 JSX표현이고 안쪽에 {} 는 style object 를 표현한것이다.

1
var element = <input style = {{width:200,height:100}}/>
cs


- Nested Elements

하나로 wrapping  하는 것을 권장한다.

1
2
3
4
5
6
var element = (
        <div>
            <div>Hello World</div>
            <div>Hello World</div>
        </div>
)
cs



Functional Components

- React Components

React Components는 독립적이고 재사용 가능한 React Element를 만들어 낸다. React Components는 Functional ComponentsClass Components로 구성된다.


- Functional Components

Functional Components는 React Elements를 출력한다. 관습적으로 Function의 첫글자는 대문자로 쓴다.

1
2
3
4
5
6
7
8
function HelloWorld(){
    return <h1>Hello World!</h1>
}
 
ReactDOM.render(
    <HelloWorld />,
    document.getElementById("root")
)
cs


- Properties  추가

Functional Components는 React Elements를 출력한다. 관습적으로 Function의 첫글자는 대문자로 쓴다.

1
2
3
4
5
6
7
8
9
function HelloWorld(props){
    return <h1>Message: {props.message}</h1>
}
 
ReactDOM.render(
    <HelloWorld message="Hello World!"/>,
    document.getElementById("root")
)
 
cs


Composition

- Composing Components

Functional Components 는 다른 Functional Components 를 결과 값으로 포함할 수 있다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
function ShoppingTitle(props){
    return (
        <div>
            <h1>{props.title}</h1>
            <h2>Total Number of Items: {props.numItems}</h2>
        </div>
    ) 
}
function ListItem(props){
    return <li>{props.item}</li>
}
function ShoppingList(props){
    return (
        <div>
            <h3>{props.header}</h3>
            <ol>
                <ListItem item = {props.items[0]}/>
                <ListItem item = {props.items[1]}/>
                <ListItem item = {props.items[2]}/>
            </ol>
        </div>
    )
}
function ShoppingApp(props){
    return (
        <div>
            <ShoppingTitle title = "My Shopping List" numItems = "9"/>
            <ShoppingList header = "Food" items = {[ "Apple","Bread","Cheese"]}/>
            <ShoppingList header = "Clothes" items = {[ "Shirt","Pants","Hat"]}/>
            <ShoppingList header = "Supplies" items = {[ "Pen","Paper","Glue"]}/>
        </div>
    )
}
ReactDOM.render(
    <ShoppingApp/>,
    document.getElementById("root")
)
cs


Conditional Rendering

- Conditional Rendering

Functional Components 의 결과값을 프로퍼티에 따라서 결정할 수 있다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
function Feature(props){
    if (props.active == true){
        return <h1>This feature is active</h1>
    }
    else{
        return <h1>This feature is not active</h1>
    }
 
}
 
function Feature(props){
    return <h1>This feature is {props.active? "active" : "not active"}</h1>
}   
cs


Module 1 내용 정리 끝.


728x90
반응형
반응형

props 는 컴포넌트에서 사용할 데이터중 변하지 않는 데이터를 다룰때 사용한다. 


Parent 컴포넌트에서 child 컴포넌트로 데이터를 전달할 때 props를 사용한다. 


컴포넌트의 render() 메소드 내부에 {this.props.propsName} 형태로 넣고 컴포넌트에서 사용할 때에는 <> 안에 propsName='value' 형태로 값을 설정 한다. 


- render() 메소드 내부


1
2
3
4
5
6
7
8
9
10
11
12
13
class App extends React.Component {
    render(){
 
        let text = "Hello HI";
 
        return (
            <div>
                <Header title={this.props.headerTitle}/>
                <Content title={this.props.contentTitle} body={this.props.contentBody}/>
            </div>
        );
    }
}
cs


- 컴포넌트


1
2
3
4
ReactDOM.render(<App headerTitle="Welcome"
                    contentTitle="Stranger"
                    contentBody="welcome to ex App"/>
                    , rootElement);
cs



- Default 값 사용시에는 App 내부에 className.defaultProps={propsName:value} 로 설정해주면 된다. 


1
2
3
4
5
6
App.defaultProps={
    headerTitle:'Default header',
    contentTitle: 'Default contentTitle',
    contentBody: 'Default contentBody'
};
 
cs


- propType 지정


1
2
3
4
Content.propType={
    title: React.PropTypes.string,
    body: React.PropTypes.string.isRequired
};
cs


title 과 body 를 모두 string으로 지정하고 body 는 필수로 설정한다. 필수 지정일경우 값이 없으면 오류가 난다.




<이 문서에 작성된 소스는 https://velopert.com 에 게시된 소스 입니다. >


----------------------------------------------------------------------------------------------------------------


추가.


React 에서는 단방향 흐름을 강조하는 것 같다. 그래서 props는 상위 컴포넌트에서 하위 컴포넌트로 전달되는 데이터이며, 또한 이것을 하위 컴포넌트에서 변경되는것은 권장하지 않는것 같다...



728x90
반응형

'Development > Frontend skills' 카테고리의 다른 글

npm install --save --save-dev  (0) 2017.05.30
map() 메소드 사용  (0) 2017.01.16
React.. 끄적끄적.  (0) 2017.01.09
Mac 에서 Node.js 설치  (0) 2017.01.05
jquery radio button 속성 설정  (0) 2013.09.04
반응형



함수형 자바스크립트

저자
마이클 포거스 지음
출판사
한빛미디어 | 2014-02-01 출간
카테고리
컴퓨터/IT
책소개
이 책은 자바스크립트를 올바로 사용할 수 있는 방법으로 함수형 ...
가격비교



자바 스크립트를 작성하다보면 빠지지 않는것이 함수이다.

그런데 과연 이 함수가 적절히 사용된건지, 아니면 문법에 맞게 작성된것인지 알기 힘들때가 있다.

같은 기능인데 다른 선언 방식, 다른 형태의 함수들이 소스상에 존재하게 되면.. 거의 이건 블랙홀이다 싶을 정도이다.


그런 면에서 이책은 보다 이론적으로 지식을 쌓기에 좋을 것 같다는 생각이 든다.

아주 기본적인 책 보다는 그보다 한단계 위정도?


기초를 익힌 후에 자신이 그동안 작성한 자바스크립트 소스를 보며 이건 이래서 틀렸구나, 이런 방법보다는 다른 방법이 효율적이구나 라는 생각을 할 수있게 하는 책인것 같다. 그래서 기본서에서는 간단히 다루는 내용들을 이 책에서는 심화적인 내용까지 볼수 있다. 


특히 마음에 들었던 것은 클로저에 대한 내용이었다.

인터넷을 찾아봐도, 소스를 봐도 좀 헷갈리는 부분이 있었고 다른 책들에서는 그냥 한두페이지로 지나갔던 내용인데. 

이책에서는 고맙게도 자세한 내용이 있었다ㅏ. 그래서 이해하는데 상당히 도움이 됐다. 


또 중간중간 예제들이 많이 있어서 내용을 이해하는데 전체적으로 많은 도움이 됐다. (역시 컴퓨터 서적의 핵심은 예제다. ^^;;;)


다른 책들과 마찮가지로 한번읽어서는 내것으로 만들기에는 양이 좀 많다. 실제 책은 그렇게 두껍지 않은데 많은 양의 내용을 담아줬다. 아마도 1번정도 1독 하고 다음에는 직접 적용해볼때 레퍼런스로 쓰면 딱인 책이다. 그렇게 사용한다면 아마도 코드 리펙토링에도 많은 도움이될것 같다. ^^






728x90
반응형
반응형




JavaScript Cookbook

저자
셸리 파워즈 지음
출판사
한빛미디어 | 2011-12-26 출간
카테고리
컴퓨터/IT
책소개
전문가의 검증된 코드로 배우는 자바스크립트 문제 해결 노하우어떤...
가격비교 글쓴이 평점  


우리가 자주 쓰는 자바스크립트에 대한 문제와 해결책에 관한 내용이 시작 부터 끝까지 가득 담겨있는 책이다. 챕터의 내용도 문자열, 정규표현식, 날짜, 숫자 관련등으로 해서 주제별로 잘 분류해놓은것 같다. 항상 구글링을 해서 어디서 듣보잡 코드를 복사해서 붙였던 것을 이제는 제대로 알고 사용할수 있을 정도의 내공을 실어줄수 있는 책이다. 

이 책 전에 Javascrpit+Jquery 입문 책을 봐서인지 몰라도 내용들이 무척 친근하다. 앞의 책이 기초라고 한다면 이책은 약간 상급자 레벨정도. 그렇다고 책이 어렵거나 소스코드가 보기 어렵지는 않다. 소스코드에 결과 화면까지 아주 자세히 보여주고 있기때문에 그냥 따라하기만 해도 충분히 이해할 수 있을정도의 난이도라고 생각이 된다. 그리고 내가 관심을 가지고 있는 정규표현식이 따로 나와있어서 정말 반가웠다. 개인적으로 좋아하는 파트인데 이렇게 따로 나눠져있다니 그저 좋을 뿐이다. ^^

그리고 자바스크립트 하면 빠지지 않는 날짜와 시간 관련된 부분도 상당히 많이 다루고 있어서 왠만한 소스는 다 있는것 같다. 그리고 충분히 응용할 수 있을 정도의 내용이기때문에 앞으로도 정말 잘 써먹을것 같다는 느낌이 들었다. 그리고 자료 화면으로 쓰인 그림들이 맥북 화면인것 같아서 좋았다. 다른 책들은 보통 윈도우 화면인데 맥북을 사용하는 나에게는 그런것 하나가 더 좋아보였다. 단지 아쉬운점은.. 역시나 책이 너무 딱딱하다는 느낌을 감출수가 없다. 정말 이건 프로그래밍 책이구나.. 라는 느낌이 팍팍 든다. 알록달록하면 읽기가 더 산만해지긴 하지만 약간은 컬러가 들어갔으면 하는 아쉬움이 있다. 

728x90
반응형
반응형



JavaScript jQuery 입문

저자
윤인성 지음
출판사
한빛미디어 | 2011-12-14 출간
카테고리
컴퓨터/IT
책소개
[출판사서평]1. 이 책이 제시하는 핵심 내용 자바스크립트 기초...
가격비교 글쓴이 평점  


많은 프로젝트에서 java, spring, jsp, 등등의 기술을 많이 사용한다. 이런 기술들과 마찬가지로 Javascript 또한 상당히 많이 사용되고 있다. RIA기반 툴들도 사용문법이 Javascript기반으로 되어있고 이래저래 사용빈도가 상당히 높다. 그럼에도 불구하고 보통 Javascript는 따로 공부한다기 보다는 그때그때 인터넷 찾아서 붙여넣기 하는 경우가 대부분이다. 그래서인지 인터넷 상에는 수많은 소스코드가 있고 그중에는 검증되지 않은 코드들도 많이 존재한다. 그리고 어떤 것이 표준에 맞는 내용인지 조차 구분이 안가는 코드들이 많이 있다.이책은 그러한 기본들을 공부하기에 좋은 책이라고 생각이 된다. 기초부터 고급과정까지 많은 예제 소스들과 함께 설명을 해주고 있다. 


장점

- 무엇보다도 예제가 정말 많다. 거의 페이지마다 1개 이상의 예제소스가 있어서 쉽게 따라 할수가 있었다.

- 해당 소스에 대한 적절한 설명과 그림 추가로 인해서 이해가 쉬웠다.

- Javascript뿐만 아니라 JQuery나 모바일 분야까지 설명을 해줘서 연결해서 공부하기 편하다.

- 정규화등을 뒤에 부록으로 해놔서 보기 편하다.


단점

- 소스코드 관련해서 폰트가 너무 큰것 같다. 코드 자체가 약간 넓게 펼쳐져 보이는 느낌이다

- 표현상 실제 표기로 사용해도 될것 같은데 한글로 표기해서 좀 당황스러웠다. 대표적인것. "불리언"


처음 나오는 부분들은 거의 모든 언어에서 나오는 기본들이 나와서 초보자가 아닌 사람들에게는 약간 지루할수도 있겠지만 그부분 넘어가면 바로 재미있게 적용해볼수 있는 코드들이 많이 나오기때문에 기초를 익히고 기술을 읽히기에 적당한 책인것 같다. 



728x90
반응형

+ Recent posts