zoukankan      html  css  js  c++  java
  • 深入理解vmodel

    原文链接:http://www.geeee.top/2019/04/03/vue-v-model/ 转载请注明出处

    v-model

    v-model 是vue的一个语法糖,用于在表单控件或者在组件上创建双向绑定。双向绑定即修改model后界面view会自动更新,如果用户更新了view,model的数据也会自动更新。

    表单控件上使用v-model

    <template>
        <div>
            <input type="text" placeholder="请输入姓名" v-model="name"/>
        </div>
    </template>
    
    <script>
        export default {
            data() {
                return {
                    name: ''
                }
            }
        }
    </script>
    

    自定义组件的v-model

    自定义组件中定义的props,是单向的,只能是父级向子组件传递,父级prop的更新会向下流动到子组件中,但是子组件不能修改父级的prop数据。 但有时候又有一些场景,需要子组件能够修改父组件传递过来的数据,此时就可以通过v-model实现。

    用法:
    设置组件的model选项,该选项值是个object有两个键prop和event,通过prop指定进行双向绑定的属性,event指定该组件中什么事件触发后,更新prop

    举例:定义一个组件,该组件有两个属性photoInfo和,zipCode, 其中photoInfo是Object类型可双向绑定。

    // 组件定义personalInfo.vue
    <template>
      <div>
        <select :value="city" @change = "handleAreaCodeChange" placeholder="区号">
            <option>北京</option>
            <option>上海</option>
        </select>
        <input
          :value="phoneInfo.phone"
          type="number"
          placeholder="手机号"
          @input="handlePhoneChange"
        />
        <input
          :value="zipCode"
          type="number"
          placeholder="邮编"
          @input="handleZipCodeChange"
        />
      </div>
    </template>
    <script>
    export default {
        model {
            prop: 'name',
            event: ''
        },
        props: {
            phoneInfo: Object,
            zipCode: String,
        },
        methods: {
            handleAreaCodeChange(e) {
                this.$emit('change', {
                    ...this.phoneInfo,
                    areaCode: e.target.value   
                });
            },
            handlePhoneChange(e) {
              this.$emit("change", {
                ...this.phoneInfo,
                phone: e.target.value
              });
            },
            handleZipCodeChange(e) {
              this.$emit("update:personInfo.zipCode", e.target.value);
            },
        }
    }
    </script>
    

    在index.vue中使用该组件

    // 组件调用
    
    <template>
        <personal-info v-model="personInfo" :zipCode="zipCode" 
            @update:zipCode="val => (zipCode = val)"></personal-info>
    </template>
    
    <script>
    import personalInfo from './personalInfo.vue'
    export default {
        components: {
            personalInfo
        },
        data() {
            personInfo: {areaCode: "+86", phone: ""},
            zipCode: "",
        }
    }
    </script>
    

    注意:

    如果没有设置model选项,组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件。

    v-model的本质

    其实就是vue提供的一个语法糖,它等价于 v-bind: + v-on:

    <input v-model="something"/>
    

    等价于

    <input v-bind:value="something" v-on:input="something = $event.target.value"/>
    
  • 相关阅读:
    十三、mysql 分区之 RANGE && LIST
    十二、mysql sql_mode 简学
    十一、mysql输入安全
    十、mysql事务的简介
    九、mysql触发器的概念
    左链接、右链接
    PHP 对数组数值进行排序,使用另一个容器
    JQUERY基础2 效果 遍历 内置遍历函数
    JQUERY基础
    orcal 单行函数组函数
  • 原文地址:https://www.cnblogs.com/Jingge/p/10724807.html
Copyright © 2011-2022 走看看