Vue脚手架系列07-表单组件设计-Input实现双向数据绑定

578 阅读1分钟

1.input组件:

🌵:这里需要了解的是,v-model是v-bind:vluev-on:input的语法糖🍬

//src/components/Input.vue

<template>
    <div>
        <!-- v-model是v-bind:vlue 和 v-on:input -->
        <input :type="type" :value="inputVal" @input="handleInput"/>
    </div>
</template>
<script>
  export default {
     props:{
         type:{      //对传入的type值做设置
             type:String,
             default:"lovelin"
         },
         value:{    //对传入的value值做设置
             type:String,
             default:""
         }
     },
     data() {
         return {
             inputVal:this.value
         }
     },
     methods: {
         handleInput(e){   
             //赋值和实现双向数据绑定
             this.inputVal = e.target.value;
             this.$emit("input",this.inputVal);
             //通知父组件值的更新(未完待续🎏)
         },
     }, 
  }
</script>
<style  scoped>

</style>
  • this.$emit("input",this.inputVal); 这个是需要注意的地方,这个通知的是外层的(下面父组件中v-model中的input事件,并将this.inputVal传递出去)

2.外层的Form组件中使用上面的的input组件

<template>
<div>   
<!--这是我们自己的input组件-->
    {{ruleForm}}
<!--当改变输入框内的值的时候就能让上面{{}}中的ruleForm跟着一起变化-->
    <m-input type="age" v-model="ruleForm.age"></m-input>
    <m-input type="password" v-model="ruleForm.pass"></m-input>
</div>
</template>

<script>
import MInput from "./Input";

  export default {
    components:{
        MInput
    },
    data() {
      return {
        ruleForm: {
          pass: '920920',
          checkPass: '',
          age: '18岁'
        },
      };
    },
    methods: {

    }
  }
</script>

目录结构如下:

3