Vue: ์‚ฌ์šฉ์ž ์ •์˜ v-๋ชจ๋ธ ์ˆ˜์ •์ž ์ถ”๊ฐ€

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

.lazy , .number , .trim ๊ฐ€ ์žˆ๊ณ  .undef ๊ฐ€ ์ค€๋น„ ์ค‘์ž…๋‹ˆ๋‹ค.

.lazy ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ชจ๋‘ ์–‘๋ฐฉํ–ฅ ํ•„ํ„ฐ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

2.0์€ ์–‘๋ฐฉํ–ฅ ํ•„ํ„ฐ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋™์ผํ•œ ์š”๊ตฌ๋ฅผ ์ถฉ์กฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ •์˜ v-๋ชจ๋ธ ์ˆ˜์ •์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ƒˆ API๊ฐ€ ์žˆ์–ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

feature request

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

์ด ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์—ด ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ €์—๊ฒŒ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์ž…๋ ฅ๋˜๋Š” ํ•„๋“œ์˜ ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ์ž๋™์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. '101216'์„ ๊ฐ€์ ธ์™€ '10/12/16'์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ v-model ์ˆ˜์ •์ž๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ props ๋ฐ ์ด๋ฒคํŠธ๋กœ ์‚ฌ์šฉ์ž ์ •์˜ ์ž…๋ ฅ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋นŒ๋“œํ•  ํ•„์š” ์—†์ด v-model.date๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด ์ฝ”๋“œ๋ฅผ ํฌ๊ฒŒ ๋‹จ์ˆœํ™”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

@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 &amp; 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).

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