文章目录
 双向数据传递v-modemodel.sync
 
双向数据传递
 
这里提到的父子组件双向数据传递,即父子组件可以进行互相修改我们知道一般父向子传值,子通过props进行接收,子向父传值,是通过$emit发布一个事件,父通过事件的监听获取到子的值,详细可见vue-组件之间的通信这里我们通过v-model,model及sync来实现父子双向的数据传递 
v-mode
 
在vue中的一些表单中,我们经常通过v-mode来实现数据的双向绑定,但其实v-model的本质是一个语法糖,如下代码<input v-model="test">本质上是<input :value="test" @input="test = $event.target.value">即对input绑定了value的属性,并监听了input事件我们通过v-model这种语法糖的形式,实现自定义的一个VModel组件,从而实现父子的双向数据传递,代码如下: 
<template
>
    <div
>
       <div
>
               V-MODEL-INPUT:<VModel v
-model
="VModelVal"></VModel
>
               V-MODEL-INPUT-PARENT: <input type
="text" v
-model
="VModelVal">
       </div
>
    </div
>
</template
>
<script
>
import VModel 
from './VModel';
export default {
  data() {
    return {
            VModelVal
:'VModelVal'
    };
  },
  components
:{
        VModel
    
}
}
</script
>
<template
>
  <div 
class="v-model-wrapper">
      <input type
="text" :value
="value" @input
="handleInput">
  </div
>
</template
>
<script
>
  export default {
    data(){
       return {}
    },
    props
:{
      value
: String
,
      default:''
    },
    methods
:{
      handleInput(e
){
        this.$emit('input', e
.target
.value
);
      }
    }
  }
</script
>
 
model
 
默认情况下,一个组件的v-model会把value用作prop, 且把input用过event当我们在一个自定义组件上使用v-model并不能实现双向绑定,因为自定的组件并没有默认的value和input事件,在使用时,我们需要按照上面那样显式的去声明定义这些东西。这时,model选项就派上用场了,在定义组件的时候,指定prop的值和监听的事件。如下:我们通过修改prop及event来实现一个自定义的v-model,从而实现父子组件的双向数据传递 
<template
>
    <div
>
       <div
>
               MODEL-INPUT:<Model v
-model
="ModelVal"></Model
>
               MODEL-INPUT-PARENT: <input type
="text" v
-model
="ModelVal">
       </div
>
    </div
>
</template
>
<script
>
import Model 
from './Model';
export default {
  data() {
    return {
            ModelVal
:'ModelVal'
    };
  },
  components
:{
        Model
    
}
}
</script
>
<template
>
  <div
>
      <input type
="text" :value
="val" @keyup
="handleInput">
  </div
>
</template
>
<script
>
  export default {
    model
:{
      prop
:'val',
      event
: 'keyup'
    },
    data(){
       return {}
    },
    props
:{
      val
: {
        type
: String
,
        default: ''
      }
    },
    methods
:{
      handleInput(e
){
        this.$emit('keyup', e
.target
.value
);
      }
    }
  }
</script
>
 
.sync
 
当子组件变更父组件数据时,推荐以update:myPropName的模式触发事件举个例子,在一个包含 title prop 的假设的组件中,我们可以用以下方法表达对其赋新值的意图 
this.$emit('update:title', newTitle
)
 
然后父组件可以监听那个事件并根据需要更新一个本地的数据 property。例如: 
<text
-document
  v
-bind
:title
="doc.title"
  v
-on
:update
:title
="doc.title = $event"
></text
-document
>
 
为了方便起见,我们为这种模式提供一个缩写,即 .sync 修饰符, 用法如下: 
<template
>
    <div
>
       <div
>
               SYNC-INPUT:<SYNC :syncVal
.sync
='SyncVal'></SYNC>
               SYNC-INPUT-PARENT: <input type
="text" v
-model
="SyncVal">
       </div
>
    </div
>
</template
>
<script
>
import SYNC from './Model';
export default {
  data() {
    return {
            SyncVal
:'SyncVal'
    };
  },
  components
:{
        SYNC
    }
}
</script
>
<template
>
  <div
>
      <input type
="text" :value
="syncVal" @keyup
="handleInput">
  </div
>
</template
>
<script
>
  export default {
    data(){
       return {}
    },
    props
:{
      syncVal
: {
        type
: String
,
        default: ''
      }
    },
    methods
:{
      handleInput(e
){
        this.$emit('update:syncVal', e
.target
.value
);
      }
    }
  }
</script
>
 
文章参考: Vue.js vue的model选项 Vue中从v-model,model,.sync到双向数据传递,再到双向数据绑定