vue model属性

485 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

vue是单项数据流,子组件不能直接修改父组件传过来的值,那非输入元素如何时间实时更新

我们常用的指令中v-model他实际上是语法糖

允许一个自定义组件在使用 v-model 时定制 prop 和 event。默认情况下,一个组件上的 v-model 会把 value 用作 prop 且把 input 用作 event,但是一些输入类型比如单选框和复选框按钮可能想使用 value prop 来达到不同的目的。使用 model 选项可以回避这些情况产生的冲突。

简单来讲就是将组件实现数据双向绑定的效果,需要注意的是自定义组件字眼表明其主要的使用场景是在组件内部,

export default { 
   props: { 
        num: Number ,
        list: { 
            type: Array, 
            default: () => { //属性默认值
                 return [ 
                      { value: '1', label: '111'}, 
                      { value: '2', label: '222'}, 
                      { value: '3', label: '333'}, 
                  ]
             }, 
        }
   }, 
   model: { 
        prop: 'num', // v-model接收的值=props的num属性接收的值
        event: 'update' //v-model发生变化时触发的方法

   }, 
   computed: { 
      currentNum: { 
           get() { 
              return this.num 
           }, 
           set(currentNum) { 
                  this.$emit('update', currentNum) 
           } 
       } 
   } 
   methods: { 
      add() { 
         this.currentNum++ 
         } 
      }
   }

这种写法在于,input的value属性和input方法是固有的内容,所以v-model可以约定成俗的直接调用这两者,

 但我们自定义的组件可没有这种固有属性与对应的固有方法,那么model就用来设置这种关系的属性

外部使用:

<template>
  <myComponents v-model="num" :list="list"></myComponents >
</template>

<script>
import myComponent from ‘xxx/xxx/myComponent.vueexport default {
  cpmponents:{
    myComponent
  },
  data() {
    return {
        num:''
    };
  }
};
</script>

父组件上如果有多属性:

可以使用v-model属性传递值做交互,也可以使用 .sync 修饰符做数据双向绑定交互处理,父组件通过 props 将值传给子组件,子组件再通过 $emit 将值传给父组件,父组件通过事件监听获取子组件传过来的值,如果想要简化这里的代码,可以使用.sync修饰符,实际上就是一个语法糖

//父组件
<child-box :value.sync="value" :label.sync="label" :option= "list"></child-box>

//自组件中在
// childBox.vue 
export default {
    methods: { 
        change(val) { 
            this.$emit('update:label', this.innerLabel)  
            this.$emit('update:value', val); 
        }
    }
}