|
13 | 13 | > - 근데 jquery는 DOM 조작이나 스타일 변경도 하니까 UI 업데이트 측면에선 view 역할도 함 => MVC 아키텍처를 명확히 지원 안하니까 controller, view 역할 섞이고 스파게티됨 => 유지보수 저하 |
14 | 14 | > - 그래서 Backbone.js 같은 라이브러리 사용하면 jquery 사용하면서 mvc 패턴을 명확히 나눠서 사용할 수 있게 도와준다고 함(안써봐서 모름) |
15 | 15 |
|
| 16 | +## 템플릿 |
| 17 | +태그 함수를 유용하게 사용할 수 있는 예시들이 [mdn](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#tagged_templates)에도 많았음 ㄷ ㄷ 이게 가능한지는 몰랐음 |
| 18 | + |
| 19 | +아래처럼 사용할 수 있는데 알아두면 유용하게 쓰일듯?! |
| 20 | +```js |
| 21 | +const highlightValues = (strings, ...placeholders) => { |
| 22 | + return strings |
| 23 | + .map((string, i) => `${string}${placeholders[i] ? `<b>${placeholders[i]}</b>` : ''}`) |
| 24 | + .join(''); |
| 25 | +}; |
| 26 | + |
| 27 | +const food1 = '과학'; |
| 28 | +const food2 = '수학'; |
| 29 | + |
| 30 | +console.log(highlightValues`자신있는 과목은 ${food1} 그리고 ${food2}입니다.`); |
| 31 | +// 자신있는 과목은 <b>과학</b> 그리고 <b>수학</b>입니다. |
| 32 | +``` |
| 33 | + |
16 | 34 | ## MVP |
17 | | -> 프레젠터는 뷰에 대한 UI 비즈니스 로직을 담당 |
18 | | -> 프레젠터는 뷰와 분리되어 있으며, 인터페이스를 통해 뷰와 통신함 |
| 35 | +프레젠터는 뷰에 대한 UI 비즈니스 로직을 담당 |
| 36 | +프레젠터는 뷰와 분리되어 있으며, 인터페이스를 통해 뷰와 통신함 |
19 | 37 |
|
20 | 38 | ## MVVM (model-view-viewModel) |
21 | 39 | 선언적 데이터 바인딩을 활용하여 뷰에 대한 작업을 다른 계층과 분리할 수 있도록 도와줌 |
22 | 40 |
|
23 | | -#### 선언적 데이터 바인딩? |
24 | | - |
25 | | -> vanila javascript |
| 41 | +> ## 선언적 데이터 바인딩이 뭔데? |
| 42 | +> 바닐라 자바스크립트 예시 |
26 | 43 | > ```js |
27 | 44 | > <div> |
28 | 45 | > <input id="input" type="text" /> |
|
44 | 61 | > </script> |
45 | 62 | > |
46 | 63 | > ``` |
47 | | -> 선언적 데이터 바인딩 |
| 64 | +> 선언적 데이터 바인딩 적용한 예시 |
48 | 65 | > - react에서 state와 props를 통해 선언적으로 데이터와 UI를 연결하는거나 |
49 | 66 | > - `{{value}}` 같은 치환문법 또는 `v-bind="value"`와 같은 뷰 양방향 데이터 바인딩을 말하는거 같음 |
50 | 67 | > ```js |
|
63 | 80 | > } |
64 | 81 | > ``` |
65 | 82 |
|
66 | | -근데 위 코드에서 setState()가 viewModel 역할을 하는게 아닌가 생각이 들었고, view 와 viewModel을 명시적으로 분리하면 mvvm 아닌가 생각이 들었음 |
| 83 | +> 근데 위 코드에서 setState()가 viewModel 역할을 하는게 아닌가 생각이 들었고, view 와 viewModel을 명시적으로 분리하면 mvvm이 되지 않을까 생각이 들었음 |
67 | 84 |
|
68 | 85 | > ```js |
69 | | -> const useMessageViewModel = () => { |
70 | | -> const [message, setMessage] = React.useState(""); |
| 86 | +> const useInput = () => { |
| 87 | +> const [value, setValue] = React.useState(""); |
71 | 88 | > |
72 | | -> const handleChange = (e) => { |
73 | | -> setMessage(e.target.value); |
| 89 | +> const onChange = (e) => { |
| 90 | +> setValue(e.target.value); |
74 | 91 | > }; |
75 | 92 | > |
76 | | -> return { message, handleChange }; |
| 93 | +> return { value, onChange }; |
77 | 94 | > } |
78 | 95 | > |
79 | 96 | > const App = () => { |
80 | | -> const { message, handleChange } = useMessageViewModel(); |
| 97 | +> const register = useInput(); |
81 | 98 | > |
82 | 99 | > return ( |
83 | 100 | > <div> |
84 | | -> <input |
85 | | -> value={message} |
86 | | -> onChange={handleChange} |
87 | | -> /> |
88 | | -> <p>{message}</p> |
| 101 | +> <input {...register} /> |
| 102 | +> <p>{register.value}</p> |
89 | 103 | > </div> |
90 | 104 | > ); |
91 | 105 | > } |
|
101 | 115 | vue.js는 공식적으로 뷰모델을 사용하는 MVVM 패턴이라고 주장함 |
102 | 116 | > 양방향 바인딩 때문에 |
103 | 117 |
|
104 | | -> 책에서 리액트를 예시로 들면서 모델 => 비동기 데이터, 뷰 => 컴포넌트, 컨트롤러 => 훅 으로 이해하는게 도움될 수 이지만 비유일 뿐 엄밀한 뜻은 아니라고 함 |
105 | | -> 컨트롤러 좀 헷갈림 |
106 | 118 |
|
107 | 119 |
|
108 | 120 |
|
|
0 commit comments