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"/>
    
  • 相关阅读:
    【Neo4j cypher命令】 使用
    【Neo4j】 Neo4j数据插入的几种方式总结
    【Ubuntu】 解决 无法获得锁 /var/lib/dpkg/lock-frontend
    【python】win10配置pycharm 关于Error processing line 7 of D:softwaresAnaconda3libsite-packagespywin32.pth 问题的解决
    win10环境配置XShell6.0绿色版
    【python】 Anaconda3配置好后,启动jupyter服务异常的解决方法
    利用python+win32api获取标题对应的窗口句柄id,并且操作为当前活动窗口
    利用python+win32获取windows中任务中所有的窗口标题
    C++核心知识
    C++基础知识
  • 原文地址:https://www.cnblogs.com/Jingge/p/10724807.html
Copyright © 2011-2022 走看看