.lazy
, .number
, .trim
๊ฐ ์๊ณ .undef
๊ฐ ์ค๋น ์ค์
๋๋ค.
.lazy
๋ฅผ ์ ์ธํ๊ณ ๋ ๋ชจ๋ ์๋ฐฉํฅ ํํฐ์ฒ๋ผ ์๋ํฉ๋๋ค.
2.0์ ์๋ฐฉํฅ ํํฐ๋ฅผ ์ง์ํ์ง ์์ผ๋ฏ๋ก ๋์ผํ ์๊ตฌ๋ฅผ ์ถฉ์กฑํ๊ธฐ ์ํด ์ฌ์ฉ์ ์ ์ v-๋ชจ๋ธ ์์ ์๋ฅผ ์ถ๊ฐํ๋ ์ API๊ฐ ์์ด์ผ ํ ์ ์์ต๋๋ค.
@posva ๊ณ์ฐ ์์ฑ์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ฑฐ์ ๋ชจ๋ ๊ฒ์ด ๋ฏน์ค์ธ์ ํตํด ์ฌ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
๋ฏน์ค์ธ์ ์์ฑํ๋ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฐ์ธ๋ฉํ ์ ์์ต๋๋ค.
์์ฑ์ ๋์ ์ผ๋ก ๊ณ์ฐํฉ๋๋ค. ๋๋ ์ง๊ธ ๋ฐ์ด์ฌ๋ฆฐ์ ๊ทธ ์๋ฅผ ๋ฃ์ ์ ์์ต๋๋ค
ํ์ง๋ง ์ต๋ํ ๋นจ๋ฆฌ ํ ๊ฒ์
๋๋ค.
๊ทธ๋ฌ๋ ์
๋ ฅ์ ๋ํ ๋งค์ฐ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค.
๋ณํ์ด ์ ์ฉ๋์์ต๋๋ค. ์ ์ ํ API ๋๋ ์ต์ํ์ ์ค๋ช
๊ฐ์ด๋๊ฐ ํ์ํฉ๋๋ค
2016๋
9์ 13์ผ ํ์์ผ, 18:48 Francisco Lourenรงo, [email protected]
์ผ๋ค:
@posva https://github.com/posva ๊ณ์ฐ ์์ฑ์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/vuejs/vue/issues/3666#issuecomment -246746524 ๋๋ ์์๊ฑฐ
์ค๋ ๋
https://github.com/notifications/unsubscribe-auth/AAoicf33lCvETQc9LBQ5GGZ93ExPcLS_ks5qptPegaJpZM4J7vQ0
.
๊ฑฐ์ ๋ชจ๋ ๊ฒ์ด ๋ฏน์ค์ธ์ ํตํด ์ฌ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
๋ฏน์ค์ธ์ ์์ฑํ๋ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฐ์ธ๋ฉํ ์ ์์ต๋๋ค.
์์ฑ์ ๋์ ์ผ๋ก ๊ณ์ฐํฉ๋๋ค. ๋๋ ์ง๊ธ ๋ฐ์ด์ฌ๋ฆฐ์ ๊ทธ ์๋ฅผ ๋ฃ์ ์ ์์ต๋๋ค
ํ์ง๋ง ์ต๋ํ ๋นจ๋ฆฌ ํ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ ์ ๋ ฅ์ ๋ํ ๋งค์ฐ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค.
๋ณํ์ด ์ ์ฉ๋์์ต๋๋ค. ์ ์ ํ API ๋๋ ์ต์ํ์ ์ค๋ช
๊ฐ์ด๋๊ฐ ํ์ํฉ๋๋ค
๋ค์ ๋งํด ๊ณ์ฐ๋ ์์ฑ์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค. ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ํฉํ ๋ฆฌ ํจ์ + ๋ฏน์ค์ธ์ ์ฌ์ฉํ ์ ์์ง๋ง ์ ์ฉ์ฑ๊ณผ ๊ฐ๋ ์ฑ์ ๋น๊ต๋์ง ์์ต๋๋ค.
๋ด ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ์ด ๊ธฐ๋ฅ์ด ์ ์คํ ํ์ํ๊ธฐ ๋๋ฌธ์ ๊ถ์ฅ๋๋ ์ฌ์ฉ์ ์ง์ ์ ๋ ฅ ๋ฐฉ์์ ์ฌ์ฉํ์ต๋๋ค.
InputCustom.js
define(function () {
return Vue.extend({
data: function () {
return {
focused: false
};
},
template: '<input @focus="onFocus" @blur="onBlur" @input="onInput" @change="setDisplayValue">',
props: ['value'],
watch: {
value: function () {
if (!this.focused) {
this.setDisplayValue();
}
}
},
mounted: function () {
this.setDisplayValue();
},
methods: {
onInput: function () {
this.$emit('input', this.parse(this.$el.value));
},
onFocus: function () {
this.focused = true;
},
onBlur: function () {
this.focused = false;
this.setDisplayValue();
},
setDisplayValue: function () {
this.$el.value = this.format(this.value);
}
}
});
});
์ ๋ ฅํ ์คํธ.js
define(['js/InputCustom'], function (InputCustom) {
return InputCustom.extend({
methods: {
parse: function (val) {
val = val.trim();
return val === '' ? null : val;
},
format: function (val) {
return val === null ? '' : val;
}
}
});
});
์ ์๊ฐ์๋ ์ด ์ ๊ทผ ๋ฐฉ์์ด ๋งค์ฐ ํธ๋ฆฌํ๋ฉฐ .lazy
๋ฅผ ํฌํจํ์ฌ v-model ์์ ์๋ฅผ ์ ํ ์ฌ์ฉํ์ง ์๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
๋ด์ฅ ์์ ์๊ฐ ์ง์ํ ์ ์๋ ๋ณด๋ค ๋ง์ถคํ๋ ์ฌ์ฉ ์ฌ๋ก์ ๊ฒฝ์ฐ @ecmel ์ด ์ธ๊ธํ ๊ฒ์ด ๊ถ์ฅ๋๋ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. ๊ณต์ ๊ฐ์ด๋์์ ๋ ์์ธํ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
์ด ๊ธฐ๋ฅ ์ ์์ ์์ด๋์ด๋ ์ด๋ฏธ ๋ชจ๋ input
์์์ ํจ๊ป ์๋ํ๋ ๊ธฐ์กด v-model
์ง์๋ฌธ์ ํ์ฉํ๋ ๊ฒ์
๋๋ค. ๋ชจ๋ ํ๋ก์ ํธ์์ _InputCustom.js_๋ฅผ ์์ฑํ๋ ์์
์ ์ ์ฅํ๋ ค๋ฉด v-model
์์ ์ด๋ฏธ ์ํ๋์์ผ๋ฏ๋ก ์ฌ์ฉ์ ์ง์ ์์ ์์์ _InputText.js_์ ํด๋นํ๋ ํญ๋ชฉ๋ง ์์ฑํ๋ฉด ๋ฉ๋๋ค. ์ฌ๊ธฐ์๋ ํ์ํ ๋ชจ๋ ๋
ผ๋ฆฌ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ๋๋ถ๋ถ ์์ ๋ฉ๋๋ค. v-model
๊ฐ ์ด๋ฏธ ์์์ด์ ํจ๊ป ์ ๊ณต๋๋ค๋ ์ฌ์ค์ ์ด๊ฒ์ด ์ง๊ด์ ์ด๊ณ ๋ฐ๋์งํ ํจํด์์ ์ฆ๋ช
ํฉ๋๋ค. ์ฌ์ฉ์ ์ ์ ์์ ์ ์์ฑ์ ์ฉ์ดํ๊ฒ ํ๊ณ ์ฌ์ฉ์ ์ ์ ์์๋ฅผ ์์ฑํ๊ณ dom/model ๋ฐ์ธ๋ฉ์ ์๋์ผ๋ก ๊ตฌํํด์ผ ํ๋ ์์
์ ์ ์ฅํ๋ ๊ฒ์ ์์ฐ์ค๋ฌ์ด ์ผ์
๋๋ค.
API ๊ด์ ์์ ์ดํด๊ฐ ๋๋ค๋ฉด ์ด ๊ธฐ๋ฅ์ ๊ตฌํํ์ง ์๊ธฐ๋ก ๊ฒฐ์ ํ ๊ธฐ์ ์ ํ๊ณ๊ฐ ๋ฌด์์ธ์ง ์๋ ๊ฒ์ด ํฅ๋ฏธ๋ก์ธ ๊ฒ์ ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ๋ค์ ์ด ์ ์๋ ๊ธฐํ๊ฐ ์์ต๋๊น? ์ ์๊ฒ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ ์ ๋ ฅ๋๋ ํ๋์ ๋ฐ์ดํฐ ํ์์ ์๋์ผ๋ก ์ง์ ํด์ผ ํ๋ ๊ฒ์ ๋๋ค. '101216'์ ๊ฐ์ ธ์ '10/12/16'์ผ๋ก ๋ฐ๊พธ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ฒ์ ๋๋ค. ์ฌ์ฉ์ ์ ์ v-model ์์ ์๋ฅผ ์์ฑํ ์ ์๋ค๋ ๊ฒ์ props ๋ฐ ์ด๋ฒคํธ๋ก ์ฌ์ฉ์ ์ ์ ์ ๋ ฅ ๊ตฌ์ฑ ์์๋ฅผ ๋น๋ํ ํ์ ์์ด v-model.date๋ฅผ ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ด ์ฝ๋๋ฅผ ํฌ๊ฒ ๋จ์ํํ ๊ฒ์ ๋๋ค.
๋ด ํ๋ก์ ํธ์์ ์ ์ ๋์ vue js๋ฅผ ์ฌ์ฉํ ํ ์ด ๋ฌธ์ ๋ ์ค์ ๋ก ๋ค์ ์ด๋ ค์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ต์ํ undef
์์ ์๊ฐ ํ์ํฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ๋ค์ ์์ํด์ผ ํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. undef
์ด ๋ฌด์์ ํ๊ธฐ๋ก ๋์ด ์์๋์ง ํ์คํ์ง ์์ง๋ง, ์
๋ ฅ์ ํธ๋ฆฌ๋ฐ๋ ๊ฐ์ด ๋น ๋ฌธ์์ด์ธ ๊ฒฝ์ฐ ๋ด ๋ณ์๋ฅผ null
๋ก ์ค์ ํ๋ v-model
์์ ์๋ฅผ ์ํฉ๋๋ค.
์ง์ ์ง์ ํ ์ ์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค.
์๋ฅผ ๋ค์ด https://github.com/vuejs/vue/issues/5194 ์ ์ด๋ณด๋ค ๋ ๋ง์ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์์ต๋๋ค. ์ธ๋ถ์์ Vue๋ react ์ปค๋ฎค๋ํฐ์์ ์ฅ๋ คํ๋ ๊ด์ต ๋ฐ ๊ดํ์ ์ฐฌ์ฑํ์ฌ ์ผ๋ถ ์์น์ ์ฒ์ฒํ ํํํ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ์ฒ์์ ๋์ ๋๋ ํน์ฑ์์ ์ฝ๊ฐ ๋ฒ์ด๋ฌ์ต๋๋ค. ์ด๊ฒ์ด ๋ฐ์์์ ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ ์ฝ๊ฒ ๋ง๋ค๋ ค๋ ์๋๊ฐ ์๋ ์์์ ์ธ ๊ฒฐ์ ์ธ์ง ์๋๋ฉด ์ฐ์ฐ์ ์ผ์น์ธ์ง ์๋ ๊ฒ์ด ํฅ๋ฏธ๋ก์ธ ๊ฒ์ ๋๋ค.
์ฌ์ฉ์ ์ง์ ๊ตฌ์ฑ ์์๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ข์ง๋ง https://github.com/text-mask/text-mask/tree/master/vue#readme ์ ๊ฐ์ ํ์ฌ ์ฌ์ฉ์ ์ง์ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ ๋ง์คํฌ๋ฅผ ์ญ์ ํ๋ ์ง์ ์ ์ธ ๋ฐฉ๋ฒ์ ์์ต๋๋ค. ๊ณ์ฐ๋ ์์ฑ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ ์ธํ๊ณ ๋ชจ๋ธ ๊ฐ์ ๋ํ ์ ๋ ฅ.
๊ทธ๋์, ์ ๋ HTML ํ์ค ์ ๋ ฅ[type=date] ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ชจ๋ธ์ ๋ ์ง ์ ํ์ ํธ์งํ๊ณ ์ถ์ต๋๋ค. ์ด ๋๋๋๋ก ๊ฐ๋ ฅํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ํ๋ ์์ํฌ๋ ์ฆ์ ์ด๋ฅผ ์ํํ ์ ์์ต๋๊น? ํ๋์์ ๋ ์ง๋ฅผ ์ฝ์ ์ ์์ต๋๋ค. ๋ ์ง๋ฅผ ์ ํํ ํ ๋ฐ์ดํฐ์ ๋ฌธ์์ด๋ก ๋ ์ง๋ฅผ ๋ฎ์ด์๋๋ค. ์ด ์๋ฃจ์ ์ ์๋ฐฉํฅ ํํฐ ๋๋ ์์ ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ ์ค๋ก ์์ฑํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ฐ์ฅ ์ข์ ํด๊ฒฐ์ฑ ์ ํ์ธ๋ ๋ฐ ๊ธฐํ ํ์ค ์ ๋ ฅ ํ๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํ๋ ๊ฒ์ ๋๋ค. "๋ ์ง"๊ฐ ํน๋ณํ ์ด์ ๋ ๋ฌด์์ ๋๊น?
์ฌ์ฉ์ ์ ์ ์์ ์์ ๊ฒฝ์ฐ +1. ํ์ง ๋ง์์ผ ํ ํฉ๋นํ ์ด์ ๊ฐ ์๋ ํ ์๋ฌด ์๊ฐ๋ ํ์ง ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๊น?
์ ํ๋ฆฌ์ผ์ด์ ์ฌ์ฉ์ ์ํด ์ ๋ ฅ์ ๋ง์คํนํ๊ณ ๊ฐ์ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๊ฒ์ ๋งค์ฐ ์ผ๋ฐ์ ์ธ ๊ดํ์ด๋ฉฐ v-model.lazy.currency="amount"์ ๊ฐ์ ์ผ๋ถ "ํฉ์ฑ ์คํ"์ ๋ง๋๋ ๊ฒ์ ๋๋ผ์ด ์ผ์ ๋๋ค!
์ฌ์ฉ์ ์ง์ ์์ ์์ ๊ฒฝ์ฐ 1+.
๋ฌธ์์ด๋ก ํ๊ฐ๋๋ true|false ๊ฐ์ด ์๋ ๊ฐ๋จํ ๋ผ๋์ค ์
๋ ฅ์ด ์์ต๋๋ค. ํ์ง๋ง ๋ถ์ธ ๊ฐ์ผ๋ก ํ์ํฉ๋๋ค. ๋ชจ๋ ๋ผ๋์ค ์
๋ ฅ์ ๋ํด ๊ณ์ฐ๋ ์์ฑ์ ๋ค์ ๊ตฌํํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด ๊ฒฝ์ฐ ๊ณ์ฐ๋ ์์ฑ์ ํ๋ช
ํ์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด 100๊ฐ์ ๋ผ๋์ค ์
๋ ฅ์ด ์์ผ๋ฉด 100๊ฐ์ ์์ฑ์ด ๊ณ์ฐ๋ฉ๋๋ค.
์ฌ์ฉ์ ์ง์ ์์ ์๋ +1์ด์ง๋ง tobei์ ๋์ํฉ๋๋ค -- input[type=date]๋ ์๋์ผ๋ก ์๋ํด์ผ ํฉ๋๋ค.
์ฌ์ฉ์ ์ ์ ์์ ์์ ๊ฒฝ์ฐ +1.
์ ๋ Angular ๋ฐฐ๊ฒฝ์์ ์์ผ๋ฉฐ vue๋ก ์์ํ์ฌ ์ด ์ค๋ ๋๋ฅผ ๋ณด์์ต๋๋ค.
Vue์์๋ Angular์ ํ์ ๋ฐ ํฌ๋งทํฐ์ ๊ฐ์ ๊ฒ์ ๊ฐ๋ ๊ฒ์ด ์ ๋ง ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. v-model.dateFormat๊ณผ ๊ฐ์ ์์ ์ ์ํํ๊ณ mm/dd/yyyy์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค๋ฉด ์ ๋ง ๋ฉ์ง ๊ฒ์ ๋๋ค.
ํธ์ง: @restored18 ์ด ๋งํ ๋ด์ฉ์ ๋ฐ๋ณตํ ๊ฒ ๊ฐ์ต๋๋ค. ๋์๊ฒ๋ +1
์ฌ์ฉ์ ์ ์ v-๋ชจ๋ธ ์์ ์์ ๊ฒฝ์ฐ +1.
์ ๊ฒฝ์ฐ์๋ JSON์์ ๊ฒ์๋ ๋ช ๊ฐ์ ์ค์ฒฉ๋ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ณตํ๊ณ ๋จ์ผ HTML ํ ํ๋ฆฟ(๊ฐ์ฒด๋น ํ ํ๋ฆฟ์ด ์๋)์ ์ฌ์ฉํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ๊ณ์ฐ๋ ์์ฑ์ด ์๋ํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๊น?
์ ๋ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ๋ณด๋ผ ๋ ์๋ฒ ํ์๊ณผ v-๋ชจ๋ธ ํ์ ๊ฐ์ ์ฌ์ฉ์ ์ง์ ๋ณํ ๋ฐฉ๋ฒ์ ์ ๋ ฅํ๊ณ ์์ง๋ง ํจ์๋ฅผ ์ ๋ฌํ ์ ์๋ "๋ด์ฅ" ๊ธฐ๋ฅ์ ์ํฉ๋๋ค.
์ด๊ฒ์ +1. 2.2 ์ด์ ์๋ ์ฌ์ฉํ ์ ์์์ต๋๋ค. ๋ค์์ ํตํด ์์ฑ์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
this.$vnode.data.directives
์ฌ์ฉ์ ์ง์ ๋ชจ๋ธ ์ ๋ ฅ ๊ฐ์ ์ถ๊ฐํ์ฌ ์ ๊ฑฐ๋์์ง๋ง ๋งค์ฐ ์ ์ฉํ ๊ธฐ๋ฅ์ด์๊ณ ํ๋ ์์ํฌ์ ๋ค์ ์์ด์ผ ํฉ๋๋ค.
์ด๊ฒ์ ๋ํด +1.
์ฌ์ฉ์ ์ ์ v-๋ชจ๋ธ ์์ ์๋ ํ๋ฅญํ ๊ฒ์ ๋๋ค!
2018๋ ์๋ +1 ...
+1 ์ ์๊ฐ์๋ DRY ์ฝ๋์ ํ์ํ ๊ธฐ๋ฅ์ ๋๋ค. ์ง๊ธ ๋น์ฅ์ ์ ๋ ฅ์ด ๋ง์ ์์์ ๋ํด ๋์ผํ ์์ ์ ์ํํ๋ 10๋ช ์ ๊ฐ์์๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ์ฌ์ฉ์ ์ ์ ์์ ์๋ ๋ชจ๋ ๊ฒ์ ํด๊ฒฐํ ๊ฒ์ ๋๋ค.
+1 ๋ฐฉ๊ธ vue๋ฅผ ์์ํ๊ณ ์ด๋ฏธ ์ด๋ฌํ ์ ํ์ ์๋ฐฉํฅ ํํฐ๊ฐ ํ์ํฉ๋๋ค ...
+1 ๋ฐ๋์ ํ์ํฉ๋๋ค
+1
๋๋ถ๋ถ์ ์ฌ์ฉ ์ฌ๋ก์ ๋ํด ์ด์ ๊ฐ์ ๋์ฐ๋ฏธ๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
@nickmessing ์ ์ฌ๊ธฐ์ ์ค๋ช
๋ (์ ๋ง ์ ์ฉํ) ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ค๋ฃจ์ง ์์ต๋๋ค. ์ด๋ ์
๋ ฅ ํ
์คํธ์ ๋ด๋ถ ์์ ์
๋๋ค. ํญ์ ์ ํ์ฒ๋ผ ํ์์ ์ง์ ํ๋ ค๋ ์
๋ ฅ ์์๊ฐ ์๋ ๊ฒฝ์ฐ <input v-model.phone="some_data">
๊ฐ ๋ฉ๋๋ค. ์ฌ์ฉ์๊ฐ ํ
์คํธ๋ฅผ ์
๋ ฅํ๋ฉด ์๋์ผ๋ก ์์์ด ์ง์ ๋ฉ๋๋ค.
์ด๊ฒ์ ๊ทธ๋ฐ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ฅ์ธ ๊ฒ ๊ฐ๊ณ ์ง๊ธ ์๊ฐํด์ผ ํ ๊ฒ๋ณด๋ค ๋ ์ด๋ ต์ต๋๋ค. ์ด ๋์์ ํ๋ ์์ํฌ์ ์ด๋ฏธ ์กด์ฌํ์ง๋ง ์ด๋ค ์ด์ ๋ก ํ๋ ์์ํฌ ์ ์ฉ ์ฝ๋๋ก ์ ํ๋ฉ๋๋ค. ํํฐ ๋ฐ ์ง์๋ฌธ์ด ํ์ฌ ์๋ ๊ฒ์ฒ๋ผ ๊ตฌ์ฑ ์์์ ํ๋ก์ ํธ์์ ์ฌ์ฌ์ฉํ ์ ์๋ ์ฌ์ฉ์ ์ง์ ์์ ์๋ฅผ ์ถ๊ฐํ ์ ์๊ธฐ๋ฅผ ์ํฉ๋๋ค.
@bbugh ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. ์ ๋ IBAN์ ํฌ๋งทํ๋ ๊ฒ๊ณผ ๋น์ทํ ๊ฒฝ์ฐ๋ฅผ ๊ฒช๊ณ ์์ผ๋ฉฐ v-model.iban="payment.iban"
๋ฅผ ๊ฑฐ๊ธฐ์ ๋จ์ํ ๋ฃ๋ ๊ฒ์ด ๋ฉ์ง๊ณ ์ ์ธ์ ์ธ ๋ฐฉ๋ฒ์ด ๋ ๊ฒ์
๋๋ค...
@franciscolourenco ๋๊ตฐ๊ฐ๊ฐ ํ๋ ์์ํฌ์์ ์ง์ํ์ง ์์์ผ ํ๋ ์ด์ ๋ฅผ ์ค๋ช ํ์ฌ ๋ ๋ช ํํด ์ง ์ ์์ต๋๋ค.
์ฌ์ฉ์ ์ง์ ์์ ์์ ๊ฒฝ์ฐ +1, ์ด ๊ธฐ๋ฅ์ผ๋ก ์ํํ ์ ์๋ ๋ง์ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ต๋๋ค.
์ฐ๋ฆฌ ์์ฉ ํ๋ก๊ทธ๋จ์๋ ํตํ ํ์์ ์ง์ ํ๋ ์
๋ ฅ์ด ๊ฑฐ์ ์์ผ๋ฉฐ ํญ์ ๋ชจ๋ธ์ ์ผํธ ๊ธ์ก์ ์ ์ฅํ์ง๋ง ์
๋ ฅ์ ๋ฉ์ง๊ฒ ํ์์ด ์ง์ ๋ ๋ฌ๋ฌ ๊ธ์ก์ ํ์ํฉ๋๋ค(๋ฐ๋ผ์ ๋ชจ๋ธ์ 123456์ $1,234.56์ผ๋ก ํ์๋จ) <input v-model.dollars="cents" />
๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก๋ XSS ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด html ํ๋๋ฅผ ์ญ์ ํ๊ณ ์ด์ค์ผ์ดํ ํด์ ํ๋ ๊ฒ์
๋๋ค(์
๋ ฅ์ด " A & B
"๋ฅผ ํ์ํ๋ ๋์ ๋ชจ๋ธ์ " A & B
"๋ฅผ ์ ์ฅ) <input v-model.html="text" />
+1
+1
์ฌ์ฉ์ ์ ์ ์์ ์์ ๊ฒฝ์ฐ +1.
v-model.trim.uppercase=...
๊ฐ์ ๊ฑธ ํ ์ ์์ด์ ์ ๋ง ๋๋์ด์
+1
+1
+1
+1
๊ธฐ๋ณธ v-model
์
๋ ฅ ์์ ์๋ ํ๋ฅญํ ๊ธฐ๋ฅ์
๋๋ค. ์ฌ๋๋ค์ด ์ฌ๊ธฐ์์ ์ธ๊ธํ๋ฏ์ด ๋ง์ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ต๋๋ค. ๋ด๊ฐ ์์
ํ ๋ชจ๋ ํ๋ก์ ํธ์ ๋ํด ๋ ์ง ๋ฐ ํตํ ์์ ์๊ฐ ํ์ํ์ต๋๋ค.
์ฌ๊ธฐ์ ๋ฌธ์ ๋ฅผ ์ด์ด์ผ ํฉ๋๊น? https://github.com/vuejs/rfcs
๋๋ ์ด๋ฏธ ์ด๊ฒ์ +1ํ์ง๋ง "์ง๊ธ" ๋ฌด์ธ๊ฐ๊ฐ ํ์ํ ์ฌ๋๋ค์ ์ํด ๋ฉ๋ชจ๋ฅผ ๋์ง๊ณ ์ถ์ต๋๋ค.
modifier๊ฐ ํจ์ฌ ๋ ํจ์จ์ ์ด์ง๋ง ๊ณ์ฐ๋ getter/setter ํ๋๊ฐ ์๋ ํฌ๋ช ํ ์ ๋ ฅ/๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ์ฌ ๋์ผํ ํจ๊ณผ๋ฅผ ์ป์ ์ ์์์ต๋๋ค.
๋๊ตฐ๊ฐ๊ฐ ํ์ํ๋ฉด ์๋ฅผ ๊ณต์ ํ ์ ์์ต๋๋ค
์ด ๊ฒ๋ณด๊ธฐ์ ์ฌ์ ๋ณด์ด๋ ๊ธฐ๋ฅ์๋ ๊ณ ๋ คํด์ผ ํ ์ฌํญ์ด ๋ง๊ธฐ ๋๋ฌธ์ ๊ตฌํํ์ง ์์์ต๋๋ค.
๋ด์ฅ ์์ ์๋ ์ค์ ๋ก ๋ค๋ฅธ ์ปดํ์ผ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ์ปดํ์ผ ํ์ ํํธ์ ๋๋ค. ์ฌ์ฉ์ ์ง์ ์์ ์๋ ๋ค๋ฅธ ๋ฉ์ปค๋์ฆ์ธ ๋ฐํ์ ๊ตฌ์ฑ์ ์ฌ์ฉํ์ฌ ์ ์ํด์ผ ํ ์ ์์ต๋๋ค.
๋ฐํ์ ๊ตฌ์ฑ์ ๊ฒฝ์ฐ ์ด๋ฅผ ์ํด ์ด๋ค ์ข ๋ฅ์ API๋ฅผ ๋ ธ์ถํด์ผ ํฉ๋๊น?
๊ณผ๊ฑฐ์๋ ์๋ฐฉํฅ ํํฐ๊ฐ ์์์ต๋๋ค. ์๋ฐฉํฅ ๊ฐ ๋ณํ์์๋ ์๋ฐฉํฅ ๋ฐ์ธ๋ฉ์ด ์์ ํ๋ ์ ์๋๋ก ์ฌ์ฉ์๊ฐ ์๋ฒฝํ ๋ ผ๋ฆฌ๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ทน๋จ์ ์ธ ๊ฒฝ์ฐ์ ๋ํด ์ ์ฒด ์ฑ์ ๋ฌดํ ๋ฃจํ์ ๋น ๋จ๋ฆด ์ํ์ด ์์ต๋๋ค.
.number
๋ฐ .trim
๊ฐ ์๋ ์ด์ ๋ ์ค์ ๋ก ๋จ๋ฐฉํฅ ๋ณํ(DOM ๊ฐ์ ๊ตฌ์ฑ ์์ ๋ฐ์ดํฐ์ ๋๊ธฐํํ ๋๋ง ์ ์ฉ๋จ)์ด๋ฏ๋ก ์์ ํ๊ฐ ๋ณด์ฅ๋๊ธฐ ๋๋ฌธ์
๋๋ค.v-model
๊ฐ ๊ตฌ์ฑ์์์์ ์ฌ์ฉ๋ ๋ ์ฌ์ฉ์ ์ ์ ์์ ์๋ ์ด๋ป๊ฒ ์๋ํด์ผ ํฉ๋๊น?
radio
, checkbox
๋ฐ ๊ฐ์ฅ ์ค์ํ <select>
์ ๊ฐ์ ํ
์คํธ๊ฐ ์๋ ์
๋ ฅ ์ ํ์์ ์ฌ์ฉ์ ์ง์ ์์ ์๋ ์ด๋ป๊ฒ ์๋ํด์ผ ํฉ๋๊น?
์ด ๋ชจ๋ ์ง๋ฌธ์ ๋ต์ด ์์ผ๋ฉฐ ์์ฒญ์ ๋ณด๊ธฐ๋ณด๋ค ๋ณต์กํ๊ฒ ๋ง๋ญ๋๋ค. ์ด๊ฒ์ด ๋ด๊ฐ ์ด ๊ธฐ๋ฅ์ ์ ๋ง๋ก ์ํ๋ ์ฌ๋์ด ์๋ค๋ฉด ์ด ๋ชจ๋ ๊ฒ์ ๋ค๋ฃจ๋ ์ ์ ํ RFC์ ์ข์ ํ๋ณด๊ฐ ๋ ๊ฒ์ด๋ผ๋ ๋ฐ ๋์ํ๋ ์ด์ ์ ๋๋ค. ๊ทธ๋๊น์ง๋ ๋ ๋ง์ +1์ด ์ด๋ค ์์ผ๋ก๋ ์์ผ๋ก ๋์๊ฐ์ง ์์ต๋๋ค.
@rkingon https://github.com/vuejs/vue/issues/3666#issuecomment -249583603์ ์ด๋ฏธ ์๊ฐ ์์ง๋ง ๊ทํ์ ๊ฒ์ด ๋ค๋ฅด๊ฑฐ๋ ๋ ๋์ ๊ฒฝ์ฐ ๊ฒ์ํ์ญ์์ค. ์ด๋ณด์์๊ฒ ์ ์ฉํ ์ ์์ต๋๋ค.
@Gotterbild ๋๋ ๊ทธ ์ํ์ ๋์ณค์ง๋ง Vue์ ์ดํ ๋ฒ์ ์์๋ ํจ์ฌ ๋ณต์กํ์ต๋๋ค(์ด๊ฒ์ ์ฌ์ ํฌ๋ช ๊ตฌ์ฑ ์์ ์ง์์ด์์ ์ ์์)
์ฌ๊ธฐ์ ๋ด๊ฐ ํผ์ผํธ๋ฅผ ์ญ์ง์๋ก ๋ณํํ๋ ๋งค์ฐ ๊ฐ๋จํ ๊ฒ์ด ์์ต๋๋ค(์: 4.5 -> .045) ๋ฐ ๊ทธ ๋ฐ๋๋ก("๋ณด๊ธฐ" ๊ฐ ๋ฐ "๋ชจ๋ธ" ๊ฐ)
<template>
<input type="number" v-on="listeners" v-model="innerValue">
</template>
<script>
export default {
props: ['value'],
computed: {
listeners () {
const { input, ...listeners } = this.$listeners
return listeners
},
innerValue: {
get () {
return (this.value) ? `${(this.value * 100)}` : ''
},
set (_val) {
const val = (_val) ? (_val / 100) : ''
this.$emit('input', val)
}
}
}
}
</script>
๋ชจ๋ ์ด์ /ํ๋ฆผ ํจ๊ณผ ๋ฑ์ ๋ค์ ์ง์ ํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์์ ๊ฒ๋ณด๋ค ๋ ๊ฐ๋จํฉ๋๋ค.
@yyx990803 ์ด ์ฃผ์ ์ ๋ํด ๋ ๋ง์ ๋ฐฐ๊ฒฝ ์ ๋ณด๋ฅผ ์ ๊ณตํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๋ด ์ฌ์ฉ ์ฌ๋ก์ ๊ฒฝ์ฐ ์ฌ์ฉ์ ์ง์ ์์ ์๊ฐ "ํ์"ํ์ง ์์ต๋๋ค. ์๋น์์ ๊ด์ ์์ ๋ณผ ๋ vue๊ฐ ์์ฒด์ ์ผ๋ก ๋น๋ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์ด ์ดํด๊ฐ ๋ ๊ฒ์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์์์ด๋ฅผ ์ ์ธํ ๋ชจ๋ ๊ฒ์ ๋ํด ๐
๋ด ๋ณํ ๋ ผ๋ฆฌ๋ฅผ ์ ์ ํ๊ฒ ์บก์ํํ๊ณ ์ฌ์ฌ์ฉํ ์ ์๋ ๋ฌด์ธ๊ฐ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์์ง๋ง, ๊ทธ๋ฌํ ์ฌ์ฉ ์ฌ๋ก์ ์ ์ ํ API๋ฅผ ๊ฐ๋ ๊ฒ์ด "์ต๊ณ ์- ์ฐ์ต ์์ ์".
๋ฌธ์์ด์ ๋๋ฌธ์๋ก ๋ณํํ๋ ์์ ์๋ฅผ ๋ง๋ค๊ณ ์ถ์๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ ์์ต๋๋ค.
v-model.uppercase="username"
์ฒ๋ผ ๋ง๋ค๊ณ ์ถ์์ต๋๋ค.
๋๋ ์ฌ์ฉ์ ์ ์ ์ง์๋ฌธ์ ์ฌ์ฉํ์ฌ ๋๋ฌ์ต๋๋ค.
Vue.directive('uppercase', {
update (el) {
el.value = el.value.toUpperCase()
},
})
<input type="text" v-model="username" v-uppercase>
์ฌ์ฉ์ ์ง์ ์ง์๋ฌธ์ ๋์์ผ๋ก ์ถฉ๋ถํด์ผ ํฉ๋๋ค.
์๋๋ฉด ์ปค์คํ
v-model modifier๋ก๋ง ๊ฐ๋ฅํ ๊ฒ์ด ์์ต๋๊น?
v-model
๋ฅผ ๊ณ ๋ ค ํ๋ @Christhofernatalius ๋ ๋จ์ํ ์ง์๋ฌธ์
๋๋ค. ์ฌ์ฉ์ ์ง์ ์ง์๋ฌธ์ ์ํด v-model
๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๊น? ์ด๋ ๊ฒํ๋ฉด ๋ ๋ฒ ์
๋ฐ์ดํธํ์ง ์์ต๋๊น?
v-model
๋ฅผ ๊ณ ๋ ค ํ๋ @Christhofernatalius ๋ ๋จ์ํ ์ง์๋ฌธ์ ๋๋ค. ์ฌ์ฉ์ ์ง์ ์ง์๋ฌธ์ ์ํดv-model
๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๊น? ์ด๋ ๊ฒํ๋ฉด ๋ ๋ฒ ์ ๋ฐ์ดํธํ์ง ์์ต๋๊น?
@rkingon ์
๋ฐ์ดํธ๊ฐ ๋ ๋ฒ์ธ๊ฐ์?
๋ฐ๋ผ์ v-model์ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์
๋ ฅ ์์ ๊ธฐ์ ๋ํ ๋ฐ์ธ๋ฉ ๋ฐ ๋ฐ์ธ๋ฉ ํด์ ํํฌ๋ ์ถ๊ฐํ๊ณ ์ฌ์ฉ์ ์ด๋ฆ ๊ฐ์ ์
๋ฐ์ดํธํด์ผ ํฉ๋๊น?
ํธ์ง : setter ๋ฐ getter๋ก ๊ณ์ฐ์ ์ฌ์ฉํ๋ฉด ๋ ๋ฒ ์
๋ฐ์ดํธ๋์ง ์์ต๋๊น?
ํธ์ง 2: ์ฝ์ ๋ก๊ทธ ๊ฐ์์์ ์ง์๋ฌธ์ ์๋ํ๋๋ฐ, ๊ฐ๊ฐ์ ๋ชจ๋ ํค ์
๋ ฅ์ ๋ํด ํ ๋ฒ๋ง ์ธ์๋ฉ๋๋ค.
๋๋ ๊ทธ๊ฒ์ ์๋ํ์ง ์์์ต๋๋ค. ๋จ์ง ์ถ์ธก์ผ ๋ฟ์ ๋๋ค. ํ๋์ ๊ฐ์ ์ ๋ฐ์ดํธํ๋ ๋ ๊ฐ์ ์ง์๋ฌธ์ ๋ํ ์์ด๋์ด๋ ์ ์๊ฒ ์ฝ๊ฐ ์ฐ์ค๊ฝ์ค๋ฝ๊ฒ ๋๊ปด์ง ์ ์์ง๋ง, ํ์ธํด ๋ณด๋ฉด ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ด ๊ตฌ์ฑ ์์ ํด๊ฒฐ ๋ฐฉ๋ฒ์๋ ์ ํ ์ฌํญ์ด ์์ผ๋ฏ๋ก ์ฌ์ ํ ์์ ์๋ฅผ ์ ํธํฉ๋๋ค. ) ๋ ์ง์๋ฌธ์ ํ์ธ ์์์ ๊ตฌ์ฑ ์์/์์์์ ๋จ์ํ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
๊ณ ์์ด ๊ฐ์ฃฝ์ ๋ฒ๊ธฐ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ, ์ต์ ์ด ์์ด์ ์ข์์ :)
์ด์ ๋ํ RFC๊ฐ ์์ต๋๊น?
๋๋ ๊ทธ๋ ๊ฒ ์๊ฐํ์ง ์๋๋ค
๋ง๋ค ์๋ ์์ง๋ง RFC ๋ฆฌํฌ์งํ ๋ฆฌ ๋๋ ๋ค๋ฅธ ํญ๋ชฉ์ ๋ฌธ์ ๋ฅผ ์ถ๊ฐํ๋ค๋ ์๋ฏธ์ ๋๊น?
https://github.com/vuejs/rfcs#what -the-process-is ์ด๊ฒ์ด ๊ทํ์ ์ง๋ฌธ์ ๋ํ ๋ต๋ณ์ ๋๊น?
์ด๊ฑฐ ์ฌ๊ฐ๋ด ๊ฐ๋ฅํ๊ฐ์? ์ฌ์ฉ์ ์ง์ ์ง์๋ฌธ์ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์๋ํ ์ ์์ง๋ง ๋์์ด ์ฌ๋ฏธ์์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Vue.directive('number', {
update: function(el, binding, vnode) {
el.value = el.value.replace(/[^\d.]/g, '');
},
});
์ด ์ง์๋ฌธ(v-model๊ณผ ํจ๊ป)์ ์ถ๊ฐํ๊ณ ๋ค๋ฅธ ๋ชจ๋ ํค์คํธ๋กํฌ๋ง๋ค ์ ๋ง ๋น ๋ฅด๊ฒ ๋ฌธ์๋ฅผ ์
๋ ฅํ๋ฉด v-model
๊ฐ el.value
์ ๋๊ธฐํ๋์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์ ํ ๋ฐ์ธ๋ฉ ๊ฐ์ฒด๋ฅผ ์์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด ์ง์๋ฌธ ๋ด์์ v-model์ "์ฌ๊ตฌํ"ํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
@jeankvd ๊ณผ๋ํ๊ฒ ๋๊ปด์ง๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ๋ํผ ๊ตฌ์ฑ ์์๊ฐ ๊ฐ์ฅ ์์ ์ ์ผ ๊ฒ์ ๋๋ค(์์ ์ ์ฐธ์กฐ).
๋ํผ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๋ฉด "๋ ๋ง์ ์์
"๋ ์ํํ ์ ์์ต๋๋ค. "์ซ์" ์์์ ์ด์์ ์ผ๋ก๋ v-model์ด ์ค์ ๋ก Number
๋ฉ๋๋ค. ๊ทํ์ ์ ๊ทผ ๋ฐฉ์์์๋ ์ฌ์ ํ String
์
๋๋ค.
๋น ๊ฐ์ ์ฌ์ฉ์ ์ง์ ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น? ๋น ๋ฌธ์์ด? ์๋? ํ์ ๋์ง ์์? -- emptyValue
์ ๋ํ ์ํ์ ์ ๋ฌํ๊ณ ๊ทธ๋ ๊ฒ ์ค์ ํ ์ ์์ต๋๋ค.
ํ ๋ฒ ์ด๊ฒ์ ์นํธํ์ง๋ง ์์ ์๊ฐ ๋๋ฌด ๋ง์ ์ ํ ์ฌํญ์ด ์๊ณ ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ๋ ๊ฒ์ด ํจ์ฌ ์ฐ์ํ๋ค๋ ๊ฒ์ ๊ณง ๊นจ๋ฌ์์ต๋๋ค(์ ์ด๋ imo).
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด ๋ฌธ์ ๋ฅผ ๋ค์ ์ด ์ ์๋ ๊ธฐํ๊ฐ ์์ต๋๊น? ์ ์๊ฒ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ ์ ๋ ฅ๋๋ ํ๋์ ๋ฐ์ดํฐ ํ์์ ์๋์ผ๋ก ์ง์ ํด์ผ ํ๋ ๊ฒ์ ๋๋ค. '101216'์ ๊ฐ์ ธ์ '10/12/16'์ผ๋ก ๋ฐ๊พธ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ฒ์ ๋๋ค. ์ฌ์ฉ์ ์ ์ v-model ์์ ์๋ฅผ ์์ฑํ ์ ์๋ค๋ ๊ฒ์ props ๋ฐ ์ด๋ฒคํธ๋ก ์ฌ์ฉ์ ์ ์ ์ ๋ ฅ ๊ตฌ์ฑ ์์๋ฅผ ๋น๋ํ ํ์ ์์ด v-model.date๋ฅผ ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ด ์ฝ๋๋ฅผ ํฌ๊ฒ ๋จ์ํํ ๊ฒ์ ๋๋ค.