Vue: [์ œ์•ˆ] Vue 2.0 - ํ•„ํ„ฐ๋ฅผ ๋‹ค์‹œ ๊ฐ€์ ธ์™€์ฃผ์„ธ์š”

์— ๋งŒ๋“  2016๋…„ 04์›” 28์ผ  ยท  116์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: vuejs/vue

์•ˆ๋…•,

Gitter ์ฑ„ํŒ…์—์„œ ๋œจ๊ฑฐ์šด ํ† ๋ก ์ด ์žˆ์—ˆ๊ณ  2.0์—์„œ filter ๊ธฐ๋Šฅ์ด ๋ˆ„๋ฝ๋œ ์‚ฌ๋žŒ๋“ค ์— ๋Œ€ํ•œ ํฌ๋Ÿผ์˜ ๋ฉ‹์ง„ ๊ฒŒ์‹œ๋ฌผ์ด ์žˆ์œผ๋ฉฐ ์‹ค์ œ๋กœ ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๊ธ์ •์ ์ธ ๋ฐฉํ–ฅ์ด ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ €๋Š” ํ•„ํ„ฐ๋ฅผ 2.0์œผ๋กœ ๋˜๋Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ์ด ์ œ์•ˆ์„ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ•„ํ„ฐ๊ฐ€ ๋„ˆ๋ฌด ์‚ฌ๋ž‘๋ฐ›๊ณ  ๋˜‘๋˜‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ํ•„ํ„ฐ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ฃผ์žฅ์ž…๋‹ˆ๋‹ค(๋‹ค์–‘ํ•œ ํ† ๋ก ์—์„œ ์ˆ˜์ง‘๋˜์—ˆ์œผ๋ฉฐ ์ •ํ™•์„ฑ์— ๋Œ€ํ•œ ๋ณด์žฅ์€ ์—†์Œ).

  • ํ…œํ”Œ๋ฆฟ์—์„œ ๋” ์ฝ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

thing in things | filterBy 'foo' | orderBy 'bar' | limitBy 5

๋‹จ์ˆœํžˆ ์ฝ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํ•„ํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•˜๋ฉด ์‹ค์ œ๋กœ ์˜ˆ์ƒํ•ด์•ผ ํ•˜๋Š” ๋‚ด์šฉ์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

  • ํ•„ํ„ฐ๋Š” ์ „์—ญ์ ์ด๋ฉฐ ํ…œํ”Œ๋ฆฟ/๋ณด๊ธฐ ์‹œ์Šคํ…œ์—์„œ ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค. ํ†ตํ™”๋Š” ํ˜ธ์ถœ๋งŒ ํ•˜๋ฉด ๋ชจ๋“  ๊ณณ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ›Œ๋ฅญํ•œ ํ•„ํ„ฐ์˜ ๊ฐ„๋‹จํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค.
  • ํ•„ํ„ฐ๊ฐ€ ์—†์œผ๋ฉด ์ˆ˜๋งŽ์€ ์ƒ์šฉ๊ตฌ๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค.
  • ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ์ฒญํ•œ ๋†ˆ์ด ๋” ๋นจ๋ฆฌ ๋ฐฐ์šฐ๊ณ  Vue๋กœ ๋น ๋ฅด๊ณ  ๋ฉ‹์ง„ ์Šน๋ฆฌ ๊ฒฝํ—˜์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ž์ฒด ์ œ์ž‘ํ•œ "ํ•„ํ„ฐ"๋ฅผ ํฌํ•จํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ์— ๋ฏน์Šค์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋งํ•  ํ•„์š”๋„ ์—†์ด ์—”์ง€๋‹ˆ์–ด๋ง ๊ด€์ ์—์„œ ํ•„ํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๊ฐ•๋ ฅํ•œ ์ฃผ์žฅ์ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด ์Šค๋ ˆ๋“œ๊ฐ€ ์ฐฌ๋ฐ˜ ์–‘๋ก ์ด ๋˜๊ณ  ํ•„ํ„ฐ ๋ฐ˜ํ™˜์— ๋Œ€ํ•œ ์ฐฌ์„ฑ ๋˜๋Š” ๋ฐ˜๋Œ€ ํˆฌํ‘œ๋ฅผ ์ œ์•ˆํ•˜๋Š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šค์ฝง

discussion

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ตœ์ข… ๊ฒฐ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ํ•„ํ„ฐ๋Š” ์ง€์›๋˜์ง€๋งŒ ํ…์ŠคํŠธ ๋ณด๊ฐ„ ๋‚ด๋ถ€์—์„œ๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ๋กœ์ง์„ JavaScript ๋žœ๋“œ์— ์ ์šฉํ•˜๋ฉด์„œ ํ…์ŠคํŠธ ํ˜•์‹ํ™” ๋ชฉ์ ์œผ๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.
  2. Vue 2.0์€ ๋‚ด์žฅ ํ•„ํ„ฐ ์—†์ด ๋ฐฐ์†ก๋ฉ๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ž์ฒด ํ•„ํ„ฐ ํŒฉ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ํ•„ํ„ฐ ๊ตฌ๋ฌธ์€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜๋Š” ๋Œ€์‹  ์ธ์ˆ˜์— ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด JavaScript ๋ฐ ๊ธฐํƒ€ ์ธ๊ธฐ ์žˆ๋Š” ํ…œํ”Œ๋ฆฟ ์–ธ์–ด(Jinja2, swig, twig...)์™€ ๋” ์ธ๋ผ์ธ๋ฉ๋‹ˆ๋‹ค.

html {{ date | formatDate('YY-MM-DD') }}

๋ชจ๋“  116 ๋Œ“๊ธ€

์›๋ž˜ 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 ๋ฐฉ์‹์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

์ƒ์šฉ๊ตฌ ๋ฌธ์ œ์— ๊ด€ํ•ด์„œ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1. ๋ช…์‹œ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ/๋‚ด๋ณด๋‚ด๊ธฐ

์œ„์—์„œ ์„ค๋ช…ํ•œ @raywill ์ฒ˜๋Ÿผ. ์ข€ ๋” ์žฅํ™ฉํ•˜์ง€๋งŒ ์ด์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์ž‘๋™ ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด Vue์˜ ํ•„ํ„ฐ ๋ฌธ์„œ๋ฅผ ์กฐํšŒํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์˜ ์ถœ์ฒ˜์™€ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์€ ๋งค์šฐ ๋ช…์‹œ์ ์ž…๋‹ˆ๋‹ค.
  2. ํ•จ์ˆ˜ ์ž์ฒด๋Š” JavaScript์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋งŒ์งˆ ์ˆ˜ ์—†๋Š” ๋‚ด์žฅ ํ•„ํ„ฐ์™€ ๋‹ฌ๋ฆฌ ํŠน๋ณ„ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋งž๊ฒŒ ๋ณ€๊ฒฝ/๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ๋ฉ”์„œ๋“œ, ๊ณ„์‚ฐ ์†์„ฑ ๋ฐ JavaScript๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ชจ๋“  ๊ณณ์—์„œ ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ์™€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. Vue.prototype

Vue.prototype.filters = {
  filterBy: ...,
  orderBy: ...
}
<ul v-for="word in filters.filterBy(words, userInput)">
    <li>{{word}}</li>
 </ul>

3. ๊ธฐ๋Šฅ ์ „ํ™˜(๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž์šฉ)

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๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ฃผ์žฅ์€ ๋…ผ์™ธ๋กœ ๋‚˜์™”์ง€๋งŒ ์™œ ๊ทธ๊ฒƒ์ด ํ•„์š”ํ•œ์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋””์ž์ด๋„ˆ๋กœ์„œ ๋‚˜๋„ ๋” ๋‚˜์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ๊ณ  ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•„๋ฆ„๋‹ต๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :์›ƒ๋‹ค:

์Šค์ฝง

๋‹ค์Œ์€ ์—ฐ๊ฒฐ์— ๊ด€ํ•œ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ํ•„ํ„ฐ๋Š” ์ฃผ๋กœ ๋‘ ๊ฐ€์ง€ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  1. ์„œ์‹ ํ…์ŠคํŠธ;
  2. ๋ฐฐ์—ด ์ฒ˜๋ฆฌ.

ํ…์ŠคํŠธ ์„œ์‹์˜ ๊ฒฝ์šฐ 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

  1. ํ…œํ”Œ๋ฆฟ์— ๋…ผ๋ฆฌ๋ฅผ ๋œ ๋„ฃ์–ด์•ผ ํ•œ๋‹ค๊ณ  ๋ถ„๋ช…ํžˆ ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹น์‹ ์ด ์ข‹๋“  ์‹ซ๋“  ๋‚ด ์˜๊ฒฌ์ž…๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ๋™์˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ถŒ์žฅ๋˜๋Š” ๋ชจ๋ฒ” ์‚ฌ๋ก€์— ๋ฐ˜๋Œ€ํ•˜์—ฌ ์ž‘์—…ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‚˜๋Š” ๋‹น์‹ ์„ ๋„์šธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  2. ์ฃผ์–ด์ง„ (1) - ๋ณต์žกํ•œ ๋…ผ๋ฆฌ๋Š” JavaScript์—์„œ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ๊ฒฐ์ด ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค.
  3. ๋˜ํ•œ ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์˜ˆ๋„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.
  4. ์›ํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ์—ฐ๊ฒฐ ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ @rigor789 ์˜ ์˜ˆ ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
  5. ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋ชฉํ‘œ๋Š” _I_ ๋ฏฟ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์„ ๊ธฐ์˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ”„๋ก ํŠธ ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ "์ด ๊ธฐ๋Šฅ์„ ๋‹ค์‹œ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉด ์—…๊ทธ๋ ˆ์ด๋“œํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค"๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ผ์ฃผ์ผ ๋™์•ˆ ์ด ์ƒˆ๋กœ์šด ์•ŒํŒŒ ๋ฆด๋ฆฌ์Šค๋ฅผ ์‚ฌ์šฉํ•ด ๋ณธ ํ›„ (์‹ค์Šต์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ) ์ •๋ง ๊ฐ€์น˜ ์žˆ๋Š” ์˜๊ฒฌ์„ ๋‚จ๊ฒจ๋ณด๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๊ธฐ์กด ์•ฑ์„ ๋ฆฌํŒฉํ† ๋งํ•˜๊ณ  ๋ถˆ๊ฐ€๋Šฅํ–ˆ๋˜ ์ , ๊ฐœ์„ ๋œ ์ , ์•…ํ™”๋œ ์ ์„ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ๋” ์ž˜ ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@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 ๋ฐ ๊ธฐํƒ€์™€ ๊ฐ™์€ ๋‚ด์žฅ ํ•„ํ„ฐ๋ฅผ ๋†“์น˜๋Š” ์‚ฌ๋žŒ ์€
  • ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด ์—ฌ์ „ํžˆ ๊ฐ–๊ณ  ์‹ถ์–ดํ•˜๋Š” ๊ฒƒ์€ ํ…œํ”Œ๋ฆฟ์˜ ํŒŒ์ดํ”„ ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค.
  • ํ•ต์‹ฌ ํŒ€์€ ํŒŒ์ดํ”„ ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์˜ค๋Š” es7 ๊ธฐ๋Šฅ ์™ธ์— ๋กœ์ง์ด ํ…œํ”Œ๋ฆฟ์ด ์•„๋‹Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์œ ์ง€๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.

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๊ฐœ ๊ฐœ์ฒด์ด๋ฉด ๋ฌด๊ฑฐ์›Œ์ง‘๋‹ˆ๋‹ค.

์ตœ์ข… ๊ฒฐ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ํ•„ํ„ฐ๋Š” ์ง€์›๋˜์ง€๋งŒ ํ…์ŠคํŠธ ๋ณด๊ฐ„ ๋‚ด๋ถ€์—์„œ๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ๋กœ์ง์„ JavaScript ๋žœ๋“œ์— ์ ์šฉํ•˜๋ฉด์„œ ํ…์ŠคํŠธ ํ˜•์‹ํ™” ๋ชฉ์ ์œผ๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.
  2. Vue 2.0์€ ๋‚ด์žฅ ํ•„ํ„ฐ ์—†์ด ๋ฐฐ์†ก๋ฉ๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ž์ฒด ํ•„ํ„ฐ ํŒฉ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ํ•„ํ„ฐ ๊ตฌ๋ฌธ์€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜๋Š” ๋Œ€์‹  ์ธ์ˆ˜์— ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด JavaScript ๋ฐ ๊ธฐํƒ€ ์ธ๊ธฐ ์žˆ๋Š” ํ…œํ”Œ๋ฆฟ ์–ธ์–ด(Jinja2, swig, twig...)์™€ ๋” ์ธ๋ผ์ธ๋ฉ๋‹ˆ๋‹ค.

html {{ date | formatDate('YY-MM-DD') }}

Evan์„ ๋“ค์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด Vue๋ฅผ ํ›Œ๋ฅญํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ํ›Œ๋ฅญํ•œ ์ง€๋„์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. :์›ƒ๋‹ค:

์Šค์ฝง

@yyx990803 & @chrisvfritz

์ด ํ† ๋ก ์—์„œ ๋ฌปํžŒ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ํ•œ ๊ฐ€์ง€๋Š” ์–‘๋ฐฉํ–ฅ ํ•„ํ„ฐ์ž…๋‹ˆ๋‹ค. ์–‘๋ฐฉํ–ฅ ํ•„ํ„ฐ๋Š” ์ œ์•ˆ๋œ ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์œผ๋กœ ๋ณต์ œํ•˜๊ธฐ ๊ฐ€์žฅ ์–ด๋ ค์šด ํ•„ํ„ฐ์ž…๋‹ˆ๋‹ค.

  1. ํ•ด๋‹น ํฌ๋Ÿผ ์Šค๋ ˆ๋“œ์— ๊ฒŒ์‹œํ•œ ์ด ๊ฐ„๋‹จํ•œ ์˜ˆ ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ์ด์— ๋Œ€ํ•ด ๊ณ„์‚ฐ๋œ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด 2๊ฐ€์ง€ ์ฃผ์š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

    1. ๊ฐ ๊ฐ’์— ๋Œ€ํ•ด ์ƒˆ ๊ณ„์‚ฐ ์†์„ฑ์„ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์—„์ฒญ๋‚œ ์–‘์˜ ์ƒ์šฉ๊ตฌ ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

    2. ์„ค์ƒ๊ฐ€์ƒ์œผ๋กœ ๊ณ„์‚ฐ๋œ ์†์„ฑ์€ ์ค‘์ฒฉ ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋” ๋ณต์žกํ•œ ๊ฐœ์ฒด ๊ทธ๋ž˜ํ”„๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ณ„์‚ฐ๋œ ๋ชจ๋“  ์†์„ฑ์ด ์ตœ์ƒ์œ„ ์ˆ˜์ค€์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๊ณ„์‚ฐ๋œ ์†์„ฑ์ด ์–ด๋–ค ์ค‘์ฒฉ ๊ฐ’์„ ์ถ”์ ํ•˜๋Š”์ง€ ์ง€์†์ ์œผ๋กœ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์€ ์ธ์ง€ ๊ณผ๋ถ€ํ•˜๊ฐ€ ํ•„์š”ํ•œ ๊ธธ๊ณ  ์žฅํ™ฉํ•œ ์†์„ฑ ์ด๋ฆ„์œผ๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค.

์ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ "์‚ฌ์†Œํ•œ" ๋˜๋Š” "๋œ ๋ณต์žกํ•œ" ๊ฒƒ์œผ๋กœ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์€ ์—ญํšจ๊ณผ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ์ค‘๋Œ€ํ˜• ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋‘์—์„œ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ƒํ•˜๊ฒŒ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค! ๋ฐ๋ชจ๋Š” ๋ฐ˜๋“œ์‹œ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๊ธฐ์ˆ ์€ ํ™•์‹คํ•ฉ๋‹ˆ๋‹ค.

  1. ์ด๊ฒƒ์€ ์ด ์˜ˆ์—์„œ ์™€ ๊ฐ™์ด 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๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ณผ๋ฅผ ์บ์‹ฑํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ:

  • API ํ•˜๋‚˜ ๊ฐ์†Œ
  • ํ…œํ”Œ๋ฆฟ๊ณผ JS ์ฝ”๋“œ์—์„œ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์•ฑ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•„ํ„ฐ ๋™์ž‘์„ ๋ณต์ œํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ๊ณ„์‚ฐ๋œ ์†Œํ’ˆ์„ ์บ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • JS์ด๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋งŽ์€ ์œ ์—ฐ์„ฑ

์•ž์œผ๋กœ ์˜์‚ฌ ์ฝ”๋“œ:

<!-- 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/
๊ทธ๋ž˜์„œ ๋‚ด ๊ฐœ์ฒด์˜ ๊ฒ€์ƒ‰ ๋ฌธ์ž์—ด์„ ์†์œผ๋กœ ์ฝ”๋”ฉํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ๋‹น์‹ ์˜ ์งˆ๋ฌธ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”์ด์˜ฌ๋ฆฐ์€ ๋‚ด๊ฐ€ ๊ฒŒ์‹œ ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์Šค์ฝง

๊ณ„์‚ฐ ๋Œ€ ํ•„ํ„ฐ

why not both

ํ•„ํ„ฐ๋Š” (๋ฉ”์†Œ๋“œ์ฒ˜๋Ÿผ) ๋ชจ๋“  ๋ Œ๋”์— ๋Œ€ํ•ด ๊ณ„์‚ฐ๋˜๊ณ  ๊ณ„์‚ฐ๋œ ์†์„ฑ์€ ์ผ€์ดํฌ์ฒ˜๋Ÿผ ์‰ฝ๊ณ  ํ•„์š”ํ•  ๋•Œ๋งŒ ๋‹ค์‹œ ๊ณ„์‚ฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์— ์ข‹์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ์บ์‹œ๋˜์–ด Vue๊ฐ€ ๋‚ ์•„๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ๋‘˜ ๋‹ค ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜„

์Šค์ฝง

์ด๋ด, ๋‚˜๋Š” ์•ฝ๊ฐ„์˜ ๋งŒ์ง€์ž‘ ๊ฑฐ๋ฆฌ๊ณ  ์ด์ œ ์ดํ•ด๊ฐ€ ๊ฐ„๋‹ค. ๊ทธ๊ฒƒ์€ ํ›Œ๋ฅญํ•œ ๊ฐœ๋…์ด๋‹ค! ๐Ÿ˜„

์ด์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ์˜ค๋žซ๋™์•ˆ ๋๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ ์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ž ๊ธ€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Vue 2.0์ด ์ถœ์‹œ๋œ ์ง€ ๋ช‡ ๋‹ฌ์ด ์ง€๋‚ฌ๊ณ  ํ•„ํ„ฐ ์ €ํ•˜์— ๋Œ€ํ•œ ๋น„ํŒ์ด ํฌ๊ฒŒ ๊ฐ€๋ผ์•‰์•˜์Šต๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ์—์„œ ๋” ์ด์ƒ์˜ ๋…ผ์˜๋Š” ์ƒ์‚ฐ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ† ๋ก ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋Š” ์ฃผ์ œ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๊ด€์ ์ด ๋ณด์ด๋ฉด ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ด์–ด์ฃผ์„ธ์š”.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰