Vue

by WILLIAM CORREA

HTML

<div id="app">
  <the-input v-model="value"></the-input>
  <pre>{{ value }}</pre>
</div>

<template id="input" type="x/template">
  <input type="text" :value="masked" @input="input">
</template>

CSS

body {
  background: #20262E;
  padding: 20px;
  font-family: Helvetica;
}

#app {
  background: #fff;
  border-radius: 4px;
  padding: 20px;
  transition: all 0.2s;
}

li {
  margin: 8px 0;
}

h2 {
  font-weight: bold;
  margin-bottom: 15px;
}

del {
  color: rgba(0, 0, 0, 0.3);
}

Vue

new Vue({
  el: "#app",
  components: {
  	TheInput: {
    	template: '#input',
      props: ['value'],
      data: () => ({ model: '' }),
      computed: {
      	masked () {
        	return `masked: ${this.value}`
        }
      },
      methods: {
      	input ($event) {
          const unMasked = String($event.target.value).replace('masked: ', '')
        	this.$emit('input', unMasked)
        }
      }
    }
  },
  data: {
    value: ''
  }
})