์๋ ,
Gitter ์ฑํ
์์ ๋จ๊ฑฐ์ด ํ ๋ก ์ด ์์๊ณ 2.0์์ filter
๊ธฐ๋ฅ์ด ๋๋ฝ๋ ์ฌ๋๋ค ์ ๋ํ ํฌ๋ผ์ ๋ฉ์ง ๊ฒ์๋ฌผ์ด ์์ผ๋ฉฐ ์ค์ ๋ก ์ผ๋ถ ์ฌ๋๋ค์๊ฒ๋ ์
๊ทธ๋ ์ด๋๊ฐ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ์ด๊ฒ์ ์ปค๋ฎค๋ํฐ์ ๊ธ์ ์ ์ธ ๋ฐฉํฅ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋์ ์ ๋ ํํฐ๋ฅผ 2.0์ผ๋ก ๋๋๋ฆฌ๊ธฐ ์ํด ์ด ์ ์์ ํ๊ณ ์ถ์ต๋๋ค. ์๋ํ๋ฉด ํํฐ๊ฐ ๋๋ฌด ์ฌ๋๋ฐ๊ณ ๋๋ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ค์์ ํํฐ์ ๋ํ ๋ช ๊ฐ์ง ์ฃผ์ฅ์ ๋๋ค(๋ค์ํ ํ ๋ก ์์ ์์ง๋์์ผ๋ฉฐ ์ ํ์ฑ์ ๋ํ ๋ณด์ฅ์ ์์).
thing in things | filterBy 'foo' | orderBy 'bar' | limitBy 5
๋จ์ํ ์ฝ๊ธฐ ์ฝ์ต๋๋ค. ์ฆ, ํํฐ๋ฅผ ์ฐ๊ฒฐํ๋ฉด ์ค์ ๋ก ์์ํด์ผ ํ๋ ๋ด์ฉ์ ์ดํดํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๋งํ ํ์๋ ์์ด ์์ง๋์ด๋ง ๊ด์ ์์ ํํฐ๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ ๋ํ ๊ฐ๋ ฅํ ์ฃผ์ฅ์ด ์์ ์ ์์ผ๋ฉฐ ์ด ์ค๋ ๋๊ฐ ์ฐฌ๋ฐ ์๋ก ์ด ๋๊ณ ํํฐ ๋ฐํ์ ๋ํ ์ฐฌ์ฑ ๋๋ ๋ฐ๋ ํฌํ๋ฅผ ์ ์ํ๋ ์ด์ ๊ฐ ์์ต๋๋ค.
์ค์ฝง
์๋ Gitter ์ฑํ
์์ ๋์จ ์์ ์ ๋ช
ํํ ํ์๋ฉด: debounce
๋ ํํฐ๊ฐ ์๋๋ฉฐ ์ฌ๋๋ค์ด ์ง๋ ๊ฒ์ ๋ํด ๊ธฐ๋ปํ์ง ์์ 2.0 ๋ณ๊ฒฝ ์ฌํญ ์ค ํ๋์ผ ๋ฟ์
๋๋ค.
@JosephSilber ์ ์์ ์ ๊ณต: debounce
๋ ํํฐ์ด์ v-model
๋งค๊ฐ๋ณ์์
๋๋ค.
@agc93๋ ๊ฐ์ฌํฉ๋๋ค. ๋๋ ๊ทธ ์ ์ ์ ๊ฑฐํ๋ค.
์ค์ฝง
์ต์
์ ๊ฒฝ์ฐ ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์์ ํ๋ฌ๊ทธ์ธ์ ๋ง๋ค ๊ฒ์
๋๋ค. ํํฐ์ ๋ํด์๋ https://www.npmjs.com/package/babel-plugin-pipe-operator ๊ฐ ์์ต๋๋ค.
๋ฌธ์ ๋ ์ด๊ฒ์ด babel ์ปดํ์ผ ์์ด๋ ์๋ํ์ง ์๋๋ค๋ ๊ฒ์
๋๋ค.
๋๋ ์ผ๋ถ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํด ๋๋ฌด ํฅ๋ถํ์ง ์์ต๋๋ค. ํํฐ์ ๊ฒฝ์ฐ ์ ์ญ ๋ฏน์ค์ธ ์ ๋ฑ๋กํ๋ ์ฌ์ด ๋์์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ pluralize ๋ฑ๊ณผ ๊ฐ์ ๋งค์ฐ ๊ฐ๋จํ ์์ ์ ์ํด ๋ชจ๋ ๊ตฌ์ฑ ์์์ ๋ฉ์๋ ๋ฒ์๋ฅผ ์ค์ผ์ํค๋ ์์ด๋์ด๋ฅผ ์ข์ํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์๋ฐฉํฅ ํํฐ๋ฅผ ์ฌ์ฉํ ์ ์ด ์์ต๋๋ค.
ํํฐ๋ ํธ๋ฆฌํ๊ณ ์๋ฆ๋ค์ ์ต๋๋ค. vue๊ฐ ํญ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ํํ ๋ ๊ฐ์ง(์ง๊ธ๊น์ง).
vue 2.0์ ๋ํ ๊ฒ์๋ฌผ์ ์ฝ์์ ๋ ๋ชจ๋ ์๋ก์ด ๊ฐ๋ฅ์ฑ(ํนํ ๊ฐ์ ๋ ๋ฐ ์๋ฒ ๋ ๋๋ง)์ ๋ํด ํฅ๋ถํ์ง๋ง ํํฐ๊ฐ ์ฌ๋ผ์ง ๊ฒ์ ๋๋๊ณ ์กฐ๊ธ ์ฌํ์ต๋๋ค.
๊ทธ๊ฒ๋ค์ ๋ด๊ฐ vue์์ ๊ฐ์ฅ ์ข์ํ๋ ๋ถ๋ถ ์ค ํ๋์์ต๋๋ค. ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๊ณ ์ฐ๊ฒฐํ ์ ์๊ธฐ ๋๋ฌธ์ผ ๋ฟ๋ง ์๋๋ผ ์ฃผ๋ก ์ฝ๊ฒ ํ์ฅํ ์ ์๊ณ ํ
ํ๋ฆฟ์์ ์ง์ ์ฌ์ฉํ ์ ์๋ ์๋ฆ๋ค์ด ๊ตฌ๋ฌธ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ํนํ v-for
๋ฃจํ์ ํจ๊ป ์ฌ์ฉํ๋ฉด ์๋ฒฝํ๊ฒ ์ผ์นํฉ๋๋ค.
๋ด๊ฐ ์ํ๋ ๋ชจ๋ ์ํ์ ๋ํ ํํฐ๋ง์ ๋์ฒดํ๊ธฐ ์ํด ๊ณ์ฐ๋ ์์ฑ์ ์ฌ์ฉํด์ผ ํ๋ค๊ณ ์๊ฐํ๋ฉด์ ์์ผ๋ก ๋ง์ ์์ฉ๊ตฌ๋ฅผ ์์ฑํ๊ฒ ๋ ๊น๋ด ๊ฑฑ์ ๋ฉ๋๋ค. ๋ฏน์ค์ธ์ด ๋ฌธ์ ์ ์ผ๋ถ๋ฅผ ์ํํ ์๋ ์์ง๋ง ์ฌ์ ํ vue ์ฌ์ฉ์ ์ฐ์ํจ๊ณผ ์ฉ์ดํจ์ ์ผ๋ถ๊ฐ ๋๋ฝ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋์ํ๋ ๋ชจ๋ ๋ถ๋ค, ์ค๋ช
์๋์ ์๋ ์ข์์๋ฅผ ๋๋ฌ์ฃผ์๊ฒ ์ต๋๊น? +1
17,000๋ช
์๊ฒ ์คํธ์ ๋ณด๋ด๋ ๊ฒ๋ณด๋ค ๋ซ์ต๋๋ค. ๋ ์ข์ ๊ฒ์ ์๋ฏธ ์๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์๊ฐํด๋ด๋ ๊ฒ์
๋๋ค.
์๋ฐฉํฅ ํํฐ๋ฅผ ์ฌ์ฉํ ์ ์ด ์์ง๋ง ํํฐ๊ฐ ์ ๋ง ๊ทธ๋ฆฌ์ธ ๊ฒ์ ๋๋ค! ๊ณ์ฐ๋ ์์ฑ์ ์ฌ์ฉํ ์ ์์ง๋ง(๋๋ก๋ ์ฌ์ฉํฉ๋๋ค), ์ผ๋ถ ๊ฐ๋จํ ๊ฒฝ์ฐ์๋ ์ํฌํ๋ก์ ์๋๋ฅผ ๋์ด๋ ํธ๋ฆฌํจ์ด ์์ต๋๋ค.
์ด ๋งค์ฐ ๊ฐ๋จํ ์๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
<input type="text" v-model="filter">
<ul>
<li v-for="item in items | filterBy filter">{{ item }}</li>
</ul>
์์ ๋ด์ฉ์ ๋ ๋ณต์กํ ํํฐ๋ง์ด ํ์ํ์ง ์์ ๊ฒฝ์ฐ ์์ฑํ๊ธฐ๊ฐ ํจ์ฌ ์ฝ์ต๋๋ค.
์ด์ ๋ค์๊ณผ ๋น๊ตํ์ญ์์ค.
<input type="text" v-model="filter">
<ul>
<li v-for="item in filteredItems">{{ item }}</li>
</ul>
new Vue({
el: 'body',
data: {
items: [],
filter: ''
},
computed: {
filteredItems() {
var self = this
return this.items.filter(function(item) {
return item.indexOf(self.filter) > -1
})
}
}
})
๋ ๋ฒ์งธ ๊ฒ์ด ์ฐ๊ธฐ ์ด๋ ต๋ค๋ ๋ง์ ์๋์ง๋ง ์ฌ๋ฌ ๊ณณ์์ ์ฌ์ฉํ๋ค ๋ณด๋ฉด ์ค์ค๋ก ๋ฐ๋ณตํ๊ธฐ ์์ํ๊ณ ๋ค๋ฅธ ์ ์ฉํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ ์ถ๊ฐ ์๊ฐ์ด ํ์ํ ๋ฟ์ ๋๋ค!
์ด๋ ์ชฝ์ด๋ ๋๋ ํ๋ณตํ Vue ์ฌ์ฉ์๋ก ๋จ์ ๊ฒ์ด๋ฉฐ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ํํฐ์ ๋ํ ๋ด ์๊ฒฌ์ ๊ณต์ ํฉ๋๋ค!
ํํฐ๋ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค. ๋ด ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ ํ์ํํ๋ ํจ์๋ฅผ ๋ง๋ค๊ณ ํํฐ๋ก ๋ฑ๋กํ๊ณ ๋ชจ๋ ์ธ์คํด์ค์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. 2.0์์๋ ์ด๋ป๊ฒ ํ๋์?
2.0์์๋ ์ด๋ป๊ฒ ํ๋์?
- ๋ฏน์
- ๋ฉ์๋๋ก ๋ชจ๋ ๋ถ๋ฆฌ
- ๊ณ์ฐ๋ prop ํจ์๊ฐ ์๋ ๋ณ๋์ ๋ชจ๋
๋ฐฉ๊ธ ๊ณต์ง ์ค๋ ๋์ ๋๊ธ์ ๋จ๊ฒผ์ผ๋ฏ๋ก ์ฌ๊ธฐ์ ๋ชจ๋ ๋ณต์ฌํ๋ ๋์ ๊ฐ๋จํ ๋งํฌํ๊ฒ ์ต๋๋ค.
http://archive.forum.vuejs.org/topic/3891/announcing-vue-js-2-0-public-preview/8
์์ฃผ ํธ๋ฆฌํ ๋ฌด์ธ๊ฐ๊ฐ ๋น์ ์๊ฒ์ ๋นผ์๊ธฐ๋ ๊ธฐ๋ถ์ ์ถฉ๋ถํ ์ดํดํฉ๋๋ค. ํ์ง๋ง ๋จผ์ ์์ ํฌ๋ผ ์ค๋ ๋์์ @chrisvfritz ์ ์๊ฒฌ์ ์ ์ ์ฝ์ด๋ณด์ญ์์ค. ํ ๋ก ์ ์ฝ๊ฒ ํ๊ธฐ ์ํด ๋ณต์ฌํ์ฌ ์ฌ๊ธฐ์ ๋ถ์ฌ๋ฃ์ต๋๋ค.
@therzach Vue์ ๋ํ ์ด์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค! ์ง์ ์ค๋จ์ ๋ํด ์ข ๋ ์ ์ค๋ช ํ๊ณ ์ถ์ง๋ง ๋จผ์ ์ ๋ฅผ ์๊ฐํด์ผ ํฉ๋๋ค. ์ ๋ Vue ํต์ฌ ํ์ ๊ตฌ์ฑ์์ด๋ฉฐ ํ๋ฆฌ๋์ UI ๋ฐ ๋ฐ์ดํฐ ์๊ฐํ ์์ ์ ํญ์ Vue๋ฅผ ์ฌ์ฉํ๋ฉฐ ์ฌ๋๋ค์๊ฒ ๋ค๋ฅธ ์น ๊ธฐ์ ์ค์์ Vue์ Rails๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋ฅด์น๋ ๊ต์ก์์ด๊ธฐ๋ ํฉ๋๋ค. ์ ๋ ์ฝ๋ ์ค์ฟจ์ ์ด์ํ๊ธฐ ๋๋ฌธ์ ์ฌ๋๋ค์ด ๊ฑฐ์ _๋งค์ผ_ ์ด ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๊ณ ํจ๊ป ์ฌ์ฉํ๋๋ก ๋์ต๋๋ค.
๋๋ ๋ํ Vue 2.0์์ ํํฐ ์ ๊ฑฐ์ ๋ํ ํฐ ์ง์ง์ ์ค ํ๋์์ต๋๋ค.
Vue ์ด๋ณด์๋ฅผ ์ํ ํํฐ ๋ฌธ์
ํํฐ ์ฌ์ฉ ์ค๋จ์ ์ฐฌ์ฑํ ๊ฐ์ฅ ํฐ ์ด์ ๋ ์ฌ์ค _for_ ์ด๋ณด์์์ต๋๋ค. ํ์๋ค๊ณผ ์์ ํ ๋ ๋ค์๊ณผ ๊ฐ์ ๋ํ๊ฐ ๋ ๋ฒ ์ด์ ๋์ต๋๋ค.
์ด๋ณด์๋ฅผ ๊ณค๊ฒฝ์ ๋น ๋จ๋ฆฌ๋ ๊ฐ์ฅ ํฐ ๊ฒ ์ค ํ๋๋ _์์ธ_์ ๋๋ค. ํํฐ๋ ๊ธฐ๋ฅ์ผ ๋ฟ์ด๋ฉฐ _์ ์ธ_ ํน๋ณํ ๊ตฌ๋ฌธ์ด ํ์ํ๋ฉฐ ๋ชจ๋ ๊ณณ์์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ค์ ES7์ ํตํฉ๋ ์ ์๋ ํ์ดํ ๊ตฌ๋ฌธ๊ณผ ๋ค๋ฅธ ํ์ดํ ๊ตฌ๋ฌธ์ ์ฌ์ฉํฉ๋๋ค. ์ฆ, ์ฌ๋๋ค์ด ๋งค์ฐ ์ ์ฌํ ์์ ์ ์ํํ๋ ๋ ๋ช ์ ๋งค์ฐ ์ ์ฌํ ์ฐ์ฐ์๊ฐ ์์ ๋๊น์ง๋ ์ค๋ ๊ฑธ๋ฆฌ์ง ์์ง๋ง _์์ฃผ_ ๋๊ฐ์ง๋ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ค ํ๋๋ง์ด ์ค์ ๋ก JavaScript์ ๋๋ค.
Util ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ _are_ ์ ์ฉํ์ง๋ง Vue๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
filterBy
, ๋ฌธ์์ด ๋ฐ ์ซ์ ๋ณํ ๋ฐ ๊ธฐํ ํน์ ํํฐ์ ๊ฒฝ์ฐ ์, ํด๋น ํํฐ๊ฐ ๋ํ๋๋ ์์ฉ ํ๋ก๊ทธ๋จ์์ ์ ์ฉํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก Util ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ์ฉํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ํํ ์ ์๋ ์์ญ ๊ฐ์ ํ๋ฅญํ ์ ํธ๋ฆฌํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ง๋ง Vue๋ ์ ํธ๋ฆฌํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋๋๋ค. ์์งํ ๋งํด์, ์ฐ๋ฆฌ๊ฐ ์ ๊ณตํ ์ ํธ๋ฆฌํฐ ์ค ์ด๋ ๊ฒ๋ ๋๊ธ ์ต๊ฐ์ ๊ฒ์ด ์๋๋๋ค.
ํตํ, ๋ ์ง ๋๋ ํํฐ๋ง ๋ฐฐ์ด์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์ฐ๋ฆฌ์ ์ด์ ์ด ์๋๋๋ค. ๋ง์ ์ฑ์ ์ด๋ฅผ ํ์๋ก ํ์ง ์์ผ๋ฉฐ ๋ด๊ฐ ์์ ํ ๋๋ถ๋ถ์ ์ฑ์ ์ด๋ฌํ ๋ฌธ์ ์ ์ง๋ฉด _do_ ํ์ฌ Vue๊ฐ ์ ๊ณตํ๋ ๊ฒ๋ณด๋ค ๋ ๊ฐ๋ ฅํ ์๋ฃจ์ ์ ํ์๋ก ํฉ๋๋ค(๋๋ ์๋นํ ํฝ์ฐฝ ๋ฐ ๋ฐํด ์ฌ์ฐฝ์กฐ ์์ด ์ ๊ณต _ํ ์ ์์).
๋ด ์ฑ์์ Accounting.js๋ ํตํ๋ฅผ ํ๋ฅญํ๊ฒ ์ฒ๋ฆฌํ๊ณ Moment.js(๋น์ ์ด ์ธ๊ธํ๋ฏ์ด)๋ ๋ ์ง์ ์๊ฐ์ ์ฒ๋ฆฌํ๊ณ pluralize
๋ ๋ง์ ๋ณต์ํ๋ฅผ ์ ์ฒ๋ฆฌํ์ง ์์ผ๋ฏ๋ก ์ฌ์ฉ์ ์ ์ ๊ณ์ฐ ๊ฐ์ด ๋ ๋ฐ๋์งํ๊ณ json
๋ JSON.stringify
๋ณด๋ค ์ฝ๊ฐ ๋ ๋ง์ต๋๋ค.
๊ณ์ฐ๋ ์์ฑ์ ์ฅ์
ํํฐ ๋์ ๊ณ์ฐ๋ ์์ฑ์ ์ฌ์ฉํ๋ฉด ์ฒ๋ฆฌ๋ ๊ฐ์ ๊ตฌ์ฑ ์์์ _์ด๋์๋ _ DRY ๋ฐฉ์์ผ๋ก ์ฝ๊ฒ ์ฌ์ฌ์ฉํ ์ ์๋ค๋ ์ด์ ๋ ์์ต๋๋ค. ๋ด ์ฑ์์ ํญ์ ์ด ์์
์ ์ํํด์ผ ํฉ๋๋ค. ๊ณ์ฐ๋ ์์ฑ์ ๋ํ ํ
ํ๋ฆฟ์์ ๋ ๋ง์ ๊ตฌํ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ด๋ํ์ฌ ๊ตฌ์ฑ ์์๊ฐ ์ํํ๋ ์์
์ ๋ํ ๋ช
ํํ ์ค๋ช
๋ง ๋จ๊น๋๋ค. ์ ์ญ์ ์ผ๋ก ์ ์๋ ํํฐ์ ๋นํด ์ด์ ์ ํด๋น ์ปดํจํฐ ๊ฐ์ ๋ํ ๊ธฐ๋ฅ๋ง ๋ณด๊ณ ์ ํํ ์๋ ๋ฐฉ์์ ์กฐ์ ํ๋ฉด ๋๋ค๋ ๊ฒ์
๋๋ค. ๋ฐฐ์ด์์ JavaScript์ map
๋ฐ filter
๋ฉ์๋๋ฅผ ์ฐ๊ฒฐํ๋ฉด ํ์ดํ๊ฐ ์ํํ๋ ๊ฒ๊ณผ ๋์ผํ ์ ํ ์ฒ๋ฆฌ ๋ชฉ๋ก์ ์ ๊ณตํ์ง๋ง ํจ์ฌ ๋ ์ ์ธ์ ์ด๊ณ ์ฝ๊ฒ ์กฐ์ํ ์ ์์ต๋๋ค.
์ ์ญ์ ์ผ๋ก ์ ์๋ ๊ฒ์ ์ ์ฉ์ฑ
๋ชจ๋ ๊ตฌ์ฑ ์์์์ ์ก์ธ์คํ ์ ์๋ ๊ธฐ๋ฅ์ด๋ ๋ค๋ฅธ ๊ฒ์ ์ ์ํด์ผ ํ๋ ๊ฒฝ์ฐ Vue.prototype.whateverIWant = mySuperCoolFunction
๊ฐ ์ข์ ๋ฐฉ๋ฒ์
๋๋ค. ๊ฐ์ธ์ ์ผ๋ก ๋๋ ํ ๋ฒ๋ ํ๊ณ ์ถ์ง ์์์ต๋๋ค. ์ ๋ ํญ์ ๋์ฐ๋ฏธ ๋ฉ์๋๋ฅผ ๋ชจ๋์ ๋ฃ๊ณ ํ์ํ ๊ณณ์ ํด๋น ๋ชจ๋์ ๊ฐ์ ธ์ค๋ ๊ฒ์ ์ ํธํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ์ข
๋ฅ์ ์ ์ญ ๋ฑ๋ก์ด ๋ ์ด๋ ค์์ง์ง ์๋๋ค๋ ์ ์ ์ ์ํ๋ ๊ฒ์ด ์ฌ์ ํ ์ค์ํฉ๋๋ค.
debounce
์ง์์ด์ ๊ฒฝ์ฐ
๋๋ ์ด ์ผ์ ๋ํด ์ค์ ๋ก ๋น์ ๊ณผ ํจ๊ป ์๋ค๊ณ ๋งํด์ผ ํฉ๋๋ค! ๋๋ ์ต๊ทผ์ ๋ชจ๋ Vue ํ๋ก์ ํธ๋ฅผ ์ดํด๋ณด์๊ณ input
์ด๋๊ฐ์ debounce
๊ฐ ์๋ ๋ชจ๋ ๋จ์ผ ํ๋ก์ ํธ๋ ์ฌ์ฉํ์ต๋๋ค. ์ฌ์ค, ์ ๊ณผ๊ฑฐ ์์ฉ ํ๋ก๊ทธ๋จ ์ค ๋จ ํ๋๋ง์ด ๋๋ฐ์ด์ค๋ฅผ _์ฌ์ฉํ์ง ์์์ต๋๋ค_. ๊ธฐ์ ์ ์ผ๋ก ์ ํธ๋ฆฌํฐ์ธ lodash ๋ฐ ๊ธฐํ ์ฌ๋ฌ ๊ฐ๋ ฅํ ํ๋ก์ ํธ๊ฐ ๋๋ฐ์ด์ค ์๋ฃจ์
์ ์ ๊ณตํ์ง๋ง ์ด ๋ฌธ์ ๋ _๋ชจ๋ _ ์ข
๋ฅ์ ์ฑ์ ๋ํด UI ๊ฐ๋ฐ์ ๋งค์ฐ โโ๋ณดํธ์ ์
๋๋ค. ์์ ์ ๋๋ฐ์ด์ค ๊ธฐ๋ฅ์ ์์ฑํ๋ ๊ฒ ๋ํ ๊ฑฐ์ ๋ชจ๋ ํ๋ก์ ํธ์ lodash์ ๊ตฌํ์ ์ฌ์ฉํ๊ณ ์ถ์ ๋งํผ ๊ฐ๋จํ์ง ์์ต๋๋ค.
์ด์ ๋ํ ๋ด๋ถ ํ ๋ก ์ด ๋จ์ ์์ผ๋ฏ๋ก ์ด๋๋ก ๊ฐ๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ ์, ๊ฐ์ธ์ ์ผ๋ก ๊ทธ๋ฆฌ๊ณ ์ผ๋ถ ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ๋ ๋ณด์ด๋ ๊ฒ์ฒ๋ผ ๋๋ฐ์ด์ค๋ฅผ ์ ๊ฑฐํ๋ฉด v-model
์์ ์ ๊ณตํ๋ ๋๋ถ๋ถ์ ํธ์๊ฐ ์ ๊ฑฐ๋ฉ๋๋ค.
๋ค์ ํ๋ฒ, ๋น์ ์ ์ด์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
์ง์ฌ์ผ๋ก, ์ฐ๋ฆฌ๋ ๋น์ ์ด Vue๋ฅผ ์ผ๋ง๋ ์ฌ๋ํ๋์ง ์ฌ๋ํ๊ณ ๋น์ ์ด ๋น์ ์ ์ฐ๋ ค๋ฅผ ํ๋ช ํ๋ ๊ฒ์ ์ ๋ง๋ก ๊ธฐ์๊ฒ ์๊ฐํฉ๋๋ค. ํนํ ์น์ ํ๊ณ ์ ์คํ ๋ฐฉ์์ผ๋ก ๋ง์ ๋๋ค! ์ฐ๋ฆฌ๋ ๋น์ ์ ๋ฃ๊ณ ์์ต๋๋ค. ํต์ฌ ํ์ ๋ชจ๋ ๋์์ด๋, ํ๋ฐํธ ์๋ ๊ฐ๋ฐ์ ๋ฐ ๋ฐ์ดํฐ ์๊ฐํ ์ ๋ฌธ๊ฐ์ ๋๋ค. ์ฐ๋ฆฌ ๋ชจ๋๋ ๊ฝค ๋ค์ํ ์์ ์ Vue๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ๊ฐ ๋จน๊ณ ์ถ์ dogfood๋ฅผ ๋ฐ์ด๋ด๊ธฐ ์ํด ํ์คํ ์ ๋ ํ๊ณ ์์ต๋๋ค. :-)
Talk๋ ์ ๋ ดํฉ๋๋ค. ํํฐ๊ฐ ์๋์ง ์ฝ๋๋ฅผ ์์ฑํ์ฌ filterBy๋ฅผ ์ ์ฉํ๊ณ ๋ฐ๋๋ก ํฉ์๋ค.
์ฝ๋ ์ฌ์ฌ์ฉ์ ์ํด ๋ณ๋์ ํ์ผ์ ์ ์ญ ์์ ํํฐ ๊ธฐ๋ฅ ์์ฑ
//
// filters.js
//
function filterBy(list, value) {
return list.filter(function(item) {
return item.indexOf(value) > -1;
});
}
function findBy(list, value) {
return list.filter(function(item) {
return item == value
});
}
function reverse(value) {
return value.split('').reverse().join('');
}
export {filterBy, reverse, findBy}
App.vue ํ ํ๋ฆฟ์์ ํํฐ ์ฌ์ฉ
<template>
<div id="app">
<h1> Reverse Demo </h1>
<p> {{ reverse(msg) }}</p>
<hr />
<h1> Filter Demo </h1>
<input v-model="userInput" />
<h2> Prefix Matched Words: </h2>
<ul v-for="word in filterBy(words, userInput)">
<li>{{word}}</li>
</ul>
<h2> Exact Matched Words: </h2>
<ul v-for="word in findBy(words, userInput)">
<li>{{word}}</li>
</ul>
</div>
</template>
<script>
import {reverse, filterBy, findBy} from './filters.js'
export default {
data() {
return {
userInput: '',
msg: 'Hello Vue!',
words: ['Black', 'Block', 'Blue', 'Alpha'],
}
},
methods : {
reverse,
filterBy,
findBy,
},
}
</script>
http://raywill.github.io/vuefilter/ ์์ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
ํํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ค์ vue ์ฝ๋๋ ๋์ผํ๊ฒ ์ํ๋ฉ๋๋ค.
<template>
<div id="app">
<h1> Reverse Demo </h1>
<p> {{ msg | reverse }}</p>
<hr />
<h1> Filter Demo </h1>
<input v-model="userInput" />
<h2> Prefix Matched Words: </h2>
<ul v-for="word in words | filterBy userInput">
<li>{{word}}</li>
</ul>
<h2> Exact Matched Words: </h2>
<ul v-for="word in words | findBy userInput">
<li>{{word}}</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
userInput: '',
msg: 'Hello Vue!',
words: ['Black', 'Block', 'Blue', 'Alpha'],
}
},
}
๋ถ๋ช
ํ ์ง์๋๋ ํํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ๊ฐ๋จํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ์ฝ๋ฉ์ ๋ ์ฆ๊ฒ๊ฒ ๋ง๋๋ vue 1.0 ๋ฐฉ์์ ์ ํธํฉ๋๋ค.
์์ฉ๊ตฌ ๋ฌธ์ ์ ๊ดํด์๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์์์ ์ค๋ช ํ @raywill ์ฒ๋ผ. ์ข ๋ ์ฅํฉํ์ง๋ง ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Vue.prototype
Vue.prototype.filters = {
filterBy: ...,
orderBy: ...
}
<ul v-for="word in filters.filterBy(words, userInput)">
<li>{{word}}</li>
</ul>
computed: {
filteredThings () {
return this.things
.filter(contains(this.foo))
.sort(by(thing => thing.bar))
.slice(0, 10)
}
}
๋์ฐ๋ฏธ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
// a function that returns a predicate function for array.filter()
function contains (value) {
return thing => thing.indexOf(value) > -1
}
function by (getValue) {
return (a, b) => {
return getValue(a) > getValue(b) ? 1 : -1
}
}
๋ค์ ๋งํ์ง๋ง, ๋งค์ฐ ์ค์ํ ์ค๊ณ ๊ณ ๋ ค ์ฌํญ์ ๋ด์ฅ ํํฐ๊ฐ ์ ์ฉํ ์ ์์ง๋ง ์์ํ JavaScript์ ์ ์ฐ์ฑ์ด ๋ถ์กฑํ๋ค๋ ๊ฒ ์ ๋๋ค. ๋ด์ฅ ํจ์๊ฐ ํ์์ ๋ง์ง ์์ผ๋ฉด ๋น์ทํ ๊ฒ์ ๋ค์ ๊ตฌํํ๊ฑฐ๋(๊ทธ๋ฆฌ๊ณ ๋ ๋ค ์ต์ข ์ฝ๋์ ํฌํจ๋์ด ๋ด์ฅ ๊ธฐ๋ฅ์ด ์ธ๋ชจ ์๊ฒ ๋๋ ๋ฐ๋ ์ฝ๋๊ฐ ๋จ) Vue๊ฐ ๋ค์์ ์ํํ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํฉ๋๋ค. ์ ๋ฐ์ดํธํ๊ณ ์ ๋ฒ์ ์ ์ถ์ํ์ญ์์ค.
@yyx990803 ํ๋กํ ํ์ ๋ฐฉ์์ด ๋ง์์ ๋๋๋ฐ ์ฌ๋ฌ ํํฐ๊ฐ ํ์ํ ๊ฒฝ์ฐ๋?
filterBy
orderBy
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋งค์ฐ ์ผ๋ฐ์ ์
๋๋ค.
<ul v-for="word in filters.orderBy(filters.filterBy(words, userInput), column, -1)">
<li>{{word}}</li>
</ul>
limitBy
๋ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ๋ ์ด๋ป์ต๋๊น?
<ul v-for="word in filters.limitBy(filters.orderBy(filters.filterBy(words, userInput), column, -1), limit)">
<li>{{word}}</li>
</ul>
์, ์ ์ด๋ ์ ์๊ฐ์๋.
filterAndOrderBy
์ ๊ฐ์ ํํฐ๋ฅผ ๊ฒฐํฉํ ์ ์์ง๋ง ๊ทธ๊ฒ๋ ์ณ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํด ๊ฐ๋ฐฉ์ ์ด๋ฉฐ ๊ฑฐ์ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ์ถ์ต๋๋ค!
๋ํ ํํฐ๋ฅผ ์ด๋์๋ ์ฌ์ฉํ ์ ์๋ค๋ ์ฅ์ ๋ ์ ๋ง ์ข์ ํฌ์ธํธ์ ๋๋ค.
์ฐธ๊ณ ๋ก @vuejs/collaborators๋ ํ์ฌ ํตํฉ ํํฐ์ ์ ํธ๋ฆฌํฐ ํจํค์ง๋ฅผ ์ ๊ณตํ๋ ์ต์ ์ ๋ํด ๋ ผ์ํ๊ณ ์์ต๋๋ค. ์ฝ๋ ๊ธฐ๋ฐ์ ์ํ ์ ํธ๋ฆฌํฐ ๋๊ตฌ๋ฅผ ์ ๊ณตํ ๋ฆฌ์์ค๊ฐ ๋ง์ด ์์ต๋๋ค.
ํต์ฌ ํํฐ๋ฅผ ์ ๊ฑฐํ ๋ ํ ๊ฐ์ง ์ข์ ์ ์ ์ด์ ์ง์ ์ฌ์ฉ์ ์ ์/๊ตฌํํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ํจ์ฌ ๋ ๋ง์ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค.
@rigor789 ํ
ํ๋ฆฟ ํํ์์ ์ต๋ํ ๋จ์ํด์ผ ํฉ๋๋ค. ์ด์์ ์ผ๋ก๋ <div v-for="filteredData"> </div>
์ ๊ฐ์ต๋๋ค. ์ด๊ฒ์ ํํฐ๋ง๋ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ธฐ ์ํ ๋
ผ๋ฆฌ๋ฅผ ๋ณด์ ํ ์ ์๋ ๊ณ์ฐ๋ ์ํ์ผ ์ ์์ต๋๋ค. ์ด๊ฒ์ ํจ์ฌ ์ฝ๊ธฐ ์ฝ๊ณ ๋ค์๊ณผ ๊ฐ์ ๊ฒ๋ณด๋ค ๋ซ์ต๋๋ค.
<div v-for="item in filters.orderBy(filters.filterBy(words, userInput), column, -1)"> </div>
๋๋
div v-for="item in data | filterBy | orderBy "
์๋ฒ
๊ณ์ฐ๋ ์์ฑ์ผ๋ก ํ ๋นํ๋ ๊ฒ์ด ํจ์ฌ ๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ ์์ ๊ตฌ์ฑ ์์๋ก ์ ๋ฌ๋ ์๋ ์์ต๋๋ค. ํํฐ๋ง๋ ๋ฐ์ดํฐ๋ฅผ ๋ ๊ณณ์์ ์ฌ์ฉํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? ํํ์์ ์ฐ๊ฒฐ๋ ํํฐ๊ฐ ์๋ ๊ฒ๊ณผ ๋น๊ตํ์ฌ ํ ํ๋ฆฟ์ ๋จ์ํ ํํ์์ด ์๋ ๊ฒ์ด ๋ ์ฝ๊ณ , ๊ฐ๋จํ๊ณ , ์์ ์ ์ด๊ณ ๊ฐ๋ ์ฑ์ด ๋์ต๋๋ค.
ํ๋ก์ฐํ๋ ์ฌ๋์ ์ํด ์ ๋ @chrisvfritz์ ๋ต๋ณ http://forum.vuejs.org/topic/3891/announcing-vue-js-2-0-public-preview/17
๋ค์์ ์ ์ธ๊ณ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ _๋งค์ฐ_ ์์์ ์์ ๋ณด๊ธฐ ๋์ฐ๋ฏธ ํจ์์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํด๊ฒฐํฉ๋๋ค. ํํฐ ์ ๊ฑฐ ๋ฌธ์ ๋ฅผ ์ฒ ํํฉ๋๋ค. ๋ถํ์๋ผ! ๐ฅ ์ธํฐ๋ท์์ ๋๊ตฐ๊ฐ์ ๋ง์์ ๋ฐ๊ฟ์ค @chrisvfritz ์ @yyx990803 ์ ์ถํํฉ๋๋ค!
Vue.prototype.filters = {
filterBy: ...,
orderBy: ...
}
<ul v-for="word in filters.filterBy(words, userInput)">
<li>{{word}}</li>
</ul>
@yyx990803 ์ ์ ์ ์ผ๋ก ๋์ํ๊ณ ํํฐ๋ฅผ ์ ๊ฑฐํ๊ณ ์ผ๋ฐ JS ๊ธฐ๋ฅ์ ๊ณ ์ํฉ๋๋ค.
@blake-newman ์์ฃผ ์ข์ ์ง์ ์ ๋๋ค. ์ ๋ ์ด ์์ ์์ ๋๋ถ๋ถ ํ์ ํ๊ณ ์์ผ๋ฉฐ ๊ฐ๋ ์ฑ์ ๋ํด ์๊ฐํ๋ฉด ์ด์ ๊ฐ์ ๊ฒ์ ๋ฌ์ฑํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
computed: {
filteredItems() {
return f(this.items).filterBy(this.filter /* string or function*/)
.orderBy(this.field, -1)
.limitBy(10)
.apply()
}
}
๋ค์์ ๊ฐ๋ ์ ๋น ๋ฅธ jsfiddle์ ๋๋ค.
ํต์ฌ ํํฐ๋ฅผ ์ ๊ฑฐํ ๋ ํ ๊ฐ์ง ์ข์ ์ ์ ์ด์ ์ง์ ์ฌ์ฉ์ ์ ์/๊ตฌํํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ํจ์ฌ ๋ ๋ง์ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค.
ํญ์ ์ง์ ์ฌ์ฉ์ ์ ์/๊ตฌํํ ์ ์์์ต๋๋ค.
Vue๋ ์ ํธ๋ฆฌํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋๋๋ค. ์์งํ ๋งํด์, ์ฐ๋ฆฌ๊ฐ ์ ๊ณตํ ์ ํธ๋ฆฌํฐ ์ค ์ด๋ ๊ฒ๋ ๋๊ธ ์ต๊ฐ์ ๊ฒ์ด ์๋๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ฐ๋ คํ๋ ๊ฒ์ ํ ํ๋ฆฟ์์ ํํฐ ๊ธฐ๋ฅ์ ์ ๊ฑฐํ๋ ๊ฒ์ ๋๋ค. ๋ด์ฅ ํํฐ๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๋ฐ์ค/๊ธฐํ ์ ํธ๋ฆฌํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ๋ก์๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๊ฒ ๋ค์ ๋ง๋ค ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋๊ตฐ๊ฐ๋ ํ์ฌ ๋ด์ฅ๋ ๋ชจ๋ ํํฐ๋ฅผ ์ฌ์์ฑํ๋ ๋จ์ผ ํ๋ฌ๊ทธ์ธ์ ์ถ์ํ ์๋ ์์ต๋๋ค.
ํํฐ ๋์ ๊ณ์ฐ๋ ์์ฑ์ ์ฌ์ฉํ๋ฉด ์ฒ๋ฆฌ๋ ๊ฐ์ ๊ตฌ์ฑ ์์์ ์ด๋ ๊ณณ์์๋ DRY ๋ฐฉ์์ผ๋ก ์ฝ๊ฒ ์ฌ์ฌ์ฉํ ์ ์๋ค๋ ์ด์ ๋ ์์ต๋๋ค.
๋ฌผ๋ก ๋ค๋ฅธ ๊ณณ์์ ์ฌ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ ๊ณ์ฐ๋ ์์ฑ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ํํฐ๊ฐ ํจ์ฌ ๋ ํธ๋ฆฌํฉ๋๋ค.
์์ ๊ณต์ ํ ํด๋น ๋งํฌ ์ ๊ฒ์ํ ๋ค๋ฅธ ์์ ์ด ์์ต๋๋ค.
ES7 ์ ์ ๊ตฌ๋ฌธ์ฒ๋ผ ์๋ํ๋ ํํฐ ๊ตฌ๋ฌธ์ ์ง์ํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๊ทธ๋ ๊ฒ ํ๋ฉด ์ฌ๋๋ค์ด ์ฌ๋ํ๋ ํํฐ๋ฅผ ๊ณ์ ์ฌ์ฉํ๊ณ ๋ฏธ๋์ ์ํฉ์ ๋ง์ถฐ ํํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ฒฐ๊ตญ ES7 ํ์ดํ๊ฐ ์์ผ๋ฉด API๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ด๋ถ ๊ตฌํ์ ์ ํํ ์ ์์ต๋๋ค.
ES7 ํ์ดํ๊ฐ ์น์ธ๋์๊ฑฐ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ง์ต๋๊น?
์ด๋ก ์ ์ผ๋ก ๋ณ๊ฒฝ๋ ์ ์์ง๋ง... ์์ ์ ์ธ ๊ฒ ๊ฐ์ต๋๊น?
์ํ: mindeavor/es-pipeline-operator#33
@JosephSilber @young-steveo @thelinuxlich ์ผ๋ฐ์ ์ผ๋ก ํ์ดํ์ ๊ฐ์น์ ๋ํด ๊ฐ์ ์๊ฐ์ ํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๐ 2.0์ ์๋ก์ด ์ปดํ์ผ๋ฌ์ ํ ๊ฐ์ง ์ฅ์ ์ ์์ฑ๋ ๋ ๋ ํจ์ ์ฝ๋๋ฅผ Babel์ ํตํด ํ์ดํํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ์ฌ์ ํ โโ๋ ํ๊ตฌํด์ผํ์ง๋ง |>
๊ฐ ๋ ๋ง์ ์ถ์ง๋ ฅ์ ์ป๊ณ ์ด์ ๋ํ Babel ํ๋ฌ๊ทธ์ธ์ด ๊ฐ๋ฐ๋๋ฉด ์ฑ์์ _๋ชจ๋ ๊ณณ์์_ ํ์ดํ๋ก ๋ฉ์๋๋ฅผ ๋ค์ ํ๋ณตํ๊ฒ ์ฐ๊ฒฐํ ์ ์๋ค๋ ๊ฒ์ ์์ํ ์ ์์ต๋๋ค. LiveScript ๋ฐ ๊ธฐํ ๊ธฐ๋ฅ ์ธ์ด์ ์ด๋ ฌํ ํฌ์ผ๋ก์ ์ ๋ ๊ทธ ๊ฐ์น๋ฅผ ํ์คํ ์ธ์ํ๊ณ ์์ต๋๋ค !
์ด ํ์ดํ๋ผ์ธ ์ฐ์ฐ์๋ 0๋จ๊ณ์ ์์ง๋ ์์ต๋๋ค.
@thelinuxlich ์, ์ ๋ ๊ทธ๋ค์ด ์ฌ์ ํ TC39์์ ์ฑํผ์ธ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ค๊ณ ๋ฏฟ์ต๋๋ค. ๐
@rigor789 ๊ทธ๊ฒ๋ ์ ๊ฐ ์ธ๊ธํ๊ณ ์ถ์ ๋์ ์ค ํ๋์ ๋๋ค! JavaScript์ ํ์ผ๋ก ์ํ๋ ํํ์ ํ ์ ์์ผ๋ฉฐ ํ ํ๋ฆฟ ๋ด๋ถ์ ํํฐ๋ง ๋ ผ๋ฆฌ๋ฅผ ๋ฃ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ์ข์ต๋๋ค.
@yyx990803 ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ ํ ์ฌ์ฉ์์ ์ด๋ฆ์ด ์ ๋ฐ์ดํธ๋๋ฉด Vue๊ฐ ์ด๋ป๊ฒ ์๋ํฉ๋๊น?
<div v-for="user in users">
<p>{{ user.name |> capitalize }}</p>
</div>
Vue.extend({
computed: {
displayableUsers() {
for (user of this.users)
user.name = capitalize(user.name);
},
},
});
์ ์๋ ํ๋์ ๊ฐ์ฒด๋ง ๋ค์ ๋ ๋๋งํ๊ณ ํ์๋ ์ ์ฒด ๋ชฉ๋ก์ ๋ค์ ๊ณ์ฐํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๊น?
@rpkilby ๋ ๋๋ฑํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ๋ ๊ฒ์ ๋๋ค.
Vue.extend({
methods: {
capitalize () { ... }
}
})
<div v-for="user in users">
<p>{{ capitalize(user.name) }}</p>
</div>
์ฌ์ ํ ๋ฉ์๋๋ฅผ ํํฐ๋ก ์ฌ์ฉํ๋ ์์ด๋์ด๊ฐ ๋ง์์ ๋ค์ง ์์ต๋๋ค(์ง๊ฐ์ ์ผ๋ก๋ ์๋ชป๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ค์ ๋ก ์ค๋ช ํ ์๋ ์์ต๋๋ค). ์ด๋ ์ชฝ์ด๋ ํํฐ๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋ํด ๋ ผ์ํ์ผ๋ฏ๋ก +1.
์ด ์ค๋ ๋์์ ์ ์๋ ์ด๋ค ๊ฒ๋ ํํฐ์ ํํ๋ ฅ๊ณผ ๊ฐ๊ฒฐํจ์ ๊ฐ๊น์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋จ์งํ์ง ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ ์ ๋ฅผ ์ ๋ง ์ฌํ๊ฒ ๋ง๋ญ๋๋ค. ํฌ๋ผ ์ค๋ ๋์์ ๋งํ๋ฏ์ด, ์ด๊ฒ์ Vue Vue๋ฅผ ๋ง๋๋ ๋ง์ ๋ถ๋ถ์ ์ ๊ฑฐํฉ๋๋ค.
์ ๋ฅผ ์ฐพ๊ณ ๊ณ์๋ค๋ฉด ๊ตฌ์์์ ํฌ๊ฒ ํ๋๋ผ๋ ์ ๋ฅผ ์ฐพ์ผ์ค ์ ์์ด์ ๐
์ ๋ผ์, ์ด ๋ณํ๋ ์ข์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ฉ์ ์ฅ๋ คํฉ๋๋ค. ์ฒ๋ฆฌํ์ธ์ :)
๊ทธ๋์ ์ ๋ @yyx990803 ๊ณผ ๊ธด ํ ๋ก ์ ํ์ต๋๋ค. ์ฌ๊ธฐ์ ์ ๋ ์ฌ์ฉ์์ ๊ด์ ์์ _syntax_ ์ง์์ ์ ์งํ์๊ณ ์ ์ํ์ต๋๋ค. ์ฐ์ํ๊ณ ์์ฐ์ค๋ฝ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ด ์์์ ์ด๋ฌ๋ค.
<li v-for="item in items | filterBy 'name' | orderBy 'title' 1">{{ item.name }}</li>
...
<script>
...
methods: {
filterBy (items, field) { return filtered; },
orderBy (items, field, order) { return filtered; }
}
...
</script>
๋๋ ์ด๊ฒ์ด ๋ ์ธ๊ณ์ ์ฅ์ ์ ์ ๊ทผํ ๊ฒ์ด๋ผ๋ ์ธ์์ ๋ฐ์์ต๋๋ค.
๊ทธ๋๋ ๊ฒฐ๊ตญ์๋ ํํฐ๋ฅผ ์ ์ฒด์ ์ผ๋ก ์ ๊ฑฐํ๋ ๊ฒ์ด ์ค์ ๋ก ๋ ๋์ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค. @linuxlich ๊ฐ ๋ฐฉ๊ธ ๋งํ ๊ฒ์ฒ๋ผ JavaScript์ ๋ ผ๋ฆฌ ์ฌ๊ณ ๋ฅผ ๋ ์ ์ฅ๋ คํฉ๋๋ค. ์ฐ๋ฆฌ๋ Laravel์ Blade๋ ๋ค๋ฅธ ํ๋ ์์ํฌ์ ๋ทฐ ๋ ์ด์ด์ ๋ก์ง์ ๋์ ํ์ง ์์ผ๋ฉฐ Vue์ ํ ํ๋ฆฟ์๋ ๋์ ํด์๋ ์ ๋ฉ๋๋ค.
์ฆ, @JosephSilber ๋ค๋ฅธ ๊ตฌ์์ ๋ณด๋ฉด ์ ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
๋์๊ฒ ํํฐ๋ ๋งค์ฐ ์๋ฆ๋ต๋ค๊ณ ๋๋ผ๋ฉฐ ๊ตฌ๋ฌธ์ ํํฐ ๊ตฌ๋ฌธ์ด ์ด๋ป๊ฒ ์๊ฒผ๋์ง ์ ํํ ์ ์ ์์ต๋๋ค.
๋ํ Vue์ ๋ํ ํ ๊ฐ์ง ๋งค๋ ฅ์ ์ธ ์ ์ (์ผ๋ถ) ๋ฐฐํฐ๋ฆฌ๊ฐ ํฌํจ๋์ด ์๋ค๋ ๊ฒ์ ๋๋ค. ๋ด ์๊ฐ์ Vue๋ฅผ ๋๋ณด์ด๊ฒ ๋ง๋๋ ์ด ๋ ๊ฐ์ง ์ค ํ๋๋ฅผ ์๋๋ค๋ฉด ์ ๋ง ์ฌํ ๊ฒ์ ๋๋ค.
์ค๋ ๋๋ฅผ ์ฝ์ด๋ณด๋ฉด ํํฐ์ ๋ํ ๋๋ถ๋ถ์ ์ฐ๋ ค๋ Vue์ ๊ธฐ๋ณธ ํํฐ๊ฐ ์๊ณ ์ค์ ๋ก๋ ๊ธฐ๋ฅ ์์ฒด๊ฐ ์๋๋ผ๋ ์ฌ์ค์ธ ๊ฒ ๊ฐ์ต๋๋ค.
@blake-newman์ ํํฐ ํ๋ฌ๊ทธ์ธ ์๊ฐ์ด ๋ง์์ ๋ค๊ณ ๋ฏธ๋ฆฌ ๋น๋๋ ์์ ๊ฐ ์์ด์ผ ํฉ๋๋ค. ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋ค๋ฅธ ํํฐ๋ฅผ ์๊ฐํด ๋ธ๋ค๋ฉด ํ๋ฌ๊ทธ ์ค ํ๋ ์ด๋ฅผ ํด์ผ ํฉ๋๋ค. ์ ๋ง ์ข์ ๊ฒ์ ๋๋ค. ํํฐ๋ฅผ ๋ง๋๋ ๊ฒ์ ์ฌ์ฉ์ ์์ญ์ ์ฑ ์์ด๋ผ๋ ๋ฐ ์ ๋์ ์ผ๋ก ๋์ํฉ๋๋ค.
์ฌ์ ํ ์ํ๋ ๊ฒ์ ํ์ดํ ๋ฐ ์ฐ๊ฒฐ ๊ธฐ๋ฅ๊ณผ ์๋ ํํฐ ๊ธฐ๋ฅ์ ์ ์ญ์ฑ์ ๋๋ค. ๊ธ๋ก๋ฒ์ฑ์ ๋ํ ์ฐ๋ ค๋ @yyx990803์์ ๋ค๋ฃจ์์ต๋๋ค. ํ์ดํ๋ก ์ฐ๊ฒฐํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น? ํ ํ๋ฆฟ์ ์ฝ๊ณ ์ถ๋ ฅ์ผ๋ก ์์๋๋ ๋ด์ฉ์ ์ดํดํ๋ ๋ฐ ๋ง์ ๋์์ด ๋ฉ๋๋ค. ํ์ดํ์ ์ฒด์ธ์ ์์์ ๋ ผ์ํ์ต๋๋ค. ์ฌ์ ํ ํ ์ ์์ต๋๊น? ์ ๋์ ์ผ์ ๋๊น? ๋์์ด๋์๊ฒ๋ ๊ธ์ ๋๋ค! ํํฐ๋ JS ํ๋ก๊ทธ๋๋จธ๊ฐ ์๋ ๋์์ด๋์ ๋๊ตฌ์ ๋๋ค. ๋ฐ๋ผ์ ๋ด ์ฑ ์์ ๋ ๋์ JS๋ฅผ ์์ฑํด์ผ ํ๋ค๋ ์ฃผ์ฅ์ ๋ ผ์ธ๋ก ๋์์ง๋ง ์ ๊ทธ๊ฒ์ด ํ์ํ์ง ์ดํดํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋์์ด๋๋ก์ ๋๋ ๋ ๋์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ถ๊ณ ํํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฆ๋ต๊ฒ ํ ์ ์์ต๋๋ค. :์๋ค:
์ค์ฝง
๋ค์์ ์ฐ๊ฒฐ์ ๊ดํ ์ฌํญ์ ๋๋ค. ํํฐ๋ ์ฃผ๋ก ๋ ๊ฐ์ง ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
ํ ์คํธ ์์์ ๊ฒฝ์ฐ 90% ์ด์ ๋จ์ผ ์ ํธ๋ฆฌํฐ ๋ฐฉ๋ฒ๋ง ์ฌ์ฉ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์ฐ๊ฒฐ์ ๊ทธ๋ค์ง ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค.
๋ฐฐ์ด์ ๊ฒฝ์ฐ: ๋ฐฐ์ด ์ฒ๋ฆฌ๋ ์ฌ์ค ๋ ผ๋ฆฌ์ด๋ฉฐ JavaScript์ ๋ ์ ํฉํ๋ค๋ ์ ์ ์ด๋ฏธ ์ง์ ํ์ต๋๋ค. ์ฌ๋ฌ ๊ฐ์ ์ฐ๊ฒฐ๋ ๋ฐฐ์ด ํํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ๋จํ ๋๋ ๊ด์ฐฎ์ ๋ณด์ด์ง๋ง ๊ฐ๊ฐ์ ๋ํด ๋ ์ด์์ ์ธ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณด๊ธฐ ํํด์ง ์ ์์ต๋๋ค. ๋ํ ํ ํ๋ฆฟ์ ๋๋ฌด ๋ง์ ๋ ผ๋ฆฌ๋ฅผ ๋ฃ์ง ๋ง์์ผ ํ ๋ ๋๋ฌด ๋ง์ ๋ ผ๋ฆฌ๋ฅผ ๋ฃ๋๋ก ๊ถ์ฅํฉ๋๋ค. ๋ํ ์ ์ฐ์ฑ์ด ์์ต๋๋ค(์ฒ๋ฆฌ๋ ๊ฐ์ ์ฝ๊ฒ ๊ฒ์ํ ์ ์์). ์ด์ ๋นํด ES2015์ ์๋ ์๋
<div v-for="thing in things | filterBy 'foo' | orderBy 'bar' | limitBy 5">
๋ค์๊ณผ ๊ฐ์ด ์ธ ์ ์์ต๋๋ค.
computed: {
filteredThings () {
return this.things
.filter(item => item.title.indexOf('foo') > -1)
.sort((a, b) => a.bar > b.bar ? 1 : -1)
.slice(0, 5)
}
}
๊ทธ๊ฒ์ ๋จ์ง JavaScript์ผ ๋ฟ์ด๋ฉฐ, ๋ฐฐ์ธ ๋ง๋ฒ, ๋์ฒด ๊ตฌ๋ฌธ ๋ฐ ํํฐ๋ณ API๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฒ๋ฆฌ๋ ๊ฐ(์ง๋ฅ์ ์ผ๋ก ์บ์๋จ)์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ์ด์ ์๊ฒฌ์์ ๋ณผ ์ ์๋ฏ์ด ์ด ์์ ์คํ์ ์์ ๋กญ๊ฒ ์ถ๊ฐํ ์๋ ์์ต๋๋ค. ๋ํ ํ ํ๋ฆฟ์ด ๋ ๊น๋ํด ๋ณด์ ๋๋ค.
<div v-for="filteredThings">
๋๋ ์ด๊ฒ์ด ์ ์ฉํ ๋ฌผ๊ฑด์ ์์ ๋ ๊ฒ๊ณผ ๊ฐ๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์์งํ ๋งํด์ ์ง๊ธ ๋น์ฅ์ ํํฐ์ ๋ํ ์ธ์๋ ๊ตฌ๋ฌธ์ ์ํด ๊ตฌ๋ฌธ์ ์ ์งํ๋ ค๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. ์ ์๊ฐ์๋ ๊ธฐ๋ฅ์ ์ ๋นํํ๊ธฐ ์ํด "์ฐ์ํ๊ธฐ ๋๋ฌธ์" ๊ทธ ์ด์์ด ํ์ํฉ๋๋ค. ๊ฐ๊ด์ ์ธ ๊ฐ์น๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ inline-templates
๊ฒฝ์ฐ์ด์ง๋ง ํํฐ์๋ ํ์๋์ง ์์ต๋๋ค.
@yyx990803 - ๊ทํ์ ์๋ ๋ฌธ์ ๋ฅผ ์ ๋ณด์ฌ์ค๋๋ค. ๋ค์ ๋งํ์ง๋ง, ์ ๋ ์ต๊ณ ์ JS ํ๋ก๊ทธ๋๋จธ๋ ์๋์ง๋ง filteredThings
๊ฐ ์ค์ ๋ก ํ๋ ์ผ์ ๋ํด ์๋ฌด ๋ง๋ ํ์ง ์๋๋ค๋ ๊ฒ์ ์๊ธฐ ์ํด JS ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ ํ์๋ ์์ต๋๋ค. ๋์๊ฒ ๊ทธ๊ฒ์ ๋์ ์ต๊ด์
๋๋ค. :smile: ํํฐ๋ง ๋ฐฉ๋ฒ์ด ์ ์ญ์ ์ด๋ผ๋ ์ฌ์ค์ ๋ํ ๋ฐฉ๋ฒ์ด ๋ฌด์์ ํ๋์ง ์์๋ด๊ธฐ ์ํด ๋ฌธ์, ์ฝ๋ ๋๋ ์ถ๋ ฅ์ ํด๋
ํด์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ ๋ง ์ฐ์ํ์ง ์์ต๋๋ค. ์ค๋ฅธ์ชฝ?
๊ทธ๋์ ํ์ธ. ์ฐ๋ฆฌ๋ `filterByOrderByAndLimit'๊ณผ ๊ฐ์ ๋ฉ์๋ ์ด๋ฆ์ ๊ฐ์ง ์ ์์ต๋๋ค. ์ฃผ์ฅ์ ์ด๋ป์ต๋๊น?
<div v-for="filterByOrderByAndLimit(things,thing,'foo','bar',5)">
๊ทธ๊ฒ ๋ง์๊น์?
๊ทธ๋ ๋ค๋ฉด ์คํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ๊ทธ๋๋ ์ ์๋ณด์ ๋๋ค.
์ด์ filterBy์ OrderBy๋ง ์ํฉ๋๋ค. ๊ทธ๋ ๊ฒํ๋ ค๋ฉด ๋ณ๋์ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๊น? ๊ทธ๋ฐ ๋ค์ ํตํ ํ์์ ์ถ๊ฐํ๊ณ ์ถ์ต๋๋ค. ๋ค๋ฅธ ๋ฐฉ๋ฒ? ํ ํ๋ฆฟ์ ํํฐ ์ฒด์ธ์ ์ฌ์ฉํ๋ฉด ํ๋ ์ ํ ์ด์ ์ ์ ์ฐํ๊ณ ํํ๋ ฅ ์๊ฒ ์กฐ์ํ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ ์์ง ๋ฉ์๋๋ก ์ ์ ํ๊ฒ ํด๊ฒฐ๋์ง ์์์ต๋๋ค(๊ทธ๋ฆฌ๊ณ ์ง์์ด ๋ถ์กฑํ์ฌ ๋ฉ์๋๋ฅผ ๋ ์ ์ดํดํ ์ ์์ต๋๋ค).
์ด๊ฒ์ด ๊ฐ๋ฅํ ๊น์?
<div v-for="filterBy(things, thing, 'foo').OrderBy('bar').Limit(5)">
ํ ํ๋ฆฟ์์ ๋๋ฌด ๋ง์ ๋ ผ๋ฆฌ๋ฅผ ์ํํ๋ ๊ฒ์ ํผํด์ผ ํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ํํฐ ์ฐ๊ฒฐ๊ณผ ์ฑ์ ๊ตฌ์ฑ ์์/ํ ํ๋ฆฟ์ ์๋ฌด ๊ณณ์ด๋ ๊ฐ๋จํ ํํฐ๋ฅผ ์ฝ์ ํ ์ ์๋ ๊ธฐ๋ฅ์ ํ์์ ์ธ ๊ฐ๋ ์ด๋ฉฐ ์ฒ์๋ถํฐ ์ถ๊ฐํ ์ด์ ๊ฐ ์์ต๋๋ค. ๊ทธ ์ด์ ๋ ๋ฌด์์ด์์ต๋๊น? ๋น์ ์ด ๊ทธ๋ค์๊ฒ ์ด๋ฆ์ ๋ถ์ผ ์ ์๋ค๋ฉด, ๋๋ ๊ทธ๋ค์ด "๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๋์ ๊ดํ์ ์กฐ์ฅํ๋" ๋๋ณด๋ค 1๋ง์ผ์ด๋ ๋ ๋ง์ ๋์ ๊ฑธ ๊ฒ์ ๋๋ค.
Vue ์์ฒด์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ์ฐ์ฑ์ ํ์ฉํ๋ ๋ชจ๋ ๊ฒ์ด ๋ถ์ ์ ํ๊ฒ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. inline-template
์ ์ฃผ์ ์ฃผ์ฅ์ ์ ์ฐํ๊ณ Vue๋ฅผ ๋ค์ํ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ด์์ต๋๋ค. ํํฐ๋ Vue ๋ด๋ถ์ด๊ณ Vue๊ฐ ์ธ๋ถ์์ ์ฌ์ฉ๋๋ ๋ฐฉ์์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค๋ ์ ์ ์ ์ธํ๊ณ ํฌ๊ฒ ๋ค๋ฅด์ง ์์ต๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๊ทธ ์ค์์ฑ์ ํ๊ฐ์ ํํ์ง ์์ต๋๋ค. ๋ง์ ์ฌ๋๋ค์ด ์ด๊ฒ์ด ์
๊ทธ๋ ์ด๋ํ ํ์๊ฐ ์๋ค๊ณ ๋งํ์ต๋๋ค. ๊ทธ๊ฒ์ด ์ค์ํฉ๋๋ค! :์๋ค:
์๋ก์ด ๋ฐฉ์์๋ ์ด์ ๋ฐฉ์๊ณผ ๋์ผํ ์์ฑ์ด ํ์ํฉ๋๋ค.
(๋ด๊ฐ ์์ ๊ฒ ์๋?)
์ด ๋ชจ๋ ๊ฒ์ ํ ์ ์๋ค๋ฉด ๋ชจ๋๊ฐ ๊ฝค ๋ง์กฑํ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค. ๋๋ ๊ฐ์ธ์ ์ผ๋ก ๊ทธ๊ฒ์ด (์์ง) ๋ฐฉ๋ฒ์ผ๋ก ์ผ์ด๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
์ค์ฝง
@smolinari
์ผ์ฃผ์ผ ๋์ ์ด ์๋ก์ด ์ํ ๋ฆด๋ฆฌ์ค๋ฅผ ์ฌ์ฉํด ๋ณธ ํ (์ค์ต์ ๊ธฐ๋ฐ์ผ๋ก ํ) ์ ๋ง ๊ฐ์น ์๋ ์๊ฒฌ์ ๋จ๊ฒจ๋ณด๋ ๊ฒ์ ์ด๋ป์ต๋๊น? ๊ธฐ์กด ์ฑ์ ๋ฆฌํฉํ ๋งํ๊ณ ๋ถ๊ฐ๋ฅํ๋ ์ , ๊ฐ์ ๋ ์ , ์ ํ๋ ์ ์ ์๋ ค์ฃผ์๋ฉด ๋ ์ ๋ ผ์ํ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋ด๊ฐ ์๊ฐํ๋ ๋ชจ๋ ์ฌ๋์๊ฒ ์ ์ฉํ ๊ฒ์ ๋๋ค.
@yyx990803 - ๋๋ 1์ ๋์ํ์ต๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ๋์ํฉ๋๋ค. :์ค๋ง์ผ: ๋๋ ๊ทธ๊ฒ์ด ๋๋ฌด ๋ง์ ์ฌ๋์ ์ป์ ๋ฌด์ธ๊ฐ๋ฅผ ๋นผ๋ ๊ฒ์ด ํฉ๋นํ ์ด์ ๋ผ๋ ๋ฐ ๋์ํ์ง ์์ต๋๋ค.
๊ทธ๋์ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ค์ฉ์ ์ธ JS๊ฐ ์ค์ฉ์ ์ธ HTML๋ณด๋ค ๋ซ๋ค๊ณ ๊ฒฐ์ ํ ๊ฒ ๊ฐ์ต๋๊น?
์ ๊ทธ๋ ์ด๋ํ์ง ์๋๋ค๋ ์ฃผ์ฅ์ ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋งํ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ๋๋ ๋จ์ง ์์ฌ ์ํตํ๊ณ ๊ทธ๊ฒ์ ์ํํ๋ ค๊ณ ํฉ๋๋ค.
๋ ์์ ์ ๋ง์ง๋ง ์ฃผ์ฅ์ ๋๋ค. ์ฌ์ฉ์์ ์ฌ์ฉ์์ ๋์ผ๋ก ์ด๊ฒ์ ๋ณด์ญ์์ค. ๋ด๊ฐ Laravel์ด๋ Vue๋ฅผ ํตํฉํ๋ ๋ค๋ฅธ MVC ๋๋ MVVM ์์คํ ๊ณผ ๊ฐ์ ์์คํ ์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์ด ์์คํ ์ ์ฌ์ฉํ๋ฉด ํด๋น ์์คํ ์ ์ฌ์ฉ์๊ฐ ์์ ์ ๊ตฌ์ฑ ์์๋ฅผ ๋น๋ํ ์๋ ์์ต๋๋ค. ํํฐ๋ ๋ง ๊ทธ๋๋ก ํ์ต ๊ณก์ ์ ๋จ์ํํ๊ณ ํด๋น ์์คํ ์ ์ฌ์ฉ์๊ฐ JS๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๊ณ ๋ ๋ง์ ์์ ์ ์ํํ ์ ์๋๋ก ํฉ๋๋ค. ์ ๋ Vue์ ํฌ์ ๋๋ค. JS๊ฐ ์๋ ํ๋ก๊ทธ๋๋จธ๋ ์ฌ์ ํ ๋ง์ ์์ ์ ์ํํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๊ฒ์ด ๋ด๊ฐ React์ JSX๋ฅผ ์ข์ํ์ง ์๋ ๊ฒ๊ณผ ๊ฐ์ ์ด์ ์ ๋๋ค. ์ด ์กฐํฉ์ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ Vue๋ณด๋ค ํจ์ฌ ์ ์ ์ฌ์ฉ์ ๊ธฐ๋ฐ์ ๊ฐ๊ฒ ๋ฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๋์ ๊ฑธ ๊ฒ์ด๋ค.
๋๋ ๋ํ ์ง์ ํ ์ ์ฐ์ฑ์ด JS์ ์๋ค๋ ๊ฒ์ ์ดํดํฉ๋๋ค. ๊ทธ๋๋ Vue์ ์ ์ฐ์ฑ์ JS์๋ง ์์กดํ์ง ๋ง์ญ์์ค. ๋ชจ๋ ์ฌ๋์ด ํฌ๋ฌ JS ํ๋ก๊ทธ๋๋จธ๋ ์๋๋ผ๋ ์ ์ ๋ช ์ฌํ์ญ์์ค. ์ฌ์ค, ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ๊ทธ๋ ์ง ์์ต๋๋ค. ํํฐ๋ ๊ทธ๋ฐ ์ฌ๋๋ค์ ์ํด ๋ง์ ์ผ์ ํ ์ ์๋ ์ข์ ๋ฐฉ๋ฒ์ด์๊ณ ๋ ๋ง์ JS ์กฐ์์ ์ํ ์ข์ ๋๋ค๋์ด์์ต๋๋ค. ํํฐ๋ ํ ์ ์์ต๋๊น? JS ๋ฉ์๋์ ๋ํด ์์ธํ ์์๋ณด์ญ์์ค.
ํ์ธ. ๋๋ก ์ถฉ๋ถํ๋ค ..... ๋๋ ๋๋ฌ์ด. ๊ทธ๋ฆฌ๊ณ ์ฌํํผ ๋ค์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. Vue๋ ์ฌ์ ํ ๊ต์ฅํฉ๋๋ค! :์๋ค:
@azamat-sharapov - ์ข์ ์ง์ ์ ๋๋ค.
์ค์ฝง
์ฌ๋๋ค์ด JS ๋ด๋ถ์ ๋์ ๊ดํ์ ์ ๋นํํ๋ ๊ฒ์ ๋ณด๋ฉด ์ํ๊น์ต๋๋ค. ์ฌ์ค ํ๋ก๊ฐ ๋ ํ์๋ ์๊ณ ๊ธฐ๋ณธ ์์ ๋ง ํ๋ฉด ๋๋ค(์๋๋ฉด ์์ฆ์ ๊ธฐ๋ณธ์๋๊ฐ์?)
ํํฐ ๋ด๋ถ ๋ฉ์๋์ ๋ํ ๋ฌธ์ ๋ ์๋ฏธ๋ก ์ ์์ต๋๋ค.
์ฃ์กํฉ๋๋ค. ํํฐ๋ ์ ์ ํจ์์ ๋น์ทํ์ง๋ง ๋ฉ์๋๋ ๋น์ ์ ๊ธฐ๋ฅ์ ๋๋ค.
ํํฐ๋ ๋ฉ์๋์ ๋งค์ฐ ๋ค๋ฅธ ์๋ฏธ๋ฅผ ์ ๋ฌํฉ๋๋ค. ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ํํฐ๋ this
๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง ๋ฉ์๋๋ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์
๋๋ค.
@yyx990803 Vue.prototype.filters
์ ์ฌ์ฉํ๋ ๋์ ์๋ํ ์ ์์ง๋ง Vue
๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋์๊ฒ ์ข์ ์ต๊ด์ฒ๋ผ ๋ณด์ด์ง ์์ต๋๋ค. ์ฐจ๋ผ๋ฆฌ ๋ชจ๋ ํํฐ๋ฅผ ํฌํจํ ๋ณ๋์(์ ์ญ) ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ ์ญ์ ์ข์ ์ต๊ด์ด ์๋๊ธฐ ๋๋ฌธ์ ์ข์ ์ต๊ด์ฒ๋ผ ๋ณด์ด์ง ์์ต๋๋ค. ๊ถ์ฅ๋๋ ์ ๊ทผ ๋ฐฉ์์ ๋ช ์์ ์ผ๋ก ๋์ฐ๋ฏธ ๋ฉ์๋๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋๋ค. ํ๋กํ ํ์ ์ ์ฐ๊ฒฐํ๋ ๊ฒ์ ๋ฉ์๋๋ฅผ ๋ช ์์ ์ผ๋ก ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ํ์ง ์๋ ์ฌ๋๋ค์ ์ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋๋ค.
์๋ฏธ๋ก ์ ๊ดํด์๋ - ํํฐ๋ ์ด์จ๋ ๋ง๋ค์ด์ง ๊ฐ๋ ์ ๋๋ค. JavaScript์์๋ ๋ฌธ์์ด์ ๋๋ฌธ์๋ก ํ์ํ๊ธฐ ์ํด ๋ค๋ฅธ ์๋ฏธ๋ฅผ ๋ง๋ค์ง ์์ต๋๋ค. ํจ์๋ฅผ ํธ์ถํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ด ๋ฐ๋ก JavaScript ๊ธฐ๋ฅ์ ๋๋ค.
์ฃผ๋ก "JS ๋ด๋ถ์ ๋์ ๊ดํ์ ์ ๋นํํ๋ ค๋" ์ฃผ์ ๋๋ฌธ์ ์ ๊ฐ์ธ์ ์ธ ์์ ์ ๋ ๋ช ํํ๊ฒ ํ๊ธฐ ์ํด ํ ๋ฒ ๋ ์ค๋ช ์ ํ๋ ค๊ณ ํฉ๋๋ค. ๋๋ ํ์คํ ๊ทธ๋ ๊ฒ ํ๋ ค๊ณ ํ์ง ์๋๋ค.
Vue๊ฐ ๋จ์ํ ํ ํ๋ฆฟ ์์คํ ๊ทธ ์ด์์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง ํ ํ๋ฆฟ ์์คํ ์ด๊ธฐ๋ ํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ์ ๋๋ค๊ณ ์๊ฐํ๋ ๊ทธ ์ญํ ์์ ๋ฉ์ด์ง๋ ค๊ณ ํฉ๋๋ค. ๋ฐ๋ผ์ ํ ํ๋ฆฟ ์์ง/์์คํ ์ผ๋ก์ Twig ํ ํ๋ฆฟ ์์ง์ ํ ํ๋ฆฟ ์์คํ ์์ ๊ธฐ๋ํ ์ ์๋ ๊ฒ์ ๋ํ ๋งค์ฐ ์ฑ๊ณต์ ์ธ ์ฌ๋ก๋ก ์๊ฐํ์ญ์์ค. ๋ฌธ์์๋ " ํ ํ๋ฆฟ ๋์์ด๋๋ฅผ ์ํ " ์น์ ๊ณผ " ๊ฐ๋ฐ์๋ฅผ ์ํ " ์น์ ์ด ์์ต๋๋ค. ํ ํ๋ฆฟ ์์คํ ์ผ๋ก์ Twig๋ ํ ํ๋ฆฟ ๋์์ด๋์๊ฒ๋ ๊ฐ๋ ฅํฉ๋๋ค. ํํฐ๋ฅผ ํฌํจํ ๊ธฐ๋ณธ ๋์์ผ๋ก ๊ฐ๋ ์ฐจ ์๊ธฐ ๋๋ฌธ์ ๋๋ค . ๊ฐ๋ฐ์๊ฐ ์๋ ์ฌ๋๋ค๋ PHP๋ฅผ ์ง์ ์ ์ผ๋ก ์์ง ๋ชปํด๋ ํ ํ๋ฆฟ ์์คํ ์ผ๋ก ๋ง์ ์์ ์ ์ํํ ์ ์์ต๋๋ค. ๊ทธ๋ค์ Twig๊ฐ ์ ๊ณตํ๋ ๊ฒ๊ณผ ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. Vue์์๋ ์ด๊ฒ์ ์ฐพ๊ณ ์์ต๋๋ค. ๋ฌธ์์์ "ํ ํ๋ฆฟ ๋์์ด๋๋ฅผ ์ํ Vue" ์น์ ๋ ๋ณด๊ณ ์ถ์ต๋๋ค. :์๋ค:
๋ํ Twig์ ํ์ฅ์ฑ์ด ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ฌ๊ณ ๋ฒ์ ์์ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด ์์ผ๋ฉด ์ถ๊ฐํ ์ ์์ต๋๋ค. ๊ทธ ๋ ๊ฐ๋ฐ์๊ฐ ๊ฐ์ ํฉ๋๋ค. ์ข์ ์ ์ ํ์ฅ ํ๋ก๊ทธ๋จ์ ๊ณต์ ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ฆ, ํ ๋ฒ๋ง ์ํํ๋ฉด ๋ฉ๋๋ค.
์ด ๋ ์์ค์ ๋์์ด๋/๊ฐ๋ฐ์์ ๋ํ ๋ ๋ค๋ฅธ ์ข์ ์ ์ ํจ์ฌ ๋ ๊ด๋ฒ์ํ ์ฌ์ฉ์ ๊ธฐ๋ฐ์ ํ๋ณดํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ํจ์ฌ ๋ ๊ด๋ฒ์ํ๊ณ ์ด๊ฒ์ ์ ๋์ผํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ธฐ๋ณธ ๋์์ด ์ถฉ๋ถํ์ง ์์ ๋, ์ฆ ๊ธฐ๋ณธ ์ธ์ด๋ฅผ ์๋ฐ์ ์ผ๋ก ๋ฐฐ์ฐ๊ธฐ ์์ํ ๋์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ ๋ชจ๋ฒ ์ฌ๋ก์ ๋๋จธ์ง๋ฅผ ๋ฐฐ์ฐ๊ฒ ๋ฉ๋๋ค.
Vue๋ JS๋ฅผ ๋ฐฐ์ฐ์ง ์๊ณ ๋ ํ ํ๋ฆฟ ์์ง์ด ๋ ์ ์๋ค๊ณ ํ๋ค๋ฉด ์์ฅ ๊ฐ์น๋ฅผ ์๋นํ ๋ฎ์ถ๊ณ ์๋ค๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. ๋ง์ฝ ๋น์ ์ด ๋งํ๋ค๋ฉด, ๋น์ ์ ๋ค๋ฅธ ์ฌ๋๋ค์ด ํ ํ๋ฆฟ ์์ง์ฉ ๋๊ตฌ๋ฅผ ํ๋ฌ๊ทธ์ธ์ผ๋ก ๋ง๋ค ์ ์๋๋ก ๋ฌธ์ ์ด์ด ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ์ฌ๋๋ค์ ํ ํ๋ฆฟ ์์คํ ์ ์์ด์ผ ํ ๊ฒ์ ์ํด ์ธ์ธ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ ๋ํ ๋น์์ฐ์ ์ธ IMHO์ ๋๋ค.
ํํฐ ์์ Evan์ ๋ํด ์ด์ผ๊ธฐํ๋ ํ์์์ JS๋ฅผ ๋ฐฐ์ฐ๋ ์ฌ๋์ ๋๊น ์๋๋ฉด ํ ํ๋ฆฟ ์์ง์ ๋ฐฐ์ฐ๋ ์ฌ๋์ ๋๊น? ํ์์๋ค๋ฉด ์ด์ผ๊ธฐ๊ฐ ๋ฌ๋ผ์ก์ ๊ฒ ๊ฐ์์.
์ฌํํผ. ๋๋ ์ฌ์ ํ Vue๊ฐ ์ด๊ธฐ๋ ์์คํ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ด ์๊ฐ์ด ๋ค๋ฅธ ์ฌ๋๋ค์ด Vue์ ์ญํ ์ ๋ํด ์ด๋ป๊ฒ๋ ๋ค๋ฅด๊ฒ ์๊ฐํ๋๋ก ๋ง๋ค ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. :์๋ค:
์ค์ฝง
@yyx990803 ํํฐ๊ฐ ์ ์กฐ์ด ๊ฐ๋ ์ด๋ผ๋ฉด ์ ์ด์ ์ ๋ง๋ ๊ฑฐ์ผ?
<template>
๋ด๋ถ์์ $ $data
๋๋ abc
์ ๊ฐ์ ๋ชจ๋ ์ธ๋ถ ๋ณ์๊ฐ this.$data
๋ฐ this.abc
๋ก ๋ณํ๋๊ณ ๋ฐ๋ผ์ ์ผ๋ฐ js ํจ์๊ฐ ์ ์๋๊ธฐ ๋๋ฌธ์ ๋ฏฟ์ต๋๋ค. ๊ตฌ์ฑ ์์ ์ธ๋ถ๋ ์ฐธ์กฐํ ์ ์์ต๋๋ค. ์ด๋ฌํ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด ํํฐ๊ฐ ๋์
๋์์ต๋๋ค.
๊ทธ ์ ํ์ ์ฌ์ ํ โโ์กด์ฌํฉ๋๋ค ---์ ๊ฐ ์ณ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค--- ์ ํ์ ์ ๊ฑฐํ๋ ค๋ฉด ๊ฐ๋ฐ์๊ฐ this.abc
this.abc
๋ฅผ ๋ช
์์ ์ผ๋ก ์ฝ๋ฉํ๊ณ ์ฐธ์กฐ๋๋ js ๊ธฐ๋ฅ์ ์ก์ธ์คํด์ผ ํฉ๋๋ค. js.
๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๋๋ฌด ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ด ๋ ๊ฒ์ด๋ฉฐ ๋จ์ฉํ๊ธฐ ์ฝ๊ณ ์ค๋๋ ์ฝ๋๋ฅผ ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๊ฒ์ ๊ณ ํต์ค๋ฌ์ธ ๊ฒ์ ๋๋ค. ํ์ฌ ๊ตฌ๋ฌธ์ด ๊ทธ๋ณด๋ค ํจ์ฌ ์ข์ ๋ณด์ ๋๋ค.
ํํฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก js ํจ์์ด๋ฉฐ ๊ตฌ์ฑ ์์๋ก ๊ฐ์ ธ์์ผ ํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ๋๋ ๊ทธ๋ค์ด ๋ฉ์๋์ ๊ฐ์ ์ฅ์์ ์ ์๋์ด ์๋ค๋ ๊ฒ์ ์ข์ํ์ง ์์ต๋๋ค.
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ. ๋๋ ์ ์ฒด ์ค๋ ๋๋ฅผ ์ฝ๊ณ ์ด๊ฒ์ด ๋ด ์๊ฐ์ ๋๋ค.
orderBy
filterBy
๋ฐ ๊ธฐํ์ ๊ฐ์ ๋ด์ฅ ํํฐ๋ฅผ ๋์น๋ ์ฌ๋ ์ js๊ฐ ๋ค์ดํฐ๋ธ ํ์ดํ ์ฐ์ฐ์๋ฅผ ๊ตฌํํ ๋๊น์ง ์ข์ ์๋ฃจ์ ์ด
Vue.use(require('vue-pipe'))
์๋ก์ด ๊ธฐ๋ฅ ๊ตฌํ์ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ์ง์ ์ค๋จ ๋๋ ๊ธฐํ ์ฌํญ์ ๋ํ ๊ฒฝ๊ณ ์ ํจ๊ป ํฌํจ๋ ์ ์์ต๋๋ค. ๋๊ตฌ๋ ๊ทธ ํ๋ฌ๊ทธ์ธ์ ๊ตฌํํ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง Vue ํ์์ ์ ๊ณตํ๊ณ ์ ์งํ๋ค๋ฉด ๊ทธ๊ฒ ๋ ๋์ ๊ฒ ๊ฐ์๋ฐ ๊ทธ๊ฒ ๊ฐ๋ฅํ ๊น์?
๋ด๊ฐ ํ๋ฆด ์ ์์ง๋ง Vue๊ฐ ํ๋ฌ๊ทธ์ธ์ ์ปดํ์ผ๋ฌ์ ์๋ง์ผ๋ก ๋ง๋๋ ๊ฒ์ ํ์ฉํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
@azamat-sharapov ๋ฌผ๋ก ์๋๋๋ค. ๋๋ ๊ทธ๊ฒ์ด Vue ์ปดํ์ผ๋ฌ์ ์๋ง์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์์ต๋๋ค :open_mouth:
@YerkoPalma ์ ๋ ํ์ดํ ์คํผ๋ ์ดํฐ๋ฅผ ์ ๋์ ์ผ๋ก _์ฌ๋_ํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๊ธฐ๋ฅ์ ์ธ์ด์์ ๊ฐ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๊ณ JavaScript์์ ๊ทธ๊ฒ์ ๊ฐ๊ณ ์ถ์ด ๋๋ฌด ๊ธฐ๋๋ฉ๋๋ค! __ํ์ง๋ง_, Vue์ ํํฐ๊ฐ ์์๋ค๊ณ ์์ํด ๋ณด์ธ์. ํ๋ก ํธ์๋ ํ๋ ์์ํฌ๊ฐ JavaScript์ ๊ตฌ๋ฌธ์ ํ์ฅํ๋๋ก ์์ฒญํ์๊ฒ ์ต๋๊น? ์ด๊ฒ์ UI ํ๋ ์์ํฌ๊ฐ ์๋๋ผ Babel ๋๋ compile-to-JS ์ธ์ด์ ์์ญ์ ๋๋ค. ๋ด๊ฐ ์์ฃผ ํ๋ ๊ฒ์ฒ๋ผ LiveScript์ ๊ฐ์ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํธํ๋ค๋ฉด ๊ทธ๋ ๊ฒ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์ ๋ฌธ์ ๋ Vue๊ฐ ์๋๋๋ค. ๊ทธ๊ฒ์ JavaScript ์์ฒด์ ์์ผ๋ฉฐ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๊ณ ์น๊ธฐ ์ํด ์ฌ๊ธฐ ์๋ ๊ฒ์ด ์๋๋๋ค.
๋ํ ์ฐ๋ฆฌ๊ฐ ๋ฐ๋ผ๋ ๋๋ก Babel์ ํตํด 2.0์ ๋ ๋๋ง ๊ฒฐ๊ณผ๋ฅผ ํ์ดํํ ์ ์๋ค๋ฉด ์ํ๋ ๊ฒฝ์ฐ ๋น TC39 ์ถ์ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ๊ทธ๋ฅ ํ ํ๋ฆฟ์์. ๋ฐ๋ผ์ ํ์ดํ๋ง ์ํ๋ฉด ๊ฐ์ง ์ ์์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋น์ ์ ์ค๋ 1.x์์ ๊ทธ๊ฒ์ _ํ ์ ์์ต๋๋ค_ - ํ ํ๋ฆฟ์์ ์ฌ์ฉํ ํ์ดํ๊ฐ Babel์ ํ์ดํ์ ๋ค๋ฅธ ์ฐ์ ์์์ ๋์์ ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ด ์๋ค๋ ์ ์ ์ฃผ์ํ์ญ์์ค.
@smolinari ๋ฐ ๊ธฐํ. ๋ด๊ฐ ๊ณ์ ๋ฃ๋ ๋ ๊ฐ์ง ๋ฌธ๊ตฌ(๋ฐ ๊ทธ ๋ณํ)๊ฐ ์์ต๋๋ค.
๋ ๋ค ๊ฐ์ ์ ํจ์ถํ๊ณ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด ๊ทธ๋ฃน์ ์๊ฐํ์ง _์์ต๋๋ค_.
์ ์๋ ์ธ๊ธํ์ง๋ง ๋ค์ ํ ๋ฒ ๋ง์๋๋ ค์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค. ํต์ฌ ํ์ _๋ชจ๋_๋ ๋์์ด๋, ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ๋๋ ์ด ๋์ ์กฐํฉ์ ๋๋ค . ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ ์์ ์ ์์ ์ ์ํด ๋งค์ผ ์ด๋ฌํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฐ๋ฆฌ๋ Vue 2.0๋ ์ฌ์ฉํ ๊ฒ์ ๋๋ค. ์ ๋ฅผ ๋ฏฟ์ผ์ธ์. ์ฐ๋ฆฌ๋ _์๊ฐํ๊ณ ์์ต๋๋ค. ๐
์ด๋ณด์๋ฅผ ์ํด ์ฌ๊ธฐ์์ ์ฌ๋ก๋ฅผ ๋ง๋ค์๋๋ฐ ์ข ๋ ์์ธํ ๋ค๋ฃจ๋๋ก ํ๊ฒ ์ต๋๋ค. ์ ๋ ๊ต์ก์์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๋ _์ด๋ณด์๋ฅผ ์๊ฐํ๋ฉด์_ ํํฐ ์ ๊ฑฐ๋ฅผ ์ง์งํ์ต๋๋ค. ์ ๋ ๊ฐ์ธ์ ์ผ๋ก ์๋ฐฑ ๋ช (์๋ง๋ ์ฒ ๋ช ์ด์)์๊ฒ ์น ๊ฐ๋ฐ์ ์ฐ์ตํ๋ ๋ฐฉ๋ฒ์ ์ฒ์๋ถํฐ ๊ฐ๋ฅด์ณค์ต๋๋ค. ์ด์ ์ฝ๋ฉ ๊ฒฝํ์ด ์์ต๋๋ค. ์คํ์, ๊ณ ๋ฑํ์, ๋ํ์, ์ ๋ฌธ์ง ์ฑ์ธ, ๋ ธ์ธ๋ค๊ณผ ํจ๊ป ํด๋ดค์ต๋๋ค.
๊ทธ๋ฐ ๊ด์ ์์, ํํฐ๋ ์ฒ์์๋ ํฅ๋ฏธ์ง์งํ ๋ง์ ์ฒ๋ผ ๋ณด์ผ ์ ์์ง๋ง, ์ ํ๋ ํธ์๋ฅผ ์ํด ๋ ๋ณต์กํจ์ ๋์ ํจ์ผ๋ก์จ ๊ถ๊ทน์ ์ผ๋ก ํ์์ ํ์ต ์๋๋ฅผ ๋ฆ์ถ๋ ๊ฒ์ด๋ผ๊ณ ๋งํ ์ ์์ต๋๋ค. ๊ทธ๋ค์ด Angular๋ Vue๋ฅผ ์ฌ์ฉํ ์ ์ด ์๊ณ ์ด ๋ํ๊ฐ ๋ฐ๋์๋ค๋ฉด - ์ฐ๋ฆฌ๋ 2.0์์ ๊ทธ๊ฒ๋ค์ _๋์ _ํ๋ ค๊ณ ํ์ต๋๋ค - ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ๋ค์ด ์ ํ์ํ์ง ๊ทธ๋ฆฌ๊ณ ์ธ์ ์ฌ์ฉํด์ผ ํ๋์ง ์ค๋ช ํ๋ ๋ฐ ์ด๋ ค์์ ๊ฒช์ ๊ฒ์ ๋๋ค.
2.0์์ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋๋ค๋ ์ด์ผ๊ธฐ๊ฐ ๋์ค๊ธฐ ์ ์ ์ ๋ ์ฐ๋ฆฌ ์ฝ๋ ํ๊ต์ ์ปค๋ฆฌํ๋ผ์์ ํํฐ๋ฅผ ์ ๊ฑฐํ์ต๋๋ค. ์๋ํ๋ฉด ์ฐ๋ฆฌ๋ ์ด๋ณด์์๊ฒ ์ด๋กญ๊ธฐ๋ณด๋ค ํด๋ฅผ ๋ผ์น๋ค๋ ์ถฉ๋ถํ ์ฆ๊ฑฐ๋ฅผ ์์งํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๋ค์ด ๋ฉ์๋ ๋ฐ ๊ณ์ฐ๋ ์์ฑ๊ณผ ๊ฐ์ ๋ณด๋ค ๋ค์ํ Vue ๊ธฐ๋ฅ์ ๋ํ ๊ฒฝํ์ ์ป์์ผ๋ฉด ํฉ๋๋ค. ํํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ ์ต๊ด์ ์ฝ๊ฒ ์ฐพ์๋ผ ์ ์์ผ๋ฏ๋ก ์ฌ์ฉ์ ๊ถ์ฅํ์ง ์์ต๋๋ค.
์ด ๋ ๊ฐ์ง ๋ถ๋ง ์ฌํญ์ด ํด๊ฒฐ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ฐ๋ฆฌ๋ ๋ณผ ๊ฒ์ด๋ค. ๐
๊ทธ๋ฌ๋ Vue์ ํํฐ๊ฐ ์์๋ค๊ณ ์์ํด ๋ณด์ญ์์ค. ํ๋ก ํธ์๋ ํ๋ ์์ํฌ๊ฐ JavaScript์ ๊ตฌ๋ฌธ์ ํ์ฅํ๋๋ก ์์ฒญํ์๊ฒ ์ต๋๊น?
๋ฌผ๋ก ํํฐ๋ ์ด์ ์ ์ธ๊ธํ Twig์์์ ๊ฐ์ด _templates_์ ๋งค์ฐ ์์ฐ์ค๋ฝ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ๊ฒ ํ ๊ฒ์ ๋๋ค. ํ์ดํ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ํ ํ๋ฆฟ์ ์ฝง์์ผ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ๋งํผ ์์ฐ์ค๋ฝ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฆ, ์ฝง์์ผ์ html์ด ์๋๊ณ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์๋๊ณ ์ฌ๋ฌ๋ถ๋ ์ ๊ฑฐํ์๊ฒ ์ต๋๊น? ํ์ดํ ์ฐ์ฐ์์ ๋ค๋ฅธ ์ ์ ๋ฌด์์ ๋๊น?
"์์ด๋ค์ ๋ํด ์๊ฐํ๋ผ"๋ ์ฃผ์ฅ์ ๊ทธ๋ฅ ๋ฉ์ฒญํ๋ค. ๋ด๊ฐ ์๋ ํ, Vue๋ JavaScript๋ฅผ ๊ฐ๋ฅด์น๊ธฐ ์ํด ์ค๊ณ๋์ง ์์์ง๋ง ํ๋ก ํธ ์๋ ๊ฐ๋ฐ์๊ฐ ์์ ์ ์๋ฃํ๋๋ก ์ค๊ณ๋์์ต๋๋ค. ํ์์ ๊ฒฝ์ฐ ํํฐ๊ฐ ์ข์ต๋๋ค.
๊ทธ๋ค์ด Angular๋ Vue๋ฅผ ์ฌ์ฉํ ์ ์ด ์๊ณ ์ด ๋ํ๊ฐ ๋ฐ๋์๋ค๋ฉด - ์ฐ๋ฆฌ๋ 2.0์์ ๊ทธ๊ฒ๋ค์ ์๊ฐํ๋ ค๊ณ ํ์ต๋๋ค - ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ๋ค์ด ์ ํ์ํ๊ณ ์ธ์ ์ฌ์ฉํด์ผ ํ๋์ง ์ค๋ช ํ๋ ๋ฐ ์ด๋ ค์์ ๊ฒช์ ๊ฒ์ ๋๋ค.
๋๋ ๋งค์ฐ ๋์ํ์ง ์๋๋ค. ์ ๋ 2005๋ ๋ถํฐ Django๋ผ๊ณ ํ๋ Python ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํด ์์ผ๋ฉฐ ์ดํ์ ํ์ํ ๋๋ถ๋ถ์ ํ ํ๋ฆฟ ์ธ์ด์ ์๊ฐ์ ์ค ํ ํ๋ฆฟ ์ธ์ด๋ ์ฒซ๋ ๋ถํฐ ํํฐ๋ฅผ ์ฌ์ฉํ์ต๋๋ค. 10๋ ๋๊ฒ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ค๊ณผ ํจ๊ป ์ฌ์ฉํ๋ฉด์ ๋๋ ๊ทธ๋ค์ ์๋ฆ๋ค์๊ณผ ์ ์ฉ์ฑ์ ์๊ฒ ๋์์ต๋๋ค. ์ด ๊ตฌ๋ฌธ์ด ์ฌ๋ผ์ง๋ฉด ์ฌํ ๊ฒ์ ๋๋ค.
(Django๊ฐ ํํฐ๋ก ์ํํ๋ ์์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. https://docs.djangoproject.com/en/1.9/ref/templates/builtins/#built-in-filter-reference )
@Uninen ๋น์ ์ ์ด์กฐ์ ์ฃผ์ํ์ญ์์ค - ๋ค๋ฅธ ์ฌ๋์ ์ฃผ์ฅ์ ๋ฉ์ฒญํ๊ฒ ๋ถ๋ฅด๋ ๊ฒ์ ํ ๋ก ์ ์ฐธ์ฌํ๋ ๊ฑด์ค์ ์ธ ๋ฐฉ๋ฒ์ด ์๋๋๋ค.
์๋ฒ ์ธก ํ ํ๋ฆฟ ์ธ์ด์ ๋ํ ๋๋ก์ ๋น์ ์ ๊ฒฝ์ฐ - ์ฃผ๋ชฉํด์ผ ํ ํ ๊ฐ์ง ์ค์ํ ์ธก๋ฉด์ ์๋ฒ ์ธก ํ ํ๋ฆฟ ์ธ์ด๊ฐ Vue ํ ํ๋ฆฟ๊ณผ ๊ฐ์ ์ ์ฐ์ฑ์ ๊ฐ๊ณ ์์ง ์๋ค๋ ๊ฒ์ ๋๋ค(๊ณ์ฐ๋ ์์ฑ ์์, ์ ํ๋ ํํ์). ๋ํ - ๊ทธ๊ฒ๋ค์ ์์ ํ ๋ค๋ฅธ ๋ชฉ์ ์ ์ํด ๋ง๋ค์ด์ก์ต๋๋ค: ์ ์ ๋ฌธ์์ด ์ถ๋ ฅ. Vue ํ ํ๋ฆฟ์ ์๋ฐฉํฅ DOM์ ํํ์ ๋๋ค. ์๋ฐฉํฅ ๋ฐ์ธ๋ฉ, ์ด๋ฒคํธ ํธ๋ค๋ฌ, ๊ตฌ์ฑ ์์ ์ํ ๋ฑ์ด ์์ต๋๋ค. ํํฐ๋ Vue ์ปจํ ์คํธ์์ ๋งค์ฐ ์ ํ๋ ์ฌ์ฉ ์ฌ๋ก์๋ง ์ ํฉํฉ๋๋ค. ์ค๋๋ ์ ๋ v-model, v-for ๋ฐ v-on์ ๋ํ ํํฐ์ ๊ฐ์ด ๋ชจ๋ ๊ณณ์ ํํฐ๋ฅผ ํ์ฉํ๋ ๊ฒ์ ์ข์ง ์์ ์๊ฐ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
ํ ๊ฐ์ง ๊ฐ๋ฅํ ๋์์ ํํฐ๋ฅผ ์ ์งํ๋ ํ
์คํธ ๋ณด๊ฐ์๋ง ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. ์ฆ, ์ง์๋ฌธ์ด ์๋ {{ }}
๋ด๋ถ์์๋ง ํํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํฅ๋ฏธ๋ก์ด ์ฐธ์กฐ๋ก: Angular 2์๋ ์ฌ์ ํ ํํฐ("ํ์ดํ"๋ก ์ด๋ฆ ๋ณ๊ฒฝ)๊ฐ ์์ง๋ง ์๋์ ์ผ๋ก ๋ชฉ๋ก ํํฐ๋ง ํํฐ๋ฅผ ์ ๊ฑฐํ์ต๋๋ค.
์ ์ธ์ด๋ก ์ฃ์กํฉ๋๋ค. ๋๊ตฐ๊ฐ๋ฅผ ๋ชจ์ํ๋ ค๋ ์๋๋ ์๋๋๋ค.
์ ์๊ฒ ํ๋ ์์ํฌ์ ๋ชฉ์ ์ ์ด๋ ค์ด ์์ ์ ์ํํ๊ณ ์ด๋ฌํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๊ฐ ๋ณด๊ธฐ ์ฝ๊ฒ ๋ง๋๋ _is_์ ๋๋ค. ๋๋ ์ฌ์ ํ ๊ตฌ๋ฌธ์ด ์ด๊ธธ ์ ์๋ค๊ณ ์ฃผ์ฅํ๋ฉฐ, ๋ค์ ๋งํ์ง๋ง ๊ทธ๊ฒ์ด ์ฌ๋ผ์ง๋ ๊ฒ์ ๋ณด๋ ๊ฒ์ ์ฌํ ๊ฒ์ ๋๋ค.
๋๋ ๋ด๋ถ ๋ฉ์ปค๋์ฆ์ ์ ์์ง ๋ชปํ๊ฑฐ๋ ์ดํดํ์ง ๋ชปํ์ง๋ง ์ฌ์ฉ์์ ๊ด์ ์์ ๋ณด๋ฉด ์ค์ฉ์ฑ์ด ์์ํจ์ ๋ฅ๊ฐํฉ๋๋ค. :)
๊ด๋ จ ๋ฉ๋ชจ์์ ์ด ์ปค๋ฎค๋ํฐ์ ์ผ๋ง๋ ๋ง์ ์ด์ ์ด ์๋์ง ํ์ธํ๋ ๊ฒ์ด ํฅ๋ฏธ๋ก์ ์ต๋๋ค. ์ ์๊ฒ Vue๋ ์ ์ ํ๊ณ ํ๋ ฅ์ ์ฃผ๋ ๋๊ตฌ์์ต๋๋ค. ์๋ง๋ ๊ทธ๋์ ์ ๊ฐ ์ด ํน๋ณํ ์ฐฝ๊ณ ๋ฅผ ๊ทธ๋ฆฌ๋ ๋ฐ ์ฐธ์ฌํด์ผ ํ์ ๊ฒ์ ๋๋ค. :)
๋ค๋ฅธ ๋ฐ์ดํฐ ํฌ์ธํธ์ ๊ฒฝ์ฐ Ember์๋ ํํฐ๊ฐ ์์ผ๋ฉฐ ๊ณ์ฐ๋ ์์ฑ์ด ์์ง๋ง ๊ตฌ์ฑ ์์ ๋ฉ์๋๋ฅผ ํ์ฉํ์ง ์์ต๋๋ค.
ํ
ํ๋ฆฟ ๋ด ๋ณํ์ ์ํํ๋ ์์ ํจ์์ ์ฌ์ฉ ์ฌ๋ก์ ๊ฒฝ์ฐ ํธ๋ค๋ฐ ๋์ฐ๋ฏธ/์ ๋ฒ ๋์ฐ๋ฏธ๋ฅผ ๋ฑ๋กํด์ผ ํฉ๋๋ค.
http://emberjs.com/api/classes/Ember.Helper.html
ํธ๋ค๋ฐ ํฌํผ๋ ํธ๋ค๋ฐ ํฌํผ๊ฐ ์๋ ๊ฒ๊ณผ ๊ตฌ๋ฌธ์ ์ผ๋ก ๊ตฌ๋ณ๋ฉ๋๋ค. ๊ทธ๋์ ์ ๊ฐ ๊ทธ๊ฒ์ ๊ฐ์ ธ์์ต๋๋ค. ํ์ดํ ํํฐ ๊ตฌ๋ฌธ๊ณผ ๊ณตํต์ ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํธ๋ค๋ฐ ํ ํ๋ฆฟ์ "๋ ผ๋ฆฌ ์๋" ํ ํ๋ฆฟ์ด๋ฏ๋ก ํ ํ๋ฆฟ ๋ด ํจ์ ํธ์ถ์ ์ํ ํน๋ณํ ๊ตฌ๋ฌธ์ด ํ์ํฉ๋๋ค. Vue์๋ ์๋ ๋ฌธ์ ์ ๋๋ค.
ํํฐ๋ ์ด๋ณด์์๊ฒ ๊ฐ๋จํฉ๋๋ค. ๋ฐฐ์ด์์ ์์ ์ถ๋ ฅ ๋๋ filter\ordersearch๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๊ฐ์ ๋ง์ ์ ๋ณผ ์ ์์ต๋๋ค.
{{ article.date.created_at | moment 'MM.DD.YYYY HH:mm:ss' }}
๊ทธ๋ฆฌ๊ณ ์ฝ๊ฒ ์ ์
Vue.filter('moment', (str, format) => moment(str).format(format));
ํ ํ๋ฆฟ์์ ๊ฐ๋จํ๊ณ ๋ช ํํฉ๋๋ค. 2.x์ ๊ฒฝ์ฐ ์ธ๋ถ ๋ชจ๋์์ ํํฐ๋ฅผ ์ ์ํ๊ณ ํ ํ๋ฆฟ์์
import moment from 'moment'
methods:{
moment(date, format){
return moment(str).format(format)
}
}
๊ทธ๋ฆฌ๊ณ ํ ํ๋ฆฟ์์
{{ moment(article.date.created_at, 'MM.DD.YYYY HH:mm:ss') }}
์ ์์ผ๋ก ์ค๋๋ ํํฐ๋ฅผ ํ ํ๋ฆฟ์ ๋จ๊ฒจ๋๊ณ ํํฐ๋ฅผ ๋ณ๋์ ๋ชจ๋๋ก ์ด๋ํ๊ณ ๋ฉ์๋ ์น์ ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ด๋ป์ต๋๊น?
๊ทธ๋ฌ๋ ํ์ํ์๋ฉด ๊ทธ๋ฅ ํ์ธ์.
npm install vue-utils
utils ํจํค์ง์ ํน์ ํํฐ ์ฌ์ฉ
import {moment} from 'vue-utils/date'
import {price} from 'vue-utils/numbers'
methods:{
moment, price
}
์ผ๋ฐ ํํฐ๋ก ์ฌ์ฉ
{{ article.date.created_at | moment 'MM.DD.YYYY HH:mm:ss' }}
{{ product.price | price }}
๊ฒฐ๊ณผ์ ์ผ๋ก ๊ฐ๋จํ ํจ์ ํธ์ถ๋ก ๋ณํ๋ฉ๋๋ค.
moment(article.date.created_at, 'MM.DD.YYYY HH:mm:ss')
price(product.price)
_๋ฉ๋ชจ_
๋์๊ฒ ํํฐ๋ ๋ ์ง, ์ซ์ ๋๋ ๋ฌธ์์ด๊ณผ ๊ฐ์ ๋ฐ์ดํฐ ํ์์ ์ง์ ํ๋ ๋ฐ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค . ๋ฐฐ์ด\๊ฐ์ฒด ํํฐ๋ง์ ๊ฒฝ์ฐ ์ผ๋ฐ vue ๋ชจ๋์์ ๊ณ์ฐ ๋ฐ ๊ธฐ๋ฅ์ ๋ ์ ์ฌ์ฉํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
import _ from 'vue-utils/array'
computed:{
ordersTable(){
return _(this.orders)
.filterBy(this.filter)
.sortBy('date', -1)
.limit(10)
}
}
์ด์ต:
์ด๋ณด์๋ ์ค๋๋ ํํฐ๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ง๋ง ๊ณ์ฐ๋ ํ
ํ๋ฆฟ์์ ๋ฐ์ดํฐ ์ถ๋ ฅ ํ์์ ์ง์ ํ๊ธฐ ์ํด ์์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ณ ํ๋ก๊ทธ๋๋จธ๋ ์์ฒด ๊ธฐ๋ฅ ๋ชจ๋์ ์์ฑํ์ฌ ์ฌ์ฉํ๊ธฐ ์ฝ์ต๋๋ค.
_์ ๋ณ๋์ ๋ชจ๋์ ์ฌ์ฉํฉ๋๊น?_
Vue์ ํต์ฌ์ ์์ ํ์๋ ์๋ค๊ณ ์๊ฐํ์ง๋ง Vue์๋ ๊ฐ๋ฐ์ ํ
ํ๋ฆฟ ๋์์ด๋๋ฅผ ์ํ ์ผ๋ถ ์ ํธ๋ฆฌํฐ๊ฐ ์์ด์ผ ํ๋ฏ๋ก ํญ์ lodash, moment ๋๋ ๊ธฐํ๊ฐ ํ์ํ์ง ์์ต๋๋ค. npm์์ ์ ํธ๋ฆฌํฐ๋ฅผ ์ค์นํ๊ณ ์ฌ์ฉํ๊ธฐ ์ฝ๋๋ก ํ์ง๋ง ์ด์ ํธ์ถ ๊ตฌ๋ฌธ์ ์ ์ฅํด์ผ ํฉ๋๋ค. ํ
ํ๋ฆฟ.
๊ทธ๋ฌ๋ ํ ๊ฐ์ง ์ค์ํ ์๊ฐ์ ํํฐ์ ๋ํด ์ํ๋์ด์ผ ํ๋ฉฐ, vuex์ getter์ ๊ฐ์ ์์ํ ๊ธฐ๋ฅ์ด ์์ด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค.
์ง์ํ๊ธฐ ์ฝ๊ณ ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ ํ์ฅํ๋ฉฐ ํ ํ๋ฆฟ์ ์ ๋ณผ ์ ์์ต๋๋ค.
์ฌ๋ฌ๋ถ์๊ฒ ํ์ํ ๊ฒ์ ๋ช ํํ ์ ๊ทธ๋ ์ด๋ ๊ฒฝ๋ก์ Javascript ์ฝ๋๋ฅผ ๋ชจ๋ํํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๊ณ ์ ํ๋ ์ด๋ง์ ๋๋ค.
@thelinuxlich ์ฐ๋ฆฌ๋ ํํฐ์ ๋ํด ์ด์ผ๊ธฐํฉ๋๋ค.
{{ article.date.created_at | moment 'MM.DD.YYYY HH:mm:ss' }}
๋จ์ง ๊ตฌ๋ฌธ ์คํ
{{ moment(article.date.created_at, 'MM.DD.YYYY HH:mm:ss') }}
๊ทธ๋ฌ๋ Vue\javascript์์ ์ด๋ณด์๋ฅผ ์ํ ํํฐ๋ฅผ ์์ ํ ์ ์ธํ๋ ๊ฒ์ ์ข์ง ์์ต๋๋ค. Vue์ ๊ฐ์ Laravel ์ปค๋ฎค๋ํฐ๊ฐ ํ์ํ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๊ฐ๋จํ๊ณ ๊ฐ๋ ฅํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
ํํฐ๋ฅผ ์์ ํ ์ ๊ฑฐํ๋ ๊ฒฝ์ฐ _"ํ ํ๋ฆฟ ๋์์ด๋๋ฅผ ์ํด"_์ ๋ํ ๋์์ ์ ๊ณตํด์ผ ํฉ๋๋ค. ๋ฐฐ์ด์ ์ ๋ ฌํ๊ฑฐ๋ ํํฐ๋งํ๋ ๋ฐฉ๋ฒ์ ์ ํ์๊ฐ ์์ต๋๋ค. ์ฝ๋ ํ์ ์์ ๋ฅผ ์ ๋ ฅํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
ํ๋ก๊ทธ๋๋จธ๋ Javascript ์ฝ๋๋ฅผ _modularise__ํ๋ ๋ฐฉ๋ฒ์ ์์์ผ ํ์ง๋ง ์์ ์์ ์ ์ฌ์ฉํ๋ ์ฌ๋์ ์ ํ์๊ฐ ์์ต๋๋ค.
_"ํ ํ๋ฆฟ ๋์์ด๋๋ฅผ ์ํด"_์ ๋ํด ๋งํ๋ฉด
<script src="vue-utils.js"></script>
๋ด๋ถ ์ฝ๋ ์ฌ์ฉ
Vue.use(VueUtils)
computed:{
ordersTable(){
return this.utils.array(this.orders)
.filterBy(this.filter)
.sortBy('date', -1)
.limit(10)
}
}
์๋ฅผ ๋ค์ด ์์ ์ ์๋์ค๋ฝ๊ฒ ์ฌ๊ธฐ๊ณ ๋ฐฐ์ด์ ํํฐ๋งํ๊ณ ์ ๋ ฌํ๊ธฐ ์ํด js๋ฅผ ์ ํ์๊ฐ ์์ต๋๋ค. ๋ง์ ์ฌ๋๋ค์ด ์ด๋ค ์ผ์ ํ๊ณ ์ถ์ดํ์ง๋ง ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ด๋ ต์ต๋๋ค.
computed: {
filteredThings () {
return this.things
.filter(item => item.title.indexOf('foo') > -1)
.sort((a, b) => a.bar > b.bar ? 1 : -1)
.slice(0, 5)
}
}
๋ฐ๋ผ์ ์ฐ๋ฆฌ๊ฐ ๊ฑฐ๊ธฐ์ ๊ฐ๋จํ ์๋ฃจ์ ์ ์ ๊ณตํ ์ ์๊ณ ๊ฐ๋ฐ์์๊ฒ ์ข์ ๊ฒฝ์ฐ ์ด๋ฌํ ์ ํ์ ์ฌ๋๋ค์ ์ํด ๋ณต์กํ ๊ฒ์ ๋ง๋ค ํ์๊ฐ ์์ต๋๋ค.
ํ ๊ฐ์ง ๊ฐ๋ฅํ ๋์์ ํํฐ๋ฅผ ์ ์งํ๋ ํ ์คํธ ๋ณด๊ฐ์๋ง ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ์ฆ, ์ง์๋ฌธ์ด ์๋ {{ }} ๋ด์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ์์ฃผ ์ข์ ํํ์ด ๋ ์ ์๋ค๊ณ ์๊ฐํ๋ค. ๋ชจ๋ ์ฌ๋์ ๋ง์กฑ์ํฌ ์๋ ์์ง๋ง ํํฐ๋ฅผ ์ฌ์ฉํ ๋ชจ๋ ๊ฒ์ด ํ์ฌ ํํฐ๊ฐ ๊ทธ ์ด์์ ํ ์ ์๋ค๋ ์ฌ์ค์ด ์ด์ํฉ๋๋ค.
ํํฐ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ฐฉํฅ ํํฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ ๊ฑฐํ์ฌ ๋ณต์ก์ฑ์ ์ค์ด๋ ค๋ ๊ฒฝ์ฐ ํธ๋ฆฌํ ํ ์คํธ ์์์ ํ์ฉํฉ๋๋ค.
์ ์๊ฐ์๋ momentjs ํํฐ ์์ ๊ฐ ์ด๋ฏธ ํ ํ๋ฆฟ์ ๋๋ฌด ๋ง์ ๋ ผ๋ฆฌ๋ฅผ ์ ๋ฌํ๊ณ ์์ต๋๋ค.
์ง์งํ๊ฒ, ๋น์ ์ TC39์ ๋๋ฌํ ๋๊น์ง ์ด ๋ชจ๋ "ํ์ดํ ๋ฌ๋ธ"๋ฅผ ์ฌ์ ์ ์ฅ์๋ก ๋ณด๋ด์ผ ํฉ๋๋ค. :)
@yyx990803 ๊ณผ @VitaliyLavrenko ๊ฐ ์ ์ํ ๊ฒ์ ์ข์ํฉ๋๋ค. ๊ทธ๊ฒ์ ์ข์ ์ค๊ฐ ์ง์ ์ด ๋ ์ ์์ต๋๋ค.
์ค์ฝง
๋๋ @VitaliyLavrenko ์ ์์ ์ข์ํ์ง๋ง ๋น์ทํ ๊ฒ์ ๋งํ ๋ ํ๋ฌ๊ทธ์ธ @azamat-sharapov์์ ํ๋ฌ๊ทธ์ธ์ ํ์ดํ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ํด ํ๋ฌ๊ทธ์ธ์ ์ปดํ์ผ๋ฌ๋ฅผ ์๋ง์ผ๋ก ๋ง๋ค์ด์๋ ์ ๋๋ค๊ณ ๋งํ์ต๋๋ค... ๊ทธ๋์ ๊ทธ๊ฒ์ด ๊ฐ๋ฅํ์ง ์๋๋ฉด ๋ด๊ฐ ๊ทธ๋ฅ ๋๊ธ์ ์๋ชป ์ดํดํ๋์?
@thelinuxlich
๋ฌด์์ ์ฝ๋ ๊ฒ์ด ์ข์๊น์?
<div v-for="thing in things | filterBy 'foo' | orderBy 'bar' | limitBy 5">
๋๋
computed: {
filteredThings () {
return this.things
.filter(item => item.title.indexOf('foo') > -1)
.sort((a, b) => a.bar > b.bar ? 1 : -1)
.slice(0, 5)
}
}
๊ฐ๋ฐ์๋ก์ ์๊ฐํ๊ณ ์๋ฐ ์คํฌ๋ฆฝํธ๋ฅผ ๋ชจ๋ฅด๋ ์ฌ๋์๊ฒ ๋ฌผ์ด๋ณด์ญ์์ค.
๋์ ๊ดํด์๋ _๊ฐ๋ฐ์๊ฐ ์๋_์๊ฒ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด ๋ ์ข์ต๋๋ค.
Vue.use(VueUtils)
computed:{
ordersTable(){
return this.utils.array(this.orders)
.filterBy(this.filter)
.sortBy('date', -1)
.limit(10)
}
}
๊ทธ๊ฒ์ ์ค๊ฐ์ด๊ณ vue-resource์ฒ๋ผ ๊ณตํต ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ฒ๋ผ ์ฌ์ฉ๋ฉ๋๋ค.
ํ์ดํ์ ๋ํด์๋ ๊ตฌ๋ฌธ ์คํ์ ๋๋ค.
๋ฌผ๊ฑด | filterBy 'foo' | orderBy '๋ฐ' | ์ ํ 5
~์์ํ
thing in limitBy(orderBy(filterBy(things, 'foo'), 'bar'), 5)
์ฝ๊ธฐ ์ฌ์?
2๊ฐ์ diff ํ ํ๋ฆฟ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด์ผ ํ๋ ๊ฒฝ์ฐ ํ๋์ ๋ฐ์ดํฐ์ ๋ํด 2๊ฐ ๋๋ 3๊ฐ์ ์์ ์ฌํญ์ ์ ์ฅํฉ๋๊น?
๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ:
padLeft(capitalize(title), 10)
padRight(upper(title), 5)
๋๋ ์ถ์์ ์ธ ์ํฉ์ด์ง๋ง ํ๋ ๋๋ ๋ ๊ฐ์ ํ ํ๋ฆฟ์์ ์ฌ์ฉํ๋ค๋ฉด? 10๊ฐ ๋๋ 100๊ฐ ๊ฐ์ฒด์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด์ผ ํฉ๋๊น? ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋๋ฆฌ์๊ฒ ์ต๋๊น? ์, ๋์ฐ๋ฏธ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ ํ๋ฆฟ์์ ์ฌ์ฉํ ์ ์์ง๋ง _"ํ ํ๋ฆฟ ๋์์ด๋๋ฅผ ์ํด"_ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ฉ๋ฆฌ ๋จ์ด์ ธ ์๋ ๊ฒฝ์ฐ title | padLeft 10 ์ด๊ณ ํจ์ ํธ์ถ๋ก ๋ณํ๋์ด์ผ ํฉ๋๋ค. ์ฝ๊ณ ๊ธฐ๋ฅ์ ์ ๋๋ค.
diff ์ฌ๋๋ค์ ๋ํด ์๊ฐํด๋ณด์ญ์์ค. ๊ฐ๋ฐ์๋ diff ๋ฐฉ์์ผ๋ก ์ฝ๊ฒ ํ ์ ์์ง๋ง ๋ค๋ฅธ ์ฌ๋๋ค์ ๊ฐ๋จํ๊ฒ ํ๊ธฐ๋ฅผ ์ํฉ๋๋ค.
๋ค์ ๋งํ์ง๋ง ํ ํ๋ฆฟ์ ๋๋ฌด ๋ง์ ๋ ผ๋ฆฌ๊ฐ ์๋ ๊ฒ์ ๋ฐํจํด์ ๋๋ค. ํน์ DSL(ํํฐ)์ ๋ฐฐ์ฐ๋ ๋์ Javascript๋ฅผ ๋ฐฐ์์ผ ํฉ๋๋ค.
@thelinuxlich JSX ๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฐฉํฅ ๋ฐ์ธ๋ฉ ๋ฐ ๊ธฐํ ๋ช ๊ฐ์ง๊ฐ ํฌํจ๋ React๋ฅผ ์ป์ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ Vue๋ฅผ ์ฌ์ฉํ๋ฉด javascript๋ฅผ ๋ชจ๋ฅด๋ ์ฌ๋๋ค์ด ์์ง๋ง Google์ ์ฌ์ฉํ๋ฉด ๋ฌด์ธ๊ฐ๋ฅผ ํ ์ ์์ต๋๋ค. ํ์ดํ๊ฐ ๋ง์์ ๋ค์ง ์์ผ๋ฉด ์ฌ์ฉํ์ง ๋ง์ญ์์ค. ์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
Vue.config.pipeFuncCall = true
๊ทธ๋ฆฌ๊ณ ๋น์ ์ ๊ทธ๊ฒ์ ์ผ๊ฑฐ๋ ๋ ์ ์์ง๋ง ์ด๋ค ์ฌ๋๋ค์๊ฒ๋ ์ฝ์ต๋๋ค.
_๋ค์ ํ ๋ฒ ๋ง์๋๋ฆฌ์ง๋ง JS ๊ฐ๋ฐ์๋ค์ Vue๋ฅผ ์ฌ์ฉํ ์ ์์ ๋ฟ๋ง ์๋๋ผ Vue์ ๊ฐ์ ์ด๊ธฐ๋ ํฉ๋๋ค._
ํ์ค ๊ณตํต ํํฐ๊ฐ ํ์ํ์ง๋ง ๋ณ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๊ณ vue์ ์ถ๊ฐํ๊ณ ์ฌ์ฉํ๊ธฐ ์ฝ์ต๋๋ค.
์๋๋ฉด Vue๊ฐ ASM๊ณผ ๊ฐ์ผ๋ฉฐ ์ข์ ๊ฐ๋ฐ์๋ง ์ฌ์ฉํ ์ ์๊ธฐ๋ฅผ ์ํ์ญ๋๊น?
์ฌ๋ฌ๋ถ, Vue ํต์ฌํ์ด ๋ด๋ฆฐ ๊ฒฐ์ ์ด ์ ์ค๋ช ๋ ๊ฒ ๊ฐ์์. ์ฐ๋ฆฌ๋ ๋๊ฐ์ ๊ฒ์ ๊ณ์ํด์ ๋ฐ๋ณตํ๊ณ ์๋กญ๊ณ ๊ฐ์น ์๋ ๊ฒ์ด ์๋ค๋ฉด ๊ทธ๊ฒ์ ๋ํด์๋ง ๋ ผํํ ์ ์์ต๋๊น?
JS๊ฐ ์๋ ๊ฐ๋ฐ์์๊ฒ ๋ ์ฌ์ด ๊ฒ์ด Vue ํต์ฌ ์์น์ ์ผ๋ถ๋ผ๋ฉด ์ธ์ด ์์น์ ์์ฒ๋ฅผ ์ฃผ๋๋ผ๋ ๋์ํ๊ฒ ์ง๋ง ์๋ง๋ ๊ทธ๋ ์ง ์์ ๊ฒ์ ๋๋ค.
์ ์ ๋งํ๋ฏ์ด ํํฐ๊ฐ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๊ฒ์ด ๋๋ถ๋ถ์ด์ง๋ง ํธ์๋ฅผ ์ํด ํํฐ๊ฐ ๊ทธ๋ฆฌ์ธ ๊ฒ์ด์ง๋ง ๋งค์ฐ ์ ์ฌํ ํํฐ ์์คํ ์ด ํ๋ฌ๊ทธ์ธ์ผ๋ก ๋์ ๋ ์ ์๋ค๊ณ ํ์ ํฉ๋๋ค.
๋๋ ๊ณ์ฐ๋ ์ํ๊ณผ ์ธ๋ผ์ธ์์ ์ฌ์ฉํ ์ ์๋ ๊ฐ๋ ์ฆ๋ช ์์ ๋ฅผ ์กฐ๊ธ ๋ ์ผ์ฐ ์ ๊ณตํ์ต๋๋ค.
<ul>
<li v-for="item in f(items).filterBy(foo).orderBy(bar).limitBy(5).apply()">
{{ item.foo }}
</li>
</ul>
๋ฐ๋ฉด์ ๋๊ตฐ๊ฐ ํ์ดํ๋ฅผ ์ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์๋ค๊ณ ํ์ ํฉ๋๋ค.
<ul>
<li v-for="item in p(items, 'filterBy foo | orderBy bar | limitBy 5')">
{{ item.foo }}
</li>
</ul>
๋๋ ํ๋ฌ๊ทธ์ธ์ด ํํ์์ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ ์ํ๋ ๋๋ก ์ฒ๋ฆฌํ ์ ์๋ ํํฌ๊ฐ ์๋ค๋ฉด ๊ทธ๊ฒ๋ ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ผ ์ ์์ง๋ง ์ด๋ ๊ตฌํ์ด ์ผ๋ง๋ ๋ณต์กํ๊ณ ์ด๋ค ์ํฅ์ ๋ฏธ์น ์ง์ ๋ฌ๋ ค ์์ต๋๋ค. ํ๋ ์์ํฌ(์ฑ๋ฅ/ํฌ๊ธฐ)์์, ๊ทธ๋ฆฌ๊ณ @yyx990803 ์ด ์ค์ ๋ก ์ด ๋ฐฉํฅ์ผ๋ก ๊ฐ๊ณ ์ถ์์ง ์๋์ง!
์ฌ์ฉํ๊ธฐ ์ฌ์ด(ํ๋ฌ๊ทธ์ธ์ด๋ ํต์ฌ์ ์ธ ๊ฒ) ์ฐ์ํ ๋์์ด ์ฃผ์ด์ง๋ฉด ์๋นํ ๋นจ๋ฆฌ ์ต์ํด์ง ๊ฒ ๊ฐ์ต๋๋ค.
@rigor789 ๋ฐฐ์ด ํํฐ๋ง ๋ฐ ์ ๋ ฌ ๋ฑ์ ์ํด ๊ณ์ฐ์ ๋ ์ ์ฌ์ฉํ๋ฉด ํจ์ฌ ๊นจ๋ํฉ๋๋ค. ํ์ง๋ง diff ํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
created_at ํ๋๊ฐ ์๊ณ ํ ํ๋ฆฟ์์ ํ์ํ ๊ฒฝ์ฐ dd.mm.YYYY ๋๋ ๋งํฌ๋ก ๋ ๋๋ง
<a href="dd">dd</a>.<a href="mm">mm</a>.<a href="YYYY">YYYY</a>
์ง๊ธ ์ ์ฌ์ฉ๋๋ ์ด ํํฐ์ ๋ํด 2.x์์ ์ด๋ค ๋์์ ์ป์ ์ ์์ต๋๊น?
์ง๊ธ์ ๋ง ์ฌ์ฉ
{{ date(created_at, 'dd') }}
๊ทธ๋ฆฌ๊ณ date ๋ฉ์๋๋ฅผ ์ ์ํ์ง๋ง ํ ํ๋ฆฟ์ ๋๋ฝ๊ฒ ๋ง๋ค๊ณ , 3๊ฐ์ ํ๋๋ฅผ ์ถ๊ฐ๋ก ์ ์ฅํ๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋ชจ๋๊ณ , 100-200๊ฐ ๊ฐ์ฒด์ด๋ฉด ๋ฌด๊ฑฐ์์ง๋๋ค.
์ต์ข ๊ฒฐ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
html
{{ date | formatDate('YY-MM-DD') }}
Evan์ ๋ค์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๊ทธ๊ฒ์ด Vue๋ฅผ ํ๋ฅญํ๊ฒ ๋ง๋๋ ์ด์ ์ ๋๋ค. ํ๋ฅญํ ์ง๋์๊ฐ ์์ต๋๋ค. :์๋ค:
์ค์ฝง
@yyx990803 & @chrisvfritz
์ด ํ ๋ก ์์ ๋ฌปํ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ํ ๊ฐ์ง๋ ์๋ฐฉํฅ ํํฐ์ ๋๋ค. ์๋ฐฉํฅ ํํฐ๋ ์ ์๋ ๋ค๋ฅธ ์๋ฃจ์ ์ผ๋ก ๋ณต์ ํ๊ธฐ ๊ฐ์ฅ ์ด๋ ค์ด ํํฐ์ ๋๋ค.
์ด ์ฌ์ฉ ์ฌ๋ก๋ฅผ "์ฌ์ํ" ๋๋ "๋ ๋ณต์กํ" ๊ฒ์ผ๋ก ๋ฌด์ํ๋ ๊ฒ์ ์ญํจ๊ณผ์ ๋๋ค. ์ ๋ ์ค๋ํ ์ ํ๋ฆฌ์ผ์ด์ ๋ชจ๋์์ ์ด๊ฒ์ ์ฌ์ฉํ์ต๋๋ค. ์ด์ํ๊ฒ ์๋ํ์ต๋๋ค! ๋ฐ๋ชจ๋ ๋ฐ๋์ ๊ฐ๋จํ์ง๋ง ๊ธฐ์ ์ ํ์คํฉ๋๋ค.
v-for
์ ๋ฐฐ์ด์ ๋ค๋ฃฐ ๋ ๋ ํผ๋์ค๋ฝ์ต๋๋ค(๋ค์ ๋งํ์ง๋ง ์๋์ ์ผ๋ก ๋จ์ํจ). ๋ฐฐ์ด์ ๋ฐ๋ณตํ๋ฉด ๊ณ์ฐ๋ ์์ฑ์ ์์งํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ๋ฐฐ์ด์ ๊ฐ ํญ๋ชฉ์ ๋ํด ๋ณ๋์ ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ๊ณ ๋ ๋ง์ ์์ฉ๊ตฌ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์
๋๋ค.์ด ์๋ฅผ ํํฐ์ ๋น๊ตํ์ญ์์ค.
``` js
'some-currency-filter'์์ ํตํ ๊ฐ์ ธ์ค๊ธฐ;
'product-stub'์์ ์ ํ์ ๊ฐ์ ธ์ต๋๋ค.
์๋ก์ด ๋ทฐ({
์: document.body,
๋ฐ์ดํฐ: { ์ ํ },
ํํฐ: { ํตํ },
});
```
ํํฐ๊ฐ ์๋ ์ฌ๋์๊ฒ:
``` js
'some-currency-filter'์์ ํตํ ๊ฐ์ ธ์ค๊ธฐ;
'product-stub'์์ ์ ํ์ ๊ฐ์ ธ์ต๋๋ค.
์๋ก์ด ๋ทฐ({
์: document.body,
๋ฐ์ดํฐ: { ์ ํ },
๊ตฌ์ฑ ์์: {
์ ํ: {
์ํ: ['์ ํ'],
๊ณ์ฐ: {
๊ฐ๊ฒฉ: {
๊ฐ์ ธ ์ค๊ธฐ() {
ํตํ๋ฅผ ๋ฐํํฉ๋๋ค.read(this.product.price);
},
์ธํธ(๊ฐ) {
this.product.price = ํตํ.์ฐ๊ธฐ(๊ฐ)
}
},
๋ฐฐ์ก: {
๊ฐ์ ธ ์ค๊ธฐ() {
ํตํ๋ฅผ ๋ฐํํฉ๋๋ค.read(this.product.shipping);
},
์ธํธ(๊ฐ) {
this.product.shipping = ํตํ.์ฐ๊ธฐ(๊ฐ)
}
},
์ทจ๊ธ: {
๊ฐ์ ธ ์ค๊ธฐ() {
ํตํ๋ฅผ ๋ฐํํฉ๋๋ค.read(this.product.handling);
},
์ธํธ(๊ฐ) {
this.product.handling = ํตํ.์ฐ๊ธฐ(๊ฐ)
}
},
ํ ์ธ: {
๊ฐ์ ธ ์ค๊ธฐ() {
ํตํ๋ฅผ ๋ฐํํฉ๋๋ค.read(this.product.discount);
},
์ธํธ(๊ฐ) {
this.product.discount = ํตํ.์ฐ๊ธฐ(๊ฐ)
}
}
}
}
}
});
```
๋๋ ์์ ์ด๋ค ๊ฒ์ ์ฐ๊ณ ์ถ์์ง ์๋๋ค.
(์ด๊ฒ์ ๊ณ์ฐ๋ ์์ฑ ํฉํ ๋ฆฌ๋ฅผ ์์ฑํ์ฌ ์ฝ๊ฐ ์ ๋ฆฌํ ์ ์์ง๋ง ์์ ์ ์ด๊ฒ์ด ํ์ํ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ์ฅํฉํ๋ค๋ ์ ์ ๋๋ค)
ํต์ฌ ํ์ด ํํฐ ํ์ดํ ๊ตฌ๋ฌธ์ ํ๊ณ ํ๊ฒ ๋ฐ๋ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฏ๋ก v-model
์ง์๋ฌธ์ filter
๋งค๊ฐ๋ณ์๋ฅผ ๋์
ํ ์ ์์ต๋๊น?
filter
๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ์ฒซ ๋ฒ์งธ ์ฐ์ํ ๋ฒ์ ์ JS๋ฅผ ์ ์งํ ์ ์๊ณ ๋งค์ง ํ์ดํ ๊ตฌ๋ฌธ ๋์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋๋ก ํ
ํ๋ฆฟ์ ๋ค์ ์์ฑํ ์ ์์ต๋๋ค.
<tr v-for="product in products">
<td><input type="text" filter="currency" v-model="product.price"></td>
<td><input type="text" filter="currency" v-model="product.shipping"></td>
<td><input type="text" filter="currency" v-model="product.handling"></td>
<td><input type="text" filter="currency" v-model="product.discount"></td>
</tr>
์ด๊ฒ์ ๋ง์ ์์ฉ๊ตฌ ์์ด ์ ๋ ฅ์ ์ฝ๊ฒ ์๋ค๋ก ๋ณํํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ์งํ๋ฉด์ ๋ง๋ฒ์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ง ์๋ ์ ์ ํ ๊ท ํ์ ์ ์งํฉ๋๋ค.
์ดํดํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
ํํฐ๋ฅผ ์ฌ์ฉ์ ์ง์ ์ง์๋ฌธ์ผ๋ก ํตํฉํ๋๋ก ์์ ๋ฅผ ๋ค์ ์์ฑํ์ต๋๋ค: jsfiddle .
ํํฐ๋งํผ ๊ฐ๊ฒฐํ์ง๋ ์์ง๋ง ๋ด๊ฐ ์์ํ๋ ๊ฒ๋งํผ ๊ณ ํต์ค๋ฝ์ง๋ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฏธ ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ์ฌ์ฉํ ์ ์๋ ๊ฒ๋ค์์ ์กฐ๊ฐ๋ค์ ๋ชจ์ผ๋ ๋ฐ ๋ง์ ์๊ฐ์ด ๊ฑธ๋ฆฌ์ง ์์์ต๋๋ค.
๊ฐ ํํฐ์ ๋ํ ์ ์ฉ ์ง์๋ฌธ์ ์์ฑํ๋ @Nirazul ์ ์ด์ ์ ์ ์๋์์ต๋๋ค . ์ฑ์์ ์ฌ์ฉํ๋ ๊ฐ ์ ํ์ ํํฐ์ ๋ํด ๋ชจ๋ v-model
๊ธฐ๋ฅ์ ๋ค์ ๊ตฌํํ๋ ์๋ก์ด ์ง์๋ฌธ์ ์์ฑํด์ผ ํ๋ ๊ฒ์ ํฐ๋ฌด๋์๋ ์ผ์
๋๋ค.
๋ํ ์ง์๋ฌธ์ ํํฐ์ฒ๋ผ ์์ ํ ์๋ํ์ง๋ ์์ต๋๋ค. ๊ฐ์ ๋ณ๊ฒฝํ ํ ํ๋๋ฅผ ํ๋ฆฌ๊ฒ ํด๋ ํ์์ด ๋ค์ ์ง์ ๋์ง ์์ต๋๋ค. ๋ํ v-model
๋ ํด๋น ์ง์๋ฌธ์์ ์ํํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋ง์ ์์
์ ์ํํฉ๋๋ค.
์ด ์ง์นจ์ ๋ถ๋ช ํ ๋ ๋ง์ ๊ธฐ๋ฅ๊ณผ ์์ ์ฌํญ์ผ๋ก ์์ ๋ ์ ์์ง๋ง ์์ ์ ๋จ์ ์์ต๋๋ค. ์ด๊ฒ๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋งค์ฐ ๊ฐ๋จํด์ผ ํ๋ ๊ฒ ์ธ์ ๋ชจ๋ ๋ฐ์ฐฝ๊ณ ์ ๋๋ค.
์ด ์ค๋ ๋์์ ์ฌ์ฉ์ ์ง์ ์ง์๋ฌธ์ ์ธ๊ธํ๋ ์ ์์ ๋ณธ ์ ์ด ์์ต๋๋ค. ์ด ๋๊ธ์ ์ง์ ํด ์ฃผ์๊ฒ ์ต๋๊น?
๋น์ ์ด ์์ํ ์ ์๋ฏ์ด, ๋๋ ๋น์ ์ด ๋น์ ์ ์ฑ์์ ์ฌ์ฉํ๊ธฐ ์ํด ๊ทธ๊ฒ์ ์์ฑํ๊ณ ํ
์คํธํ์ง ์์์ต๋๋ค. ๋์์ผ๋ก ์ง๊ธ ๊ฐ๋ฅํ ๊ฒ์ด ๋ฌด์์ธ์ง ๋ณด์ฌ์ฃผ๊ณ ์ถ์์ต๋๋ค. ์ด๊ฒ์ด ๊ทธ๋ ๊ฒ ์ฝ๊ฒ ๊ฐ๋ฅํ๋ค๋ฉด ํ๋ฌ๊ทธ์ธ์ด ํ๋ก์ธ์ค๋ฅผ ํจ์ฌ ๋ ์๋ํํ ์ฌ์ง๊ฐ ์์ ์ ์์ต๋๋ค.
์ด ๋น ๋ฅด๊ฒ ์์ฑ๋ ์ง์๋ฌธ์๋ v-model์ ์ ์ฒด ๊ธฐ๋ฅ์ด ๋ถ์กฑํ๋ค๋ ๊ฒ์ด ๋ถ๋ช
ํฉ๋๋ค. ๋งค๊ฐ๋ณ์ ๋ฐ/๋๋ ์์ ์์ ๊ฒฐํฉ๋ ํ๋์ ์ฌ์ฉ์ ์ ์ ํํฐ ์ง์๋ฌธ์ด ํํฐ๋ฅผ ๋์ฒดํ๊ธฐ์ ์ถฉ๋ถํ ์ ์์ต๋๋ค.
๋ด๊ฐ ๋น์ ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์๋ํ ๊ฒ์ฒ๋ผ ๊ฑด์ค์ ์ธ ์ํ๋ฅผ ์ ์งํฉ์๋ค. ๊ธฐ์ฌํ๊ณ ์์ผ๋ก ๋์๊ฐ๋ ๊ฒ๋ณด๋ค ์๋ฃจ์ ์ ๊ฐํํ๋ ๊ฒ์ด ํญ์ ๋ ์ฝ์ต๋๋ค.
@JosephSilber ๊ธด์ฅ ์
์๋
ํ์ธ์, ํ
ํ๋ฆฟ ํผ๋์ ์ค์ด๊ธฐ ์ํด ํํฐ๋ฅผ ์ ๊ฑฐํ๊ณ ์์ต๋๊น ์๋๋ฉด ์ฌ๊ฐํ ์ํฅ์ ๋ฏธ์น๊ณ ์์ต๋๊น?
2.0์ ๊ธฐ์ ๊ตฌํ? ์ด์ ์๊ฐ ํจ๊ณผ ๋ฌธ์ ๋ผ๋ฉด ํ์ฉํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
์ง๊ธ๊ณผ ๊ฐ์ ํํฐ (๊ทธ๋ฌ๋ ์๋ก์ด ์๋ฐ ์คํฌ๋ฆฝํธ ์์์ผ๋ก)
๊ทธ๋ฌ๋ v-for="i of list | orderBy('key')", (ํ๋ ์ด์์ ํ์ดํ ๊ธฐํธ)์ ๊ฐ์ด ํํ์๋น ํ๋๋ง์ผ๋ก ์ ํํฉ๋๋ค.
์ด๊ฒ์ 2.0์์ ํํฐ ์ฒ๋ฆฌ๋ฅผ ๋ ๊ฐ๋จํ๊ณ ์์ธก ๊ฐ๋ฅํ๋ฉฐ ์๊ฐ์ ์ผ๋ก ๋ ๋ณต์กํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
{{}}์ ๋ํ ํํฐ ๊ตฌ๋ฌธ ๋ถ์์ด ์์ผ๋ฏ๋ก ๋ค๋ฅธ ํํ์์์ ์ด๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ด๊ฒ์ ๊ธฐ์กด์ ๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก/๊ธฐ๋ฅ(์: ์๋ฐฉํฅ ํํฐ๋ง, v-for ๋ด์ ํญ๋ชฉ)์ ์์ฉํฉ๋๋ค.
๋ ์ด์์ ํํฐ์ ๋ํ ๊ธฐ์กด ์ฌ์ฉ์ ์์ ์๊ฐ ์ฝ๊ฒ ๋ณํฉ/์
๊ทธ๋ ์ด๋ํ ์ ์์ต๋๋ค.
@tomsmithgroup ๊ทํ๊ฐ ์ ์ํ ๊ฒ(๋ฐ ๊ทธ ์ด์)์ 2.0์์ ๊ณ์ ์ง์๋๊ธฐ๋ก ๊ฒฐ์ ๋์์ต๋๋ค.
@yyx990803 & @chrisvfritz ๋ ์๋ฐฉํฅ ํํฐ ์ ๋ํ ๊ทํ์ ์๊ฐ์ ๋ฃ๊ณ ์ถ์ต๋๋ค.
@JosephSilber ๋ฐ๋ผ์ ์ธ๊ธํ ๊ณ์ฐ๋ ์์ฑ ๊ณต์ฅ์๋ ์์ฉ๊ตฌ๋ ๋ง์ง ์์ต๋๋ค.
import currenciesFactory from 'some-computed-currencies-factory'
import products from 'products-stub'
new Vue({
el: 'body',
data: { products },
components: {
product: {
props: ['product'],
computed: currenciesFactory(['price', 'shipping', 'handling', 'discount'])
}
}
})
๊ฐ์ธ์ ์ผ๋ก๋ ์ด ์์ ์ ๋ํ ํฉํ ๋ฆฌ๋ฅผ ๋ง๋ค์ง ์์ ๊ฒ์ ๋๋ค. ์๋ํ๋ฉด ์ด๋ฌํ ๊ฐ ์์ฑ์ ์ค์ ๋ก ํ์ฌ๋ง ๋์ผํ๊ฒ _๋ํ๋๋_ ๋ณ๊ฐ์ ๊ด์ฌ์ฌ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ํํฐ๋ฅผ ์ ๊ฑฐํ๋ฉด ํ ๊ตฌ์ฑ ์์๊ฐ ์ผ๋ง๋ ๋ณต์กํ์ง ํจ์ฌ ๋ ๋ช ํํด์ง๋๋ค. ๊ทธ๊ฒ์ด ๋น์ ์ด ๋ณด์ผ๋ฌ ํ๋ ์ดํธ๋ก๋ณด๊ณ ์๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ด ๊ตฌ์ฑ ์์๊ฐ _์กด์ฌํ๋_ ํฐ ์ด์ ์ ๋๋ค. ๋ณต์ก์ฑ์ ๊ด๋ฆฌ ๊ฐ๋ฅํ ๋ฌธ์ ๋ก ๋๋๋๋ค. ๊ตฌ์ฑ ์์๋ฅผ ๋ณผ ๋ ๊ตฌ์ฑ ์์๊ฐ ์ํํ๋ ๋ชจ๋ ์์ ์ ๋ด ์์ ๋ฉ๋ชจ๋ฆฌ์ ์ฝ๊ฒ ๋ง์์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ฐ๋ฐ ์๋๊ฐ ํจ์ฌ ๋๋ ค์ง๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค. ํํฐ ๊ตฌ๋ฌธ ๋ค์ ๋ณต์ก์ฑ์ ์จ๊ธด๋ค๊ณ ํด์ ๋ณต์ก์ฑ์ด ์ ๊ฑฐ๋๋ ๊ฒ์ ์๋๋๋ค.
์ด๋ฅผ ์ ์ฆํ๊ธฐ ์ํด ๋ฌธ์ ๊ฐ ์ค์ ๋ณํํ๋ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ ๋ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค. ํ ์ธ์ด ๊ฐ๊ฒฉ + ๋ฐฐ์ก + ์ทจ๊ธ๋ณด๋ค ํด ์ ์๋๋ก ๊ฒฐ์ ํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๋๋ ์ทจ๊ธ์ X ๊ธ์ก์ ์ด๊ณผํด์๋ ์๋ฉ๋๋ค. ๋๋ ํ ์ธ ํ๋๋ ํตํ๊ฐ ์๋ ๋ฐฑ๋ถ์จ์ด์ด์ผ ํฉ๋๋ค. ๋๋ ์ด์ก์ด ์ผ์ ๊ธ์ก์ ์ด๊ณผํ๋ ๊ฒฝ์ฐ ์๋์ผ๋ก ์ต์ ํ ์ธ์ด ์ ์ฉ๋ฉ๋๋ค.
์ถ๊ฐ ์ต์ ๊ณผ ์กฐ๊ฑด๋ถ ๋ ผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ํํฐ๋ฅผ ๋ ๋ณต์กํ๊ฒ ๋ง๋ค๊ณ ์ถ์ ์ ์์ต๋๋ค. ํํฐ์ API ๋ฐ ๋ด๋ถ ๋ก์ง์ ์ ๋ฐ์ดํธํ ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ํํฐ๋ฅผ ์ฌ์ฉํ๋ ๋ค๋ฅธ ๋ชจ๋ ํญ๋ชฉ์ ์ด๋ป๊ฒ ์ํฅ์ ๋ฏธ์น ์ง ์๊ฐํด์ผ ํฉ๋๋ค. ๊ณต์ ํํฐ์ธ ๊ฒฝ์ฐ ํ์ฌ ๊ตฌ์ฑ ์์ ์ธ๋ถ์์๋ ๊ฐ๋ฅํฉ๋๋ค. ์ด์ ์ฑ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์ด๋ ต๊ฒ ๋๊ปด์ง๊ธฐ ์์ํ๋ ์ํฉ์ ์ฒํด ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ ๋ชจ๋ ๊ณต์ ๋ 2๊ฐ ํํฐ๋ฅผ ํตํด ๋ด๋ถ ๊ตฌ์ฑ ์์ ์ํ๋ฅผ ๊ตฌ์ฑ ์์ ์ธ๋ถ์ ์์ํ ์ ์์ผ๋ฏ๋ก ๊ตฌ์ฑ ์์ ๊ฒฝ๊ณ๋ฅผ ์๋ฐํ๊ณ ๊ฒฐํฉ์ด ์ฆ๊ฐํ๊ณ ๊ตฌ์ฑ ์์์ ๋ํด ์์ ํ ๋๋ง๋ค ์ฌ์ ํ ์๊ฐํด์ผ ํ๋ ๋ณต์ก์ฑ์ ์จ๊ธธ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ฐ๋ณ์ ์ผ๋ก ์ ์๋ ๊ณ์ฐ๋ ์์ฑ ๋๋ ๋ฐ์ธ๋ฉ๋ props๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ณ์ ์ผ๋ก ๋ ๋ณต์กํ ์ฌ๋ฌ ๊ตฌ์ฑ ์์๋ก ํญ๋ชฉ์ ๋๋๋ฉด ๋ณํํ๋ ์๊ตฌ ์ฌํญ์ ๋ง๊ฒ ํ ์ค์ ์ ๋ฐ์ดํธํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ถ๊ฐ ์ต์ ์ด๋ ์กฐ๊ฑด์ด ์์ต๋๋ค. ํ์ฅ ๋ณต์ก์ฑ์ ์ถฉ์กฑํ๊ธฐ ์ํ ๋ฆฌํฉํ ๋ง์ด ์์ต๋๋ค. ๊ตฌ์ฑ ์์ ์ธ๋ถ ๋๋ ๋จ์ผ ์์ฑ ์ธ๋ถ์ ๋ํด ์๊ฐํ ํ์๊ฐ ์์ต๋๋ค. ๊ทํ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒ์๋ถํฐ ์์๊ณ ์ฌ์ ํ ์ฝ๊ฒ ์๊ฐํ๊ณ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
์ด ๊ฒฝ์ฐ ํํฐ๊ฐ ์ฒ์์ ๋งคํน์ ์ผ๋ก ๋ง๋๋ ์ด์ ๋ ๋ณต์ ์ ๋ํ ์น๋ฃ๋ฒ์ด ์ฝ๊ฒ ์ ๊ทผํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ค๋ณต์ ๋ถ์์ ์ผ ๋ ์์ฉ๊ตฌ๊ฐ ์๋๋๋ค(์ฆ, ์ค์ ๋ฌธ์ ๊ฐ ํ์ฐ์ ์ผ๋ก ์์๋๊ธฐ ์ ์ ์ฝ๋๊ฐ ๋ฐ๋ก ์ง๊ธ ๋ฐ์ํฉ๋๋ค).
๊ทธ๋ฆฌ๊ณ ๋๋ ๊ทธ๊ฒ์ Sandi Metz๋ณด๋ค ๋ ์ ํํํ ์ ์์ต๋๋ค.
๋ณต์ ๋ ์๋ชป๋ ์ถ์ํ๋ณด๋ค ํจ์ฌ ์ ๋ ดํฉ๋๋ค.
@chrisvfritz ํํฐ๋ ๋น์ฆ๋์ค ์๊ตฌ ์ฌํญ๊ณผ ์ ํ ๊ด๋ จ์ด ์์ต๋๋ค. ํํฐ๋ ๋ฐ์ดํฐ์ ํ์๋ง ์ง์ ํฉ๋๋ค. ๊ทธ๊ฒ ๋ค์ผ ๊ทธ๋ค์ ์ด๋ค ํํ๋ ํํ๋ก๋ ๊ทธ๊ฒ์ ์กฐ์ํ์ง ์์ต๋๋ค. filter="currency"
๋ ๊ฐ๋
์ ์ผ๋ก number
๋งค๊ฐ๋ณ์์ ๋์ผํฉ๋๋ค. ๋น์ฆ๋์ค ์๊ตฌ ์ฌํญ์ ๋ถ๋ช
ํ ํํฐ์์ ์ฒ๋ฆฌ๋์ด์๋ ์ ๋ฉ๋๋ค.
ํ ์ธ์ด ๊ฐ๊ฒฉ + ๋ฐฐ์ก + ์ทจ๊ธ๋ณด๋ค ํด ์ ์๋๋ก ๊ฒฐ์ ํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๋๋ ์ทจ๊ธ์ X ๊ธ์ก์ ์ด๊ณผํด์๋ ์๋ฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ vue-validator
์ ๊ฐ์ ์ ์ ํ ์ ํจ์ฑ ๊ฒ์ฌ ๋ชจ๋์ ์ฌ์ฉํฉ๋๋ค. ํตํ ํํฐ๋ ๊ธฐ๋ณธ ๊ฐ์ ํ์ํ๊ธฐ๋ง ํ๋ฉด ๊ด๊ณ์์ด ๊ทธ๋๋ก ์ ์ง๋ฉ๋๋ค.
ํ ์ธ ํ๋๋ ํตํ๊ฐ ์๋ ๋ฐฑ๋ถ์จ์ด์ด์ผ ํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ถ๋ช
ํ ๊ทธ ์ ํ์ ๋ ์ด์ ํตํ๊ฐ ์๋๋๋ค. ์ฌ์ฉ์ ์ด๋ฆ ์๊ตฌ ์ฌํญ์ด ๋ณ๊ฒฝ๋ ๋ type="text"
๋ฅผ type="email"
๋ฐ๊พธ๋ ๊ฒ๊ณผ ๋ค๋ฅด์ง ์์ต๋๋ค. ๋๋ ํ๋๊ฐ ๋ ์ด์ ์ซ์๊ฐ ์๋ ๋ number
๋งค๊ฐ๋ณ์๋ฅผ ์ ๊ฑฐํ๋ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค.
์ด์ก์ด ์ผ์ ๊ธ์ก์ ์ด๊ณผํ๋ฉด ์๋์ผ๋ก ์ต์ ํ ์ธ์ด ์ ์ฉ๋ฉ๋๋ค.
๋ค์ ๋งํ์ง๋ง ์ต์๊ฐ์ด ์ ์ฉ๋์ง๋ง ํตํ ํํฐ๋ ๊ทธ๋๋ก ์ ์ง๋ฉ๋๋ค. ์ฌ์ ํ ํตํ๋ก ํ์ํ๊ณ ์ถ์ ๊ฒ์ ๋๋ค.
ํํฐ์ API์ ๋ด๋ถ ๋ก์ง์ ์ ๋ฐ์ดํธํ ๋, ์ด์ ๋ณ๊ฒฝ ์ฌํญ์ด ํํฐ๋ฅผ ์ฌ์ฉํ๋ ๋ค๋ฅธ ํญ๋ชฉ์ ์ด๋ค ์ํฅ์ ๋ฏธ์น ์ง ์๊ฐํด์ผ ํฉ๋๋ค. [...] two-filter๋ฅผ ์ฌ์ฉํ๋ฉด ๋ด๋ถ ๊ตฌ์ฑ ์์ ์ํ๋ฅผ ๊ตฌ์ฑ ์์ ์ธ๋ถ์ ์์ํ ์ ์์ต๋๋ค.
์๋์. ํํฐ ์์ฒด์ ๋
ผ๋ฆฌ๋ ์ํ๋ฅผ _์ ๋_ ๋ฃ์ง ์์ต๋๋ค. ํํฐ๋ ์๊ฒฉํ๊ฒ ํ์ ๊ฐ์ ์ํ ๋ฉฑ๋ฑ ํจ์์
๋๋ค. ์ด์์ ์ผ๋ก๋ VM ์ปจํ
์คํธ์์ ์คํ๋์ง ์์์ผ ํฉ๋๋ค . ์ถ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ this
๊ฐ ์์ด์ผ ํฉ๋๋ค.
๋ณต์ ๋ ์๋ชป๋ ์ถ์ํ๋ณด๋ค ํจ์ฌ ์ ๋ ดํฉ๋๋ค.
...๋น์ ์ด ๋งํ๋ฏ์ด, ๋น์ ์ ๋ฐ๋ก ์ง๊ธ ๊ฐ์ ์ผ์ด ๋ฐ์ํ๋ ์ฝ๋๋ฅผ ์ถ์ํํ๊ณ ์์ต๋๋ค. ๋ฐ๋ฉด์ ํํฐ๋ ๊ฐ์ ํ์์ ์ง์ ํ๋ ๊ฐ๋จํ ๋ฉฑ๋ฑ ํจ์์ ๋๋ค. ๊ทธ๊ฒ๋ค์ ์ ํ ์ถ์ํ๊ฐ ์๋๋๋ค.
tl;dr ํํฐ๋ ์ถ์ํ๊ฐ ์๋๋ฉฐ ๋ช
์์ ์ธ ๋น์ฆ๋์ค ์๊ตฌ ์ฌํญ์ ๋์ ํ์ง ์์ต๋๋ค. ํํฐ์๋ ๋ด๋ถ ๋
ผ๋ฆฌ๊ฐ ์์ผ๋ฉฐ ์ ๋ ์์ด์ผ ํฉ๋๋ค. ๊ฐ๋
์ ์ผ๋ก HTML์ type
์์ฑ ๋ฐ v-model
์ number
๋งค๊ฐ๋ณ์์ ์ ์ฌํฉ๋๋ค.
์๋ฐฉํฅ ํํฐ๋ ํ์คํ ์ถ์ํ์
๋๋ค. v-model
์ ๋ํ ์๋ฐฉํฅ ํํฐ์ ํ์ฌ ๋์์ ๋ด๋ถ์ ๋ง์ ๋ง๋ฒ์ ์จ๊น๋๋ค. ํนํ ์
๋ ฅ์ DOM ๊ฐ์ด ๊ธฐ๋ณธ ๋ชจ๋ธ๊ณผ ์ผ์์ ์ผ๋ก ๋๊ธฐํ๋์ง ์๊ณ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์๋ง "๋๊ธฐํ"๋๋๋ก ํฉ๋๋ค. ํ๋๋ฅผ ํ๋ฆฌ๊ฒ ํฉ๋๋ค. BTW @JosephSilber ์ด ๋์์ ํน๋ณํ ๊ทํ์ ์์ฒญ์ผ๋ก ์ธํด ๊ตฌํ๋์์ผ๋ฏ๋ก ๊ทํ๊ฐ ์ด์ ๋ํด ๊ทธ๋ ๊ฒ ๊ฐํ๊ฒ ๋๋ผ๋ ์ด์ ๋ฅผ ์ดํดํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์๋ฐฉํฅ ํํฐ์์ ๋ด๊ฐ ๋ณธ ๊ฐ์ฅ ํฐ ๋ฌธ์ ๋ ๊ธฐ๋ณธ ๋ ผ๋ฆฌ๊ฐ ๋ธ๋๋ฐ์ค์ด๊ณ ์ฌ์ฉ์๊ฐ ๊ธฐ๋ฅ ์์ฒญ์ ๋ง๋๋ ๊ฒ ์ธ์๋ ์ถ๊ฐ๋ก ์ฌ์ฉ์ ์ง์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์ ๋๋ค. ๋์๊ฒ ๋ ๋์ ์ต์ ์ ๊ทธ๋ฌํ ํ๋์ ์ง์ ๊ตฌํํ๊ธฐ ์ํ ์ ์ ํ ๋น๋ฉ ๋ธ๋ก์ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค. 2.0์์ ์ด๊ฒ์ด ์ด๋ป๊ฒ ๊ฐ๋ฅํ์ง ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค.
https://jsfiddle.net/yyx990803/5bnu6xb6/
์ฌ๊ธฐ์ ํ์ฌ ์๋ฐฉํฅ ํํฐ์ "out-of-sync-until-blur" ๋์์ ๊ตฌํํ๋ ๊ธฐ๋ณธ CustomInput
๊ตฌ์ฑ ์์๊ฐ ์์ต๋๋ค. 2.0์ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ์ธํด ๊ตฌ์ฑ ์์๊ฐ value
input
์ด๋ฒคํธ๋ฅผ $emitํ๋ ํ ์ฌ์ฉ์ ์ง์ ๊ตฌ์ฑ ์์์์ v-model
๋ฅผ ์ง์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ํ ํ์ฌ ์๋ฐฉํฅ ํํฐ๋ก๋ ๋ถ๊ฐ๋ฅํ change
์ด๋ฒคํธ์ ๊ฐ ํ์์ ์ง์ ํฉ๋๋ค . ํ๋ ์์ํฌ์์ ์๋ฐฉํฅ ํํฐ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ฝ๋งค์ด์ง ์๊ณ ์ํ๋ ๋์ ์ ์ป๊ธฐ ์ํด ์ด ๊ตฌ์ฑ ์์๋ฅผ ์ถ๊ฐ๋ก ์กฐ์ ํ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ ๊ตฌ์ฑ ์์๋ ๊ตฌ๋ฌธ ๋ถ์/ํฌ๋งทํ
๋ก์ง์ ๊ตฌํํ์ง ์์ต๋๋ค. parse
๋ฐ format
๋ฉ์๋๋ก ํ์ฅํ์ฌ ํน์ ์ฌ์ฉ ์ฌ๋ก์ ๋ง๋ ๋ง์ถคํ ์
๋ ฅ ๊ตฌ์ฑ ์์๋ฅผ ์ป์ต๋๋ค. ์ด ๊ฒฝ์ฐ CurrencyInput
๊ตฌ์ฑ ์์์
๋๋ค.
๊ธฐ๋ณธ ๊ตฌ์ฑ ์์๋ ์๋ฐฉํฅ ํํฐ๋ณด๋ค ๋ ๋ณต์กํฉ๋๋ค. ์ด์ ์ด์ ๋งค์ง ๋์์ ์ง์ ๊ตฌํํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด ๊ตฌ์ฑ ์์๋ ํ ๋ฒ๋ง ์ ์ํ๋ฉด ๋ฉ๋๋ค. ๊ทธ ๋๊ฐ๋ก ๋์ค์ ๋ณ๊ฒฝํ๋ ค๋ ๊ฒฝ์ฐ ์๋ ๋ฐฉ์์ ์์ ํ ์ ์ดํ ์ ์์ต๋๋ค. ๋๋ ์ด๊ฒ์ด ๊ฐ์น ์๋ ์ ์ถฉ์์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ด๊ฒ์ ๊ฐ์ฅ ๋ง์ ์ ์ด๋ฅผ ์ ๊ณตํ๋ ์ฌ์ฌ์ฉ์ฑ์ ์ํ ํตํฉ๋ ์ถ์ํ์ด๊ธฐ ๋๋ฌธ์ ์ปดํฌ๋ํธ์ ๋ํด ๋ ๋ง์ด ์๊ฐํด์ผ ํ๋ ๋ฐฉ๋ฒ์ ์์
๋๋ค. ๋ํ 2.0 select2 ์์ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค. ์ด์ ์๋ 1.0์์ ์ง์๋ฌธ์ผ๋ก ๊ตฌํ๋์์ง๋ง ์ด์ ๋ ๋์ผํ v-model
์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง ๊ตฌ์ฑ ์์์
๋๋ค.
๋์๊ฒ ๋ ๋์ ์ต์ ์ ๊ทธ๋ฌํ ํ๋์ ์ง์ ๊ตฌํํ๊ธฐ ์ํ ์ ์ ํ ๋น๋ฉ ๋ธ๋ก์ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ ํ๋ฅญํ๊ณ ๊ฐ์ฅ ํ์คํ Vue๊ฐ ํ์๋ก ํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ์ด๊ฒ์ ์ฝ๊ณ ์ถ์์ต๋๋ค.
๋์๊ฒ ๋ ๋์ ์ต์ ์ Vue๋ฅผ ์์ํ๊ณ ์๋ก์ด ํํฐ๋ง ๋์์ผ๋ก Vue๋ฅผ ํ์ฅํ๊ธฐ ์ํ ์ ์ ํ ๋น๋ฉ ๋ธ๋ก์ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค.
์ฆ, ํตํ ์ ๋ ฅ ๊ตฌ์ฑ ์์์ ๋ค๋ฅธ ์ฌ๋ฌ ๊ธฐ๋ณธ ํํฐ๋ง ๊ตฌ์ฑ ์์๊ฐ Vue์ ์ผ๋ถ๊ฐ ๋ ์ ์์ต๋๊น? ๋๊ตฌ๋ ํ ๋ฒ์ฏค์ ํํ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๊ฒ ์ฃ ? ์ ๋๊ฐ์ ์ผ์ ๊ณ์ํด์ ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ ๋งก๊ธธ๊น์? ํตํ ํ์์ Vue ์์ฒด ํํฐ๋ง ๊ตฌ์ฑ ์์ ๋๊ตฌ ๋ชจ์์ ์ผ๋ถ๋ก ๋ง๋ค๊ธฐ์ ์ถฉ๋ถํ ํ์ค์ด๋ฉฐ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์์ฒด ํํฐ๋ง ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ธ ์ ์๋ ํ๋ฅญํ ๊ธฐ๋ณธ ์์ ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ .....์์ฑ๋ ํตํ ์ ๋ ฅ ๊ตฌ์ฑ ์์๊ฐ ๋๋ ์์ ์์ ๋๋ฝ๋ ๋จ ํ ๊ฐ์ง๋ i18n ๊ธฐ๋ฅ์ ๋๋ค. Vue๋ ์ด๋ฅผ ์๋ฐํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํตํ ์ซ์ ํ์์ ์ฌ๋(์์ฒญ์)์ด ์ ํํ ๋ก์ผ์ผ์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋์ด์ผ ํฉ๋๋ค. ๋ด ๋ง์ ๋ก์ผ์ผ ๋ฐ์ดํฐ ์ฆ . "DE_de"๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ก์ผ์ผ ํ์๊ธฐ์ ํ์๋ ๋๋ก ํตํ ๋ฐ ๊ธฐํ ์ซ์ ํ์์ ์ง์ ํฉ๋๋ค(ํ์ค์์ ํ์๋จ). Vue์ ์ถ๊ฐํ๋ฉด Vue์ ๋ฐ๋ก ๋ด์ฅ๋ ํ๋ฅญํ ํตํ/์ซ์ ์์ ๊ตฌ์ฑ ์์ ์์คํ ์ด ์์ต๋๋ค. Vue๋ฅผ ์ฌ์ฉํ๋ 1000๋ช ์ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ ์ค์ค๋ก ์์ฑํ ํ์๊ฐ ์๊ณ Vue๋ฅผ ์ป์์ ๋ ๊ทธ ์๋ฆฌ์์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. . ์ด๊ฒ์ Vue๋ฅผ ๊ฐ๋ ฅํ ํ ํ๋ฆฟ ์์คํ ์ผ๋ก ๋ง๋ญ๋๋ค!
์ด "i18n ํ์ ๊ตฌ์ฑ ์์"๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด 1.0์์์ ๊ฐ์ด ํํฐ๋ก ์ฐ๊ฒฐ ๊ฐ๋ฅํ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋ ์ ์๋ค๋ฉด ํ๋ฌ๊ทธ์ธ ๊ฐ๋ฅํด์ผ ํฉ๋๋ค. ๊ทธ๊ฒ๋ ๊ด์ฐฎ์๊ฑฐ์ผ. ๊ทธ๊ฒ์ด Aurelia๊ฐ ํ๊ณ ์๋ ์ผ ์ด๋ฉฐ Twig๊ฐ ํ์ฅ ๊ธฐ๋ฅ์ผ๋ก ํ๋ ์ผ์ด๊ธฐ๋ ํฉ๋๋ค . ํตํ ์
๋ ฅ ๊ตฌ์ฑ ์์๋ ์ฌ์ ํ <currency-input>
์ผ ์ ์์ต๋๋ค.
์ด i18n ๋ฐ ๊ธฐํ ํ์ค ํ ํ๋ฆฟ ํํฐ๋ ๋ค๋ฅธ ์ฌ๋๋ค์ด ๊ณ์ํด์ ์ฌ์์ฐํ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ์ค์ ๋ก ํ์ํฉ๋๋ค. ๊ทธ๋ฐ ํ๋ฌ๊ทธ์ธ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์๋ ค์ฃผ์๋ฉด i18n ํ๋ฌ๊ทธ์ธ๋ ๋ง๋ค์ด ๋๋ฆฌ๊ฒ ์ต๋๋ค. ๋๋ ์ด๊ฒ์ ๊ด์ฌ์ด ์์ต๋๋ค!:์ค๋ง์ผ:
์ค์ฝง
๋๊ตฌ๋ ํ ๋ฒ์ฏค์ ํํ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๊ฒ ์ฃ ?
์๋์. ์ ๋ ํ ๋ฒ๋ ์ค์ ๋ก ์ฌ์ฉํ ์ ์ด ์์ต๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ๋ด์ฅ ํํฐ์๋ ๋์ผํ๊ฒ ์ ์ฉ๋ฉ๋๋ค. ์ผ๋ถ๋ ์ฐ๋ฆฌ์๊ฒ ์ ์ฉํ์ง๋ง ๋๋จธ์ง๋ ์ธ๋ชจ๊ฐ ์์ต๋๋ค. ์ด ์ฃผ์ ์ ๋ํด ์ด์ผ๊ธฐํ๋ ๋์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋ด์ฅ ํํฐ๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์์ง๋ง ๊ฒฐ๊ตญ ์ ์์ ์ ๋ฒ์ ์ ์์ฑํ์ฌ ๋ด์ฅ ๋ฒ์ ์ ๋ฐ๋ ์ฝ๋๋ฅผ ๋ ๋๋งํ์ต๋๋ค.
Vue๋ ์๋ฐ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํ๋ i18n ๊ธฐ๋ฅ์ ๋๋ค.
์ด๊ฒ์ ๋ค์ ๋งค์ฐ ๋ ผ์์ ์ฌ์ง๊ฐ ์์ต๋๋ค. ํฌ๊ด์ ์ธ i18n ์ง์์ ๋งค์ฐ ๋ณต์กํ ์ ์์ผ๋ฉฐ IMO๋ Vue์ ์ํ์ง ์์ต๋๋ค. ํนํ ๋๋ถ๋ถ์ ์ฌ์ฉ์๊ฐ ํ์ํ์ง ์์ ๋๋ ๋์ฑ ๊ทธ๋ ์ต๋๋ค.
์ด์ ์ด๊ฒ์ ์ ๊ธฐํ๊ณ ์ถ์ต๋๋ค. Vue์ ๋ค๋ฅธ ํ ํ๋ฆฟ/ํ๋ ์์ํฌ๋ฅผ ๋น๊ตํ ๋๋ง๋ค ๋ช ์ฌํด์ผ ํ ์ค์ํ ์ฌํญ์ด ํ๋ ์์ต๋๋ค. Django/Laravel/Twig์ ๋ฌ๋ฆฌ Vue๋ ๋ณธ์ง์ ์ผ๋ก ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ฏ๋ก ์ต๋ํ ๊ฐ๋ฒผ์์ผ ํฉ๋๋ค. ์์ "์ ์ฉ์ฑ" ๋๋ "์ฐ์ํจ"์ ์ํด "๊ธฐ๋ฅ" ๋ฐ "์ ํธ๋ฆฌํฐ"๋ฅผ ์ถ๊ฐํ๋ ๋์ ๋ชจ๋ _core_ ๊ธฐ๋ฅ์ ์ ์งํ๋ฉด์ ์ถฉ๋ถํ ๋จ์ํ๊ฒ ์ ์งํ๋ ๊ฒ์ด ๋ ํฉ๋ฆฌ์ ์ ๋๋ค. ํต์ฌ ๊ธฐ๋ฅ ์ด์ธ์ ๋ค๋ฅธ ๊ฒ์ ์ํ๋ค๋ฉด ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๊ฑฐ๋ ์ง์ ๊ฐ๋ฐํ๋ ๊ฒ์ด ๋ ์ ํธ๋ฉ๋๋ค. ์ด๊ฒ์ ์๋ก ๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ณผ ์ ์๋ SPA์ ๊ฒฝ์ฐ i18n/currency๊ฐ ๋ผ์ฐํฐ๋ ์ํ ๊ด๋ฆฌ์๋ณด๋ค ๋ ์ค์ํฉ๋๊น? ๋๋ ๊ทธ๋ ๊ฒ ์๊ฐํ์ง ์๋๋ค. ๊ทธ๋ฌ๋ vue-router์ vuex๋ Vue์ ์ํ์ง ์๊ณ ์์ฒด ์ ์ฅ์๊ฐ ์์ต๋๋ค. ์ฆ, Vue๋ ์ ์ง์ ์ ๋๋ค.
๊ทธ๋ฐ ํ๋ฌ๊ทธ์ธ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์๋ ค์ฃผ์๋ฉด i18n ํ๋ฌ๊ทธ์ธ๋ ๋ง๋ค์ด ๋๋ฆฌ๊ฒ ์ต๋๋ค. ๋๋ ์ด๊ฒ์ ๊ด์ฌ์ด ์์ต๋๋ค!
๋ ํฉ๋ฆฌ์ ์ธ ์ ๊ทผ์ด๋ผ ์๊ฐํ๊ณ ๋ง์ ๊ด์ฌ ๋ถํ๋๋ฆฝ๋๋ค :)
์ผ๋ถ ์์ญ์์ i18n์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ)) ์๋ฆ๋ค์์ ์ํด ์ฝ๋์ ๋ค์ด๊ฐ์ ์๋์ผ๋ก ๋ช ๊ฐ์ง ์ด๋ฆ์ ๋ณ๊ฒฝํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์๋ฅผ ๋ค์ด: ๋ถ๊ณผ ๋ช ์๊ฐ ์ ์ butstrap.datepikker๊ฐ ํ์ํ์ต๋๋ค. - ๊ทธ๋ฐ ๊ฐ๋ฅ์ฑ์ด ์์์๋ ๋ถ๊ตฌํ๊ณ i18n์ ์ฐ๊ฒฐํ์ง ์์ต๋๋ค. ๋น ๋ฅธ 60์ด. "์๋์ผ๋ก"๋ ์์ผ๊ณผ ์์ ์ด๋ฆ์ ๋ชจ๋ ๋์ฒดํ์ต๋๋ค. ))
@phanan - ๊ทํ์ ์ฃผ์ฅ์ด "ํ๋ฌ๊ทธ์ธ"์ ์ธ๊ธํ ์ด์ ์ ๋๋ค. ๋ชจ๋ ์ฌ๋์ด ํตํ ๋๋ i18n ๊ธฐ๋ฅ์ ์ํ์ง ์๊ณ ์ฑ์ ๊ฐ๋ณ๊ฒ ์ ์งํ ์ ์๋ ๊ธฐ๋ฅ์ ์ํ ๊ฒ์ด๋ผ๋ ์ ์ ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ํ ํ๋ฆฟ ์์คํ ์ผ๋ก์ (์ด๋ ์ง๊ทนํ ์ ๊ฐ์ธ์ ์ธ ์๊ฒฌ์ ๋๋ค) Vue๋ ์ด๋ฌํ ํ์ค ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ด์ผ ํฉ๋๋ค. ๋. ๋ ์ค์ํ ๊ฒ์ ๋ชจ๋ ์ฌ๋์ด i18n ๋๋ ํตํ ํํฐ ๊ตฌ์ฑ ์์ ํ ์ ์ฌ๋ฐ๋ช ํด์ผ ํ๋ ๊ฒ์ ์๋๋ผ๋ ์ ์ ๋๋ค. ์ฆ, Vue-Router ๋ฐ Vuex๊ฐ Vue์ ์ถ๊ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒ์ฒ๋ผ ํตํ ๋ฐ i18n๊ณผ ๊ฐ์ ๋ง์ ํ์ค ํํฐ๋ ์ถ๊ฐ๋ ์ ์์ต๋๋ค.
์, ๊ทธ๋ฆฌ๊ณ ํฅ๋ฏธ๋กญ๊ฒ๋ Angular์๋ i18n์ด ๋ด์ฅ๋์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
https://docs.angularjs.org/guide/i18n
Angular๋ ๋ ์ง, ์ซ์ ๋ฐ ํตํ ํํฐ์ ๋ํด i18n/l10n์ ์ง์ํฉ๋๋ค.
Ember์ React๋ "๊ฐ๋ฐ์๊ฐ ์์์ ํ๋๋ก ๋ด๋ฒ๋ ค๋๋" ๋ฐฉ์์ ํํ ๊ฒ ๊ฐ์ต๋๋ค.
ํฅ๋ฏธ๋ก์ด ๋น๋์ค.
https://www.youtube.com/watch?v=Sla-DkvmIHY
Vue๋ FormatJS์์ ํตํฉ๋ง ํ์ํ ๊น์? ๋ทฐ ๊ตญ์ ? :์๋ค:
ํธ์ง: ๊ทธ๋ ๊ฒ ๊ฐ๋จํ ์ ์์ต๋๋ค. https://github.com/learningequality/vue-intl/blob/master/index.js
์ค์ฝง
Angular์๋ i18n์ด ๋ด์ฅ๋์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
Angular๋ ๋ํ ng-router์ ํจ๊ป ์ ๊ณต๋๋ฉฐ, ๋ด๊ฐ ๋ค์ ๋ฐ์ ๋ฐ๋ฅด๋ฉด ng-community๋ ui-router๋ฅผ ์ ํธํ์ฌ ๊ธฐํผํฉ๋๋ค.
์ด์ Angular ํ์ด ng-router๋ฅผ ui-router๋ก ๊ต์ฒดํ๋ฉด ๋ธ๋ ์ดํน ์ฒด์ธ์ง์ ๊ณ ํต์ด ๋ฐ๋ฆ ๋๋ค.
ng-router๋ฅผ ๊ฐ์ ํ๋ ค๊ณ ํ๋ฉด ๋ ๋์ ์๋ฃจ์ (ui-router)์ด ์ด๋ฏธ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์๊ฐ์ ๋ญ๋นํ๊ณ ์์ต๋๋ค.
Vue๊ฐ ์ฝ์ด์์ i18n, ํตํ ๋ฑ์ ์ง์ํ๊ธฐ ์์ํ๋ค๋ฉด ๋์ผํ ์ํฉ์ด vue์๋ ๋ฐ์ํ ๊ฒ์ ๋๋ค.
๋ด์ฅ ํํฐ๊ฐ ํธ๋ฆฌํ๋ค๊ณ ์๊ฐํ์ง๋ง ์ด ๋ฌธ์ ์ ๋ํด์๋ vuejs ํ์ ๋์ํฉ๋๋ค..
๊ทธ๋ฐ ๋ค์ ์ฐ๋ฆฌ๋ Vue ์ฝ์ด์ ์๋ ํํฐ์ ๋ชจ๋ ๋์ํฉ๋๋ค. ๋๋ ๋ํ ์ค์ ๋ก ๊ตฌ์ฑ ์์ํ์ ํฌ์ ๋๋ค. ๊ทธ๋ฐ๋ฐ Vue๋ ํํฐ๋ ์ฝ์ด ํ๋ฌ๊ทธ์ธ์ผ๋ก ์ ๊ณตํ ์ ์๋์? Vuex ๋ฐ Vue-Router์ฒ๋ผ?
์ค์ฝง
๊ทธ๋ฐ๋ฐ Vue๋ ํํฐ๋ ์ฝ์ด ํ๋ฌ๊ทธ์ธ์ผ๋ก ์ ๊ณตํ ์ ์๋์? Vuex ๋ฐ Vue-Router์ฒ๋ผ?
์ด๊ฒ์ด ๋ฐ๋ก @blake-newman์ด ์ด์ ์ ๊ณต์ ํ ๋ด์ฉ์ ๋๋ค.
์๋
ํ์ธ์: ์ต์ข
๊ฒฐ์ ํ์ด์ง์์ ํ
์คํธ์ ๋ํ ํํฐ๋ง ํ์ฉํ๋ ๊ฒ์ผ๋ก ํ์๋จ
{{}} ํ์(v-ํ
์คํธ)
v-for="item of list | sortBy"์ ๊ฐ์ ๋ค๋ฅธ ํํ์์๋ ์ ์ฉ๋์ง ์์ต๋๋ค.
์๋๋ฉด ์ ๊ฐ ์๋ชป ์ดํดํ ๊ฑด๊ฐ์?
๋ด ๋ง์ 1.0์์์ ๊ฐ์ด ํํฐ๋ฅผ ๊ณ์ ์ฌ์ฉํ์ง๋ง ํ๋์ ํํฐ๋ง ์ ํํ๋ค๋ ๊ฒ์
๋๋ค.
ํํ ๋น
2016๋ 5์ 1์ผ ์ผ์์ผ ์คํ 10์ 24๋ถ์ Phan An [email protected] ์ด ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
@tomsmithgroup https://github.com/tomsmithgroup ์ ์ํ์ ๋ด์ฉ
(๊ทธ๋ฆฌ๊ณ ๊ทธ ์ด์)์ด ๊ฒฐ์ ๋์์ต๋๋ค
https://github.com/vuejs/vue/issues/2756#issuecomment -215868244
2.0์์ ๊ณ์ ์ง์๋ฉ๋๋ค.โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ์ธ์.
https://github.com/vuejs/vue/issues/2756#issuecomment -216093937
@yyx990803 ๋ต๋ณ ์์ ์๋ฐฉํฅ ํํฐ๊ฐ 2.0์์ ์ง์๋์ง ์์ ๊ฒ์ด๋ผ๊ณ ๊ฒฐ๋ก ์ ์ด๋ ๋ ๊น์?
@fnlctrl ๋ง์ต๋๋ค. ์์ ์ ๊ตฌ์ฑ ์์๋ฅผ ๊ตฌ์ถํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
์ฃผ์ ์์ ์กฐ๊ธ ๋ฒ์ด๋๊ฒ ์ต๋๋ค. ์ด ์๋ฐฉํฅ ํํฐ๊ฐ ์ค์ ๋ก ํ๋ก๋์
์์ ๊ทธ๋ ๊ฒ ์ ์ฉํ๊ฐ์?
๋ด ๋ง์, ์ฌ์ฉ์๊ฐ ์
๋ ฅ์ ์๋ฌด ๊ฒ๋ ์
๋ ฅํ์ง ์๊ณ ํ๋ฆฌ๊ฒ ์ฒ๋ฆฌํ ํ ๋ค์ ํฌ๋งทํ๋๋ก ํ๋ ๊ฒ์ด ์ ๋ง ๊ด์ฐฎ์ต๋๊น?
์ฐ๋ฆฌ ๋น์ฆ๋์ค ํ์ ํญ์ ๋ค์ ๊ณผ ๊ฐ์ด ํ๋ํ๋๋ก ์
๋ ฅ์ ์๊ตฌํฉ๋๋ค. ์๋ฌด ๊ฒ๋ ์๋ชป ์
๋ ฅํ๋ฉด ์ ๋ฉ๋๋ค. ๊ทธ๋์ ์ง๊ธ๋ Vue
๋ฅผ ์ฌ์ฉํ์ฌ ์ฆ๊ฐ์ ์ธ ์๋ฐฉํฅ ๋ณ๊ฒฝ์ด ๋ ์ด์ ์ฌ์ฉ๋์ง ์๊ธฐ ๋๋ฌธ์ ํด๋น ๋ชฉ์ ์ผ๋ก jquery.inputmask๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ ๋ง์, ๊ทธ ์๋ฐฉํฅ ํํฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๊น? ์๋๋ฉด ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ์ง๋์น๊ฒ ์๊ฐํ๋ ๊ฒ์
๋๊น? :)
@fullfs ์๋ฐฉํฅ ํํฐ๋ ํธ์๋ฅผ ์ํด ํ๋ก๋์
์ฑ(๋ง์ <input>
s)์์ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉ๋์ง๋ง ์ง๊ธ ๋ณด๋ ๊ฐ์ด ํ์๋๊ธฐ ์ ์ ํ ๋ฒ๋ง ํํฐ๋งํ๋ ๋์ ์ค์๊ฐ์ผ๋ก ๊ฐ์ ํํฐ๋งํ๋ ์ด์ ๋ ์๋ฒ์ POST๋ฅผ ๋ณด๋ด์
จ๋์? ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ๋ ๋ฐ ์๊ฐ์ด ์ข ๊ฑธ๋ฆฌ๊ฒ ์ง๋ง ๋์น์ง ์์ ๊ฒ ๊ฐ์์ :D
UI์ ๋๊ด์ ์ ๋ฐ์ดํธ (์ค๋๋ IMHO, ํนํ ๋ชจ๋ฐ์ผ์ ํ์ค์)๋ฅผ ์ํ๋ฉด ์ ๋ ฅ์ด ์ ๊ณต๋ ์์ ์ ์ค์ ๋ก ์ ์ ํ๊ฒ ํ์์ด ์ง์ ๋ ์ ๋ ฅ์ ์ํ ๊ฒ์ ๋๋ค.
์ค์ฝง
2way ํํฐ๋ vue์์ ์ ๋ง ์ข์ต๋๋ค. ํํฐ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ฌ์ฉํ์ง ์๊ณ ์ธ์ ๋ ์ง ์ฌ์ฉ์ ์ง์ ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋ค ์ ์์ง๋ง ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ ์ฐ์ฑ์ ์ ๊ณตํด์ผ ํ์ง๋ง ์์ ์ ์ํํ๋ ๋ ๋น ๋ฅด๊ณ ํธ๋ฆฌํ ๋ฐฉ๋ฒ๋ ์ ๊ณตํด์ผ ํฉ๋๋ค. ์๋ฐฉํฅ ํํฐ๋ฅผ ํฌํจํ๋ฉด ์ฌ๋๋ค์ด ํ์ํ ๊ฒฝ์ฐ ์์ฒด ๊ตฌ์ฑ ์์๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ ๋ง์ ์ ์์ง๋ง ๊ธฐ์กด ๊ธฐ๋ฅ์ด ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์๊ตฌ ์ฌํญ์ ๋ง์ ๋ ๋ ๋น ๋ฅธ ๊ฐ๋ฐ์ ํ์ฉํฉ๋๋ค. ํญ์ API ํ๋ฉด๊ณผ ํธ์์ฑ ์ฌ์ด์ ์ ์ถฉ์์ ๋๋ค. ๊ท ํ์ ์ฐพ์์ผ ํ๊ณ Vue์๋ ์ด๋ฏธ ํ๋ฅญํ ๊ท ํ์ด ์์์ต๋๋ค. ํํฐ๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ ๊ท ํ์ ์ฌ๋ฐ๋ฅธ ์ง์ ์์ ํ ๋ฐ์ง ๋ค๋ก ๋ฌผ๋ฌ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์์์ง์ง๋ง ์ด๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ํ๋ก์ ํธ์ ์ฝ๋๋ฒ ์ด์ค์ ์์ฉ๊ตฌ๋ ์ปค์ง๋๋ค.
ํํฐ๊ฐ ์ค์ ๋ก ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๊ฒฝ์ฐ ์ฌ์ด ๋ฐฉ๋ฒ์ผ๋ก v-model ์ง์๋ฌธ์ ๋ํ ํ์ ๋ฐ ํฌ๋งทํฐ๋ฅผ ์ง์ ํ ์ ์๋ ๋์์ ์ ๊ณตํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ํํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๊ณต๋ @yyx990803 ์์ ์ ์ด ๋ถ๋ถ๋ง ์์ฑํ ์ ์์ต๋๋ค.
const CurrencyInput = CustomInput.extend({
methods: {
parse(val) {
var number = +val.replace(/[^\d.]/g, '')
return isNaN(number) ? 0 : number
},
format(val) {
return '$' + Number(val).toFixed(2)
}
}
})
์๋ฐฉํฅ ํํฐ๊ฐ ์์ผ๋ฉด ์์ฑํด์ผ ํฉ๋๋ค.
const CustomInput = Vue.extend({
template: `
<input type="text"
@focus="onFocus"
@blur="onBlur"
@input="onInput"
@change="setDisplayValue">
`,
props: ['value'],
watch: {
value() {
if (!this.focused) {
this.setDisplayValue()
}
}
},
ready() {
this.setDisplayValue()
},
methods: {
onInput() {
this.$emit('input', {
target: {
value: this.parse(this.$el.value)
}
})
},
onFocus() {
this.focused = true
},
onBlur() {
this.focused = false
this.setDisplayValue()
},
setDisplayValue() {
this.$el.value = this.format(this.value)
}
}
})
๋ฐ๋ผ์ ์ ์ฐ์ฑ์ด ํฅ์๋์ง๋ง ๋์ผํ ๊ฒฐ๊ณผ์ ๋ํด ๋ ๋ง์ ์ฝ๋๊ฐ ํ์ํฉ๋๋ค.
@aristidesfl - ํํฐ๊ฐ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ถ๋ถ์ ์ผ๋ก ์ ํฌ์์ ์น๋ฆฌํ์ต๋๋ค. ใ ใ ใ ! ํ ์คํธ ๋ณด๊ฐ์๋ง ์ฌ์ฉํ๋๋ก ์ ํ๋ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ์ญ์์ค: https://github.com/vuejs/vue/issues/2873
์ค์ฝง
@smolinari ๊ฐ์ฌ
๋ค์ ์ค์ธ์! ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ํ์๋ก ํฉ๋๋ค. ๋๋ ๋น์ ์ด ๋งํ ๋ชจ๋ ๊ฒ์ ๋์ํฉ๋๋ค. ํ์ง๋ง ๋๋ฌด ์ฝ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ฒ์ผ๋ฅธ ์ฌ์ฉ์์ ๋๋ค. ์ฐ๋ฆฌ๋ ๊ฒ์ผ๋ฅด๊ณ ์ฌ์ด ๋ฐฉ๋ฒ์ ์ํ ๋ฟ์ ๋๋ค. ์ ์ง์ฒ๋ผ.
์ฌ์ฉ์ ์ ์ v-model ์์ ์๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ด ์์ ์ ์์ต๋๋ค(http://rc.vuejs.org/guide/forms.html#Modifiers).
์๋ฐฉํฅ ํํฐ์ฒ๋ผ ์๋ํฉ๋๋ค.
@ecmel์ด ๋์ํ์ต๋๋ค. ์ด๊ฒ์ด ๊ฐ ๊ธธ์ ๋๋ค.
๊ทธ๋ฐ ๋ค์ ๊ธฐ๋ฅ ์์ฒญ ๋ฌธ์ ๋ฅผ ์ฝ๋๋ค. :)
@ecmel ๋น์ทํ ์์ด๋์ด๊ฐ ์ ํ ์์ ์๋ก ์ค๋ช ๋์์ง๋ง ์ฌ๊ธฐ ์์ ๋ ผ์
@rpkilby ํด๋น ํ ๋ก ๋ ์ข ๋ฃ๋์์ต๋๋ค. ๋ง์ถคํ v-model ์์ ์๋ฅผ ์ํ ์ ํ ๋ก ์ ์ด์ด์ผ ํ ์๋ ์์ต๋๋ค.
๋ ์ด์ ํ ์ ์์:
<span :title="item.Modified | date('dd-mmmm-yyyy H:MM:ss')">{{item.Modified | date('dd-mmmm-yyyy')}}</span>
ํํฐ๋ฅผ {{ }}
๋ก ์ ํํ๋ ๊ฒ์ด ์ด์ํด ๋ณด์
๋๋ค. ์์ฑ ๋ฐ์ธ๋ฉ์์ ํํฐ๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค(prop๋ฅผ ์ ๋ฌํ์ง ์์). ์ด์ ๋ ์ด์ ์์ฑ์์ {{ }}
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. !
@LinusBorg ์คํ https://github.com/vuejs/vue/issues/3666
ํํฐ๋ฅผ
{{ }}
์ ํํ๋ ๊ฒ์ด ์ด์ํ๊ฒ ๋ณด์ ๋๋ค. ์์ฑ ๋ฐ์ธ๋ฉ์์ ํํฐ๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ๊ฒฝ์ฐ๊ฐ ๋ง์ผ๋ฉฐ(prop๋ฅผ ์ ๋ฌํ์ง ์์) ๋ ์ด์ ์์ฑ์์{{ }}
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. !
๊ทธ๊ฒ๋ค์ ๊ณ์ฐ๋ ์์ฑ๊ณผ ๋ฉ์๋๋ก ์ฝ๊ฒ ๋์ฒด๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ ๊ฑฐ๋์์ง๋ง ๋ ์ ํ๋ API๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
๊ทธ๋์:
์์ผ๋ก ์์ฌ ์ฝ๋:
<!-- method, suitable in v-if -->
<span :title=" date(item.Modified, 'dd-mmmm-yyyy H:MM:ss')>
<!-- computed prop, more suitable for single values -->
<span :title="formattedModified">
<script>
computed: {
formattedModified () { return date(this.item.Modified, 'dd-mmmm-yyyy H:MM:ss') }
}
</script>
์ฃ์กํฉ๋๋ค. ์ ๋ "์ ๊ท"์ผ ๋ฟ์
๋๋ค.
๊ทธ๋ฌ๋ ํํฐ๊ฐ ์๋ Angular 1์์ ์ค๋ ๊ฒ์ ์ ๋ง ์ด์ํ๊ณ ์ง๊ด์ ์ด์ง ์์ต๋๋ค. ๋ชจ๋ ๊ฐ๋ฐ์๊ฐ ์์ฒด ํํฐ ์ธํธ๋ฅผ ๊ฐ๋ฐํ๊ณ ๊ณ์ฐ๋ ํญ๋ชฉ ๋ฑ์ ์์ฒด์ ์ผ๋ก ์ค์ ํ๋ ๊ฒ์ด ๋น๋ํ๋ ๊ฒ๋ณด๋ค ๋ ๋์ ์ด์ ๋ ๋ฌด์์
๋๊น?
์ด์ ์์์ ๊ฐ์ฒด๋ณ๋ก ์ ๋ง ํฐ ๋ฐฐ์ด์ ํํฐ๋งํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. Angular์ ๊ฒฝ์ฐ ์ด๊ฒ์ ํ ์ค์ ์ฝ๋์ ๋ถ๊ณผํ์ต๋๋ค. ๊ฒ์ ์
๋ ฅ์ ์ํด ๋ฐฐ์ด์ ํํฐ๋งํ๋ ๊ฒ์ด ๊ฐ๋ฅํ์ผ๋ฉฐ ํ๋ ์์ํฌ์ ๊ธฐ๋ฅ์ด์ด์ผ ํ๋ ๋ชจ๋ ๋ง๋ฒ์ ์ํํ ๊ฒ์
๋๋ค.
์ด์ ์ ๋ง ํฐ ๋ฐฐ์ด์ ํํฐ๋งํ๋ ๋ชจ๋ฒ ์ฌ๋ก๋ก ๊ฐ์ฃผ๋๋ ๊ฒ์
์ ๋ง ํฐ ๋ฐฐ์ด์ด๋ ๋ฌด์์ ๋๊น? ์ด๋ก ์ ์ผ๋ก ๊ณ์ฐ๋ ์์ฑ์ ํํฐ๋ง์๋ ์ ์ฉํฉ๋๋ค.
https://jsfiddle.net/sat25z51/3/
๋ชจ๋ ๊ฐ๋ฐ์๊ฐ ์์ ์ ํํฐ ์ธํธ๋ฅผ ๊ฐ๋ฐํ๊ณ ๊ณ์ฐ๋ ํญ๋ชฉ ์์ฒด๋ฅผ ์ค์ ํ๋ ๊ฒ๋ณด๋ค ๋น๋ํ๋ ๊ฒ๋ณด๋ค ๋ ๋์ ์ด์ ๋ ๋ฌด์์ ๋๊น?
๋๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๊ฐํ๊ณค ํ์ง๋ง(๊ทธ๋ฆฌ๊ณ ์ ์ค๋ ๋๋ฅผ ์์ํ๋์ง), ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฌํ ์ข ๋ฅ์ ํํฐ๋ฅผ ์ค์ค๋ก ๋ง๋๋ ๊ฒ์ ์์ ์ฃฝ ๋จน๊ธฐ์ด๋ฉฐ ๊ฐ ๊ฐ๋ฐ์๊ฐ ์ํ๋ ๊ฒ์ด ๋๋ฌด ๋ง๋ค๋ ๊ฒ์ ์๊ฒ ๋์๊ธฐ ๋๋ฌธ์ ํํฐ(๋๋ ๊ณ์ฐ๋ ์์ฑ)๋ก์, ํํฐ๋ฅผ ๋ด์ฅํ์ง ์๋ ๊ฒ์ด ๊ทธ๋ ๊ฒ ํฐ ๋ฌธ์ ๊ฐ ์๋๋ผ๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค.
์ค์ฝง
์ ๊ฒฝ์ฐ์๋ Firebase ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ ๊ณตํ๋ json์ >10.000์ค๊ณผ ๊ฐ์ต๋๋ค.
๋๋ ๋น์ ์ด ๊ทธ๋ ๊ฒ ์๊ฐํ๋ ์ด์ ๋ฅผ ์๊ณ ๊ธฐ๋ฅ์ ์ญ์ ํ๊ธฐ๋ก ๊ฒฐ์ ํ์ง๋ง ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๊ฐ๋ฐ์์๊ฒ๋ ์๋นํ ๋ฒ๊ฑฐ๋ก์ด ์ผ์
๋๋ค.
๋ฐ์ด์ฌ๋ฆฐ์ด ๋ด ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ์ธ๋ผ์ธ๋๋๋ก ํฌํฌํ์ต๋๋ค.
https://jsfiddle.net/nw5yhLwv/
๊ทธ๋์ ๋ด ๊ฐ์ฒด์ ๊ฒ์ ๋ฌธ์์ด์ ์์ผ๋ก ์ฝ๋ฉํด์ผ ํฉ๋๊น?
๋๋ ๋น์ ์ ์ง๋ฌธ์ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ์ฃ์กํฉ๋๋ค. ๋ฐ์ด์ฌ๋ฆฐ์ ๋ด๊ฐ ๊ฒ์ ํ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
์ค์ฝง
๊ณ์ฐ ๋ ํํฐ
ํํฐ๋ (๋ฉ์๋์ฒ๋ผ) ๋ชจ๋ ๋ ๋์ ๋ํด ๊ณ์ฐ๋๊ณ ๊ณ์ฐ๋ ์์ฑ์ ์ผ์ดํฌ์ฒ๋ผ ์ฝ๊ณ ํ์ํ ๋๋ง ๋ค์ ๊ณ์ฐ๋๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ์ข์ง ์์ ์ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ฒฐ๊ณผ๊ฐ ์บ์๋์ด Vue๊ฐ ๋ ์๊ฐ ์ ์์ต๋๋ค.
์ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ๋ ๋ค ๊ฐ์ง๊ณ ์์ต๋๋ค. ๐
์ค์ฝง
์ด๋ด, ๋๋ ์ฝ๊ฐ์ ๋ง์ง์ ๊ฑฐ๋ฆฌ๊ณ ์ด์ ์ดํด๊ฐ ๊ฐ๋ค. ๊ทธ๊ฒ์ ํ๋ฅญํ ๊ฐ๋ ์ด๋ค! ๐
์ด์ ๋ํ ๋ ผ์๊ฐ ์ค๋ซ๋์ ๋๋ฌ๊ธฐ ๋๋ฌธ์ ์ง๊ธ ์ด ์ค๋ ๋๋ฅผ ์ ๊ธ ๊ฒ์ ๋๋ค. Vue 2.0์ด ์ถ์๋ ์ง ๋ช ๋ฌ์ด ์ง๋ฌ๊ณ ํํฐ ์ ํ์ ๋ํ ๋นํ์ด ํฌ๊ฒ ๊ฐ๋ผ์์์ต๋๋ค.
์ด ์ค๋ ๋์์ ๋ ์ด์์ ๋ ผ์๋ ์์ฐ์ ์ด์ง ์์ต๋๋ค. ํ ๋ก ์ด ํ์ํ๋ค๊ณ ์๊ฐ๋๋ ์ฃผ์ ์ ๋ํ ์๋ก์ด ๊ด์ ์ด ๋ณด์ด๋ฉด ์ ๋ฌธ์ ๋ฅผ ์ด์ด์ฃผ์ธ์.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ต์ข ๊ฒฐ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
html {{ date | formatDate('YY-MM-DD') }}