Vue.js ์ฝ๋ ๊ณ ๊ณ ํ ์๋ฆฌ์ฆ โข
vue ๊ณ ๊ณ ํ ์๋ฆฌ์ฆ3
Vue.js ์ฝ๋ ๊ณ ๊ณ ํ ์๋ฆฌ์ฆ โข โ v1.0.1 ~ v1.0.3
(Vue.js v1.0.1~v1.0.3 ์ฝ๋ ๋ณํ ๋ถ์ ๋ณด๊ณ ์)
๋ฒ์: Vue.js 1.0.0 ๋ฆด๋ฆฌ์ค ์งํ ์ฐ์์ผ๋ก ๋ฐฐํฌ๋ 3๊ฐ ํจ์น ๋ฒ์ (v1.0.1, v1.0.2, v1.0.3)์ ๋ณํ ์์ฝ ๋ฐ ๊ธฐ์ ์ ์๋ฏธ ์ ๋ฆฌ
0) ํ๋์ ๋ณด๋ ์์ฝ
| ๋ฒ์ | ๋ฆด๋ฆฌ์ค(2015) | ์ฑ๊ฒฉ | ํต์ฌ ํค์๋ |
|---|---|---|---|
| v1.0.1 | 10/27 | ๋ฒ๊ทธ ์์ ์ค์ฌ | v-for index, ๋ฐฐ์ด ๊ต์ฒด ๋ฉ๋ชจ๋ฆฌ ๋์ |
| v1.0.2 | 10/29 | โ๊ธฐ๋ฅ ์ถ๊ฐ ์๋โ (๊ถ์ฅ X) | v-bind ๊ฐ์ฒด ๋ฌธ๋ฒ(์๋), limitBy(์๋) |
| v1.0.3 | 10/29 | 1.0.2 ์์ ํ + ์ถ๊ฐ ๋ฒ๊ทธ ํฝ์ค | v-bind ๊ฐ์ฒด ๋ฌธ๋ฒ ๊ณต์ํ, limitBy ์ถ๊ฐ, filterBy ์ค๋ณต ์ ๊ฑฐ, ์ปดํฌ๋ํธ name ์ถฉ๋, v-for falsy key, IE10/11 title prop |
๋ฉํ ๊ด์ฐฐ: SemVer ๊ด์ ์์ โpatchโ์ ๊ธฐ๋ฅ์ด ๋ค์ด๊ฐ๋ ๊ฑด ๋ณด์์ ์ผ๋ก ๋ณด๋ฉด ์์ธ์ง๋ง, 1.0 ๋ง ์งํ์๋ DX(๊ฐ๋ฐ ํธ์) ๊ธฐ๋ฅ + ๊ธด๊ธ ๋ฒ๊ทธ ํฝ์ค๊ฐ ๊ฐ์ด ๋ฌถ์ด๋ ํจํด์ด ์ค์ ๋ก ๋ํ๋ฉ๋๋ค.
1) v1.0.1 โ ์ด๊ธฐ ๋ฒ๊ทธ ์์ ์ค์ฌ์ ํจ์น
- ๋ฆด๋ฆฌ์ค ์ผ์: 2015-10-27 (v1.0.0๊ณผ ๊ฐ์ ๋ ๋ฐฐํฌ)
- ํต์ฌ: โ์ ํ๋(ํ์) + ์์ ์ฑ(๋ฉ๋ชจ๋ฆฌ)โ ๋ ์ถ์ ๋น ๋ฅด๊ฒ ๋ณด๊ฐ
1.1 v-for ์ธ๋ฑ์ค ์ ๋ฐ์ดํธ ๋ฒ๊ทธ ์์
์ฆ์
v-for="(index, val) in array" ์คํ์ผ์์ index๊ฐ ๊ฐฑ์ ๋์ง ์๋ ๋ฌธ์ ๊ฐ ๋ณด๊ณ ๋์์ต๋๋ค.
๋ฐฐ์ด ๋ณ๊ฒฝ/์ฌ๋ ๋ ์ index alias๊ฐ stale ๊ฐ์ผ๋ก ๋จ์ ํ๋ฉด์ ์๋ชป ํ์๋ ์ ์์์ต๋๋ค.
์ฌ์ฉ์ ๊ด์ ์ํฅ
- ๋ฆฌ์คํธ์์ โ๋ฒํธโ๋ โ์์โ๋ฅผ ํ์ํ ๋ ๊ฐ์ฅ ๋จผ์ ๋์ ๋๋ ์ค๋ฅ
- โ๋ฐ์ดํฐ๋ ๋ง๋๋ฐ ํ๋ฉด ๋ฒํธ๊ฐ ํ๋ฆผโ โ ๋๋ฒ๊น ๋์ด๋ ์์น
์์ (๊ฐ๋ )
<li v-for="(i, item) in list">{{ i }} - {{ item }}</li>
์ด์ list์ ํญ๋ชฉ์ ์ถ๊ฐ/์ญ์ ํด๋ i๊ฐ ์์ ์ ์ผ๋ก ์
๋ฐ์ดํธ๋ฉ๋๋ค.
1.2 ๊ฒน์น๋ ๊ฐ์ฒด๋ก ๋ฐฐ์ด ๊ต์ฒด ์ ๋ฉ๋ชจ๋ฆฌ ๋์ ์์
๋ฌธ์ ๋งฅ๋ฝ
๋ฐฐ์ด์ ํต์งธ๋ก ๊ต์ฒดํ ๋, ์ด์ ๋ฐฐ์ด๊ณผ ์ ๋ฐฐ์ด์ด ๋์ผ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ๊ณต์ ํ๋ฉด
Observer/Dep/Watcher ๊ตฌ๋ ์ด โ์ด์ค์ผ๋ก ๋จ๋โ ํํ์ ๋์๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๋ํ ์๋๋ฆฌ์ค
- ๊ธฐ์กด:
[objA, objB] - ๊ต์ฒด:
[objB, objC](โปobjB๊ฐ ์์ชฝ์ ๋ชจ๋ ์กด์ฌ)
์ ๋์๊ฐ ์๊ธฐ๋ (์ง๊ด)
- โ์ ๋ฐฐ์ด์ ๊ด์ฐฐโํ๋ฉด์
objB์ ๋ํ ๊ด์ฐฐ ์ฐ๊ฒฐ์ด ์ถ๊ฐ๋๋๋ฐ โ์ด์ ๋ฐฐ์ด์์ objB๊ฐ ๋น ์ง๋ ๊ณผ์ โ์์ ์ ๋ฆฌ๊ฐ ์๋ฒฝํ ๋์ง ์์ผ๋ฉดobjB๋ฅผ ์ค๋ณต์ผ๋ก ์ถ์ ํ๋ ์ฐ๊ฒฐ์ด ๋จ์ ์ ์์ต๋๋ค.
๊ฐ๋จ ๋์ (๊ฐ๋ )
[before] array#1 -> objB (observer ๋งํฌ #1) [replace] array#2 -> objB (observer ๋งํฌ #2 ์ถ๊ฐ) [bug] observer ๋งํฌ #1์ด ์์ ํ ์ ๋ฆฌ๋์ง ์์ -> ๋์/๋ถํ์ ์ ๋ฐ์ดํธ ๊ฐ๋ฅ์ฑ
ํจ๊ณผ
- ๋ฐ์์ฑ ์์คํ ์ โ๊ตฌ๋ ์ ๋ฆฌ(cleanup)โ๊ฐ ๋ ์ ํํด์ง
- ๋์ผ ๊ฐ์ฒด๋ฅผ ์ฌ๋ฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ์์ ์ฌ์ฌ์ฉํ๋ ํจํด์์ ์์ ์ฑ ํฅ์
2) v1.0.2 โ ๊ธฐ๋ฅ ์ถ๊ฐ ์๋ (๊ถ์ฅ๋์ง ์๋ ๋ฒ์ )
- ๋ฆด๋ฆฌ์ค ์ผ์: 2015-10-29
- ํน์ง: ๋ฐฐํฌ ํ ๊ณง๋ฐ๋ก 1.0.3์ผ๋ก ๋์ฒด(๊ถ์ฅ X)
์ค๋ฌด์ ๊ฒฐ๋ก : 1.0.2๋ โ์ค๊ฐ ์ฐ์ถ๋ฌผโ์ ๊ฐ๊น๊ณ , ๋ถ์์ 1.0.3 ๊ธฐ์ค์ผ๋ก ํฉ์ณ ๋ณด๋ ํธ์ด ํฉ๋ฆฌ์ ์ ๋๋ค.
2.1 v-bind ๊ฐ์ฒด ๋ฌธ๋ฒ(๋ค์ค ์์ฑ ๋ฐ์ธ๋ฉ) ์๋
๊ธฐ์กด์๋ ์์ฑ๋ง๋ค v-bind:attr๋ฅผ ๋ฐ๋ณต ์์ฑํด์ผ ํ์ต๋๋ค.
<!-- ์ด์ ์คํ์ผ -->
<div :id="someId" :title="someTitle"></div>
๊ฐ์ฒด ๋ฌธ๋ฒ์ โ์์ฑ ๋ฌถ์โ์ ํ ๋ฒ์ ์ ๋ฌํฉ๋๋ค.
<!-- ๊ฐ์ฒด ๋ฌธ๋ฒ -->
<div v-bind="{ id: someId, title: someTitle, 'other-attr': otherProp }"></div>
์ด ๋ฌธ๋ฒ์ v2/v3์์๋ ๊ณ์ ์ด์๋จ๋ โ์ต์ํ ํํโ์ ์์์ ์ ๋๋ค.
2.2 limitBy ํํฐ(๋ฐฐ์ด ์ผ๋ถ๋ง ์ถ๋ ฅ) ์๋
<li v-for="item in items | limitBy 10">{{ item }}</li>
- ์ฒซ 10๊ฐ๋ง ๋ ๋๋ง
- ์คํ์
์ง์:
limitBy 10 5โ 5๋ฒ์งธ๋ถํฐ 10๊ฐ
ํฐ ๋ฆฌ์คํธ์์ โ์ผ๋ถ๋ง ๋ณด์ฌ์ฃผ๊ธฐโ๋ฅผ ํ ํ๋ฆฟ ๋ ๋ฒจ์์ ๋ฐ๋ก ์ฒ๋ฆฌํ ์ ์๋ค๋ ์ ์ด DX ์ฅ์ .
3) v1.0.3 โ ๊ธฐ๋ฅ ์์ฑ ๋ฐ ์ถ๊ฐ ๋ฒ๊ทธ ์์
- ๋ฆด๋ฆฌ์ค ์ผ์: 2015-10-29 (v1.0.2์ ๊ฐ์ ๋ ์ง)
- ํต์ฌ: 1.0.2์์ ์๋ํ ๊ธฐ๋ฅ์ โ๊ณต์ํ/๋ฌธ์ํโํ๊ณ , ์ด๊ธฐ 1.0๋์ ์ฃ์ง ์ผ์ด์ค๋ฅผ ๋น ๋ฅด๊ฒ ๋ดํฉ
3.1 (์ ๊ท) v-bind ๊ฐ์ฒด ๋ฌธ๋ฒ ๊ณต์ ์ง์
<div v-bind="{ id: someId, title: someTitle }"></div>
์ ํ(์ค์)
class/style์ ์ ์ฉ ์ โ๋ฌธ์์ด ๊ฐ๋ง ๋์โ ๊ฐ์ ์ ํ์ด ์ธ๊ธ๋ฉ๋๋ค.- ์ด์ ๋
:class/:style์ ํน์ ์ฒ๋ฆฌ(๋ฐฐ์ด/๊ฐ์ฒด ์ง์ ๋ฑ)์ ์ถฉ๋์ ํผํ๊ธฐ ์ํ ์์ ์ฅ์น๋ก ์ดํดํ ์ ์์ต๋๋ค.
3.2 (์ ๊ท) limitBy ํํฐ ์ถ๊ฐ
ํ ํ๋ฆฟ์์ ๋ฆฌ์คํธ๋ฅผ โ๋ถ๋ถ ๋ ธ์ถโํ ์ ์๋ ๊ธฐ๋ณธ ํํฐ๊ฐ ์์ฑ๋ฉ๋๋ค.
<li v-for="item in items | limitBy 10">{{ item }}</li>
์ด ์์ ์ Vue 1.x์ ๋ฆฌ์คํธ ๊ด๋ จ ๋นํธ์ธ ํํฐ๊ฐ ์ค์ง์ ์ผ๋ก ๋ค์ โ3์ข ์ธํธโ๋ก ์ ๋ฆฌ๋ฉ๋๋ค.
filterBy(๊ฒ์/ํํฐ)orderBy(์ ๋ ฌ)limitBy(๊ฐ์ ์ ํ)
3.3 filterBy ์ค๋ณต ๊ฒฐ๊ณผ ๋ฒ๊ทธ ์์
๋ฒ๊ทธ
์ฌ๋ฌ ํค๋ฅผ ๋์์ผ๋ก filterBy๋ฅผ ์ ์ฉํ ๋,
๋์ผ ๊ฐ์ฒด๊ฐ ์ค๋ณต์ผ๋ก ๊ฒฐ๊ณผ์ ๋ค์ด๊ฐ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์์ต๋๋ค.
<!-- ์์ (๊ฐ๋
): name/email ๋ ๋ค ๊ฒ์ -->
<li v-for="u in users | filterBy q in 'name' 'email'">{{ u.name }}</li>
- ์ด๋ค ์ฌ์ฉ์๊ฐ
name์๋ q๊ฐ ์๊ณemail์๋ q๊ฐ ์์ผ๋ฉด - ๊ฒฐ๊ณผ ๋ฐฐ์ด์ ๋์ผ ๊ฐ์ฒด๊ฐ 2๋ฒ ๋ค์ด๊ฐ ๋ ๋๊ฐ 2๋ฒ ๋ ์ ์์
์์ ํจ๊ณผ
- ๊ฒฐ๊ณผ ์ ํ๋ ๊ฐ์
- ๋ถํ์ํ ์ค๋ณต ๋ ๋ ๋ฐฉ์ง(์ฑ๋ฅ/UX ๋ ๋ค ๊ฐ์ )
3.4 ์ปดํฌ๋ํธ name ์ต์ ๋ฎ์ด์ฐ๊ธฐ/์ถฉ๋ ์์
์ปดํฌ๋ํธ ์ ์์์ name ํ๋๊ฐ ๋ด๋ถ ์ต์
/ํ๋กํผํฐ์ ์ถฉ๋ํด
์๋์น ์๊ฒ ๋ฎ์ด์ฐ์ฌ์ง๋ ๋ฌธ์ ๊ฐ ์์ ๋ฉ๋๋ค.
์ํฅ
- Devtools์์ ์ปดํฌ๋ํธ ์ด๋ฆ์ด ์ ํํ ํ์
- ์ด๋ฆ ๊ธฐ๋ฐ ์๋ณ(๋๋ฒ๊น /๋ก๊ทธ/๊ตฌ์กฐ ์ถ์ )์ด ์์ ํ
3.5 v-for ํค ํํ์ falsy ์ฒ๋ฆฌ ๊ฐ์
๊ฐ์ฒด ๋ฐ๋ณต์์ key๊ฐ 0, "" ๊ฐ์ falsy ๊ฐ์ผ ๋
๋ ๋ ๊ณผ์ ์์ ๋๋ฝ/์ค์๋์ด ๋ฐ์ํ ์ ์๋ ์ฃ์ง ์ผ์ด์ค๋ฅผ ๋ณด์ํฉ๋๋ค.
์ค๋ฌด ํฌ์ธํธ: โํค๋ truthy์ผ ๊ฒโ์ด๋ผ๋ ์๋ฌต ๊ท์น์ ๊ฐ์ ํ๊ธฐ๋ณด๋ค,
3.6 IE10/11 title prop ์ด์ ์์
๊ตฌํ IE(10/11)์์ ์ปดํฌ๋ํธ prop์ผ๋ก title์ ์ฌ์ฉํ ๋ ์๊ธฐ๋ ๋ฌธ์ ๋ฅผ ๋ณด์ํฉ๋๋ค.
<my-component title="..."></my-component>
์๋ฏธ
- โ์ด๊ธฐ 1.0โ์ ์ค์ ๋ก ๋ค์ํ ๋ธ๋ผ์ฐ์ ์์ ์ฆ์ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ๊ตฌํ ํ๊ฒฝ์ ์ฃ์ง ์ผ์ด์ค๊ฐ ํจ์น์์ ๋น ๋ฅด๊ฒ ๋ฐ์๋๋ ํ๋ฆ์ ๋ณด์ฌ์ค๋๋ค.
4) ๋ชจ๋๋ณ ๋ณํ ์์ฝ (๊ธฐ์ ์ ์๋ฏธ)
4.1 ๋ฐ์์ฑ(Reactivity)
- v1.0.1์ โ๋ฐฐ์ด ๊ต์ฒด + ์ค๋ณต ๊ฐ์ฒด ์ฐธ์กฐโ ๋ฉ๋ชจ๋ฆฌ ๋์ ํฝ์ค๊ฐ ํต์ฌ
- ํจ๊ณผ: ๊ตฌ๋ ์ ๋ฆฌ/๊ด์ฐฐ์ ๊ด๋ฆฌ๊ฐ ๋ ์ ํํด์ ธ ๋์/๋ถํ์ ์ ๋ฐ์ดํธ ๋ฆฌ์คํฌ ๊ฐ์
4.2 ๋๋ ํฐ๋ธ(Directive)
- v1.0.1:
v-for index๊ฐฑ์ ์ ํ์ฑ - v1.0.3:
v-forfalsy key ์ฒ๋ฆฌ - v1.0.3:
v-bind๊ฐ์ฒด ๋ฌธ๋ฒ ํ์ฅ(ํ์/๋ฐํ์์ ๊ธฐ๋ฅ ํ์ฅ)
4.3 ์ปดํฌ๋ํธ(Component)
- ํฐ ๊ตฌ์กฐ ๋ณํ๋ ์์ง๋ง,
name์ถฉ๋ ์์ ์ผ๋ก ๋๋ฒ๊น /ํด๋ง ์ฒด๊ฐ ํ์ง์ด ํฌ๊ฒ ๊ฐ์
4.4 ํํฐ(Filter)
limitBy๋์ : ๋ฆฌ์คํธ ๊ฐ๊ณต ๊ธฐ๋ฅ์ โ์์ฑ๋โ ์์นfilterBy์ค๋ณต ์ ๊ฑฐ: ๊ฒฐ๊ณผ ์ ํ์ฑ + ์ฑ๋ฅ(์ค๋ณต ๋ ๋ ์ ๊ฑฐ)
5) โํจ์น ๋ฆด๋ฆฌ์คโ์์ ์ฝ์ ์ ์๋ ๊ตํ
- ์ด๊ธฐ ์์ ํ์ ์ฐ์ ์์๋ โ์ฌ์ฉ์๊ฐ ๋ฐ๋ก ์ฒด๊ฐํ๋ ๋ฒ๊ทธโ
- DX ๊ฐ์ ์ ์์ ๊ธฐ๋ฅ์ด๋ผ๋ ๋น ๋ฅด๊ฒ ๋ค์ด์ฌ ์ ์๋ค
- ๋ธ๋ผ์ฐ์ ํธํ์ฑ์ 1.0 ์งํ์ ํนํ ์ค์
6) ๋ง๋ฌด๋ฆฌ
v1.0.1~v1.0.3์ Vue 1.0์ โ์ฒซ ์ธ์โ์ ๊ฒฐ์ ํ ๊ตฌ๊ฐ์ ๋๋ค.
1.0.0์์ ํฐ ํ์ด ์์ฑ๋์๋ค๋ฉด, ์ด ํจ์น๋ค์ ๋์ฌ ์กฐ์(๋ฒ๊ทธ ํฝ์ค)๊ณผ
์์ ๊ณต๊ตฌ ์ง๊ธ(DX ๊ธฐ๋ฅ)์ผ๋ก ํ์ฅ์์ ๋ฐ๋ก ์ธ ์ ์๋ ์์ฑ๋๋ฅผ ๋์ด์ฌ๋ ธ์ต๋๋ค.
v-for์ ํ๋ โ โ๋ฆฌ์คํธ ๋ ๋๋ ๋ฏฟ๊ณ ์จ๋ ๋๋คโ- ๋ฐ์์ฑ ๋์ ๋ณด์ โ โ์ฅ๊ธฐ ์ด์์๋ ์์ ์ ์ด๋คโ
v-bind๊ฐ์ฒด ๋ฌธ๋ฒ/limitByโ โ์ค์ฉ์ฃผ์ + ๊ฐ๋ฐ์ ๊ฒฝํโ ์ด ํจ์น๋ค์ ์๋๋ฅผ ๋ฐ๋ผ๊ฐ๋ค ๋ณด๋ฉด, Vue๊ฐ ์ดํ ๋ฒ์ ์์๋ ์ ์งํ ํต์ฌ ๊ฐ์นโ
์ฑ๋ฅยท์์ ์ฑยทDX์ ๊ท ํโ์ด 1.0 ์งํ๋ถํฐ ์ด๋ฏธ ๊ตฌํ/์ด์ ์์น์ผ๋ก ์๋ฆฌ ์ก์์์ ํ์ธํ ์ ์์ต๋๋ค.
์ฐธ๊ณ
- Vue ๊ณต์ ๋ฆด๋ฆฌ์ค ๋ ธํธ ๋ฐ GitHub ์ปค๋ฐ ๋ก๊ทธ
- Vue 1.x ์์นด์ด๋ธ ๋ฌธ์, ์ปค๋ฎค๋ํฐ ๋ฆด๋ฆฌ์ค ์ ๋ฆฌ ์๋ฃ ๋ฑ (๋ณธ ๋ฌธ์๋ ์ฌ์ฉ์ ์ ๊ณต ์์ฝ์ ๊ธฐ๋ฐ์ผ๋ก โ๊ธฐ์ ๊ณ ๊ณ ํ ๊ด์ ์ ๊ตฌ์กฐํโ์ ์ด์ ์ ๋ง์ท์ต๋๋ค.)
โฌ๏ธ ์ด ๊ธ์ด ๋์์ด ๋์ จ๋ค๋ฉด, ์๋ ๊ด๊ณ ๋ฅผ ํ ๋ฒ๋ง ํด๋ฆญํด์ฃผ์ธ์! ์ ์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค ๐โโ๏ธ โฌ๏ธ