Vue 父子组件通信v-model .sync修饰符

一、 v-model简化父子组件通信

v-model是什么?

v-model 是Vue框架的一种内置的API指令,本质是一种语法糖写法。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。

v-model实现表单的双向绑定

<template>
  <div>
    <input type="text"
           v-model="msg">
    <p>{{msg}}</p>
  </div>
</template>
<script>
export default {
  data () {
    return {
      msg: ''
    }
  }
}
</script>

原理:v-model是v-bind和v-on:input的结合,即监听了表单的input事件,然后修改value属性对应的值

完整代码可写为:

<template>
  <div>
    <input type="text"
           :value="msg"
           @input="bind">
    <p>{{msg}}</p>
  </div>
</template>
<script>
export default {
  data () {
    return {
      msg: ''
    }
  },
  methods: {
    bind () {
      this.msg = event.target.value
    }
  }
}
</script>
简化父子通信代码

普通写法

父组件(App.vue)

<template>
  <div class="wrapper">
    <!-- 自定义属性可以随意指定名字,自定义事件名称也可以随意指定 -->
    <select-comp :value='selectId' @input="selectId=$event"></select-comp> 
    {{ selectId }}
  </div>
</template>

<script>
import SelectComp from './components/SelectComp.vue'
export default {
  name: 'App',
  data() {
    return{
      selectId:'1001',

     }
  },
  components: {
    SelectComp,

  },
  methods: {},
}
</script>
<style lang="less" scoped></style>

子组件(SelectComp.vue)

<template>
  <!-- 
    selectId这个数据从父亲传递过来的,不能直接修改 所以不能使用v-model绑定数据
    要想改变从父亲传递过来的数据 采用子传父
 -->
  <select :value="value"  @change='changeOption'>
    <option value="1001">北京</option>
    <option value="1002">上海</option>
    <option value="1003">广州</option>
    <option value="1004">深圳</option>
  </select>
</template>

<script>
export default {
  data() {
    return {};
  },
  props: {
    value:{
        type: String,
        required: true
    }
   
  },
   methods: {
        changeOption(e){
            this.$emit('input',e.target.value)
        }
    }
};
</script>
<style>
</style>

v-model简化写法
父组件(App.vue)

<template>
  <div class="wrapper">
    <!-- 自定义属性可以随意指定名字,自定义事件名称也可以随意指定 -->
    <select-comp v-model="selectId"></select-comp> 
    {{ selectId }}
  </div>
</template>

<script>
import SelectComp from './components/SelectComp.vue'
export default {
  name: 'App',
  data() {
    return{
      selectId:'1001',

     }
  },
  components: {
    SelectComp,

  },
  methods: {},
}
</script>
<style lang="less" scoped></style>

这里::value='selectId' @input="selectId=$event"
换成了 v-model="selectId"

完整代码
<select-comp v-model="selectId"></select-comp>

子组件(SelectComp.vue)

<template>

  <select :value="value"  @change='changeOption'>
    <option value="1001">北京</option>
    <option value="1002">上海</option>
    <option value="1003">广州</option>
    <option value="1004">深圳</option>
  </select>
</template>

<script>
export default {
  data() {
    return {};
  },
  props: {
    value:{
        type: String,
        required: true
    }
   
  },
   methods: {
        changeOption(e){
            this.$emit('input',e.target.value)
        }
    }
};
</script>
<style>
</style>

这里:传递参数固定为value$emit()中的事件名成固定为input

<select :value="value" @change="handleChange">...</select>
props: {
  value: String
},
methods: {
  handleChange (e) {
    this.$emit('input', e.target.value)
  }
}

v-model简化写法缺点: value属性 语义化不友好

二、 .sync修饰符

.sync修饰符作用:

可以实现 子组件父组件数据双向绑定,简化代码

简单理解:子组件可以修改父组件传过来的props值

当我们从父组件向子组件传入一个变量,子组件需要根据自身的变化引起变量值的改变时
可应用至弹框的开启、关闭

语法

父组件


    <SelectComp :selectId.sync='selectId'/>
    <!-- 等价于 -->
    <SelectComp :selectId='selectId' @update:selectId='selectId = $event '/> 

子组件

props: {
  visible: Boolean
},

this.$emit('update:visible', false)

示例
父组件(App.vue)

<template>
  <div class="wrapper">
    <SelectComp :selectId.sync='selectId'/>
  </div>
</template>

<script>
import SelectComp from './components/SelectComp.vue'
export default {
  name: 'App',
  data() {
    return{
      selectId:'1001'
     }
  },
  components: {
    SelectComp
  },
  methods: {},
}
</script>

SelectComp.vue

<template>

  <select :value="selectId"  @change='changeOption'>
    <option value="1001">北京</option>
    <option value="1002">上海</option>
    <option value="1003">广州</option>
    <option value="1004">深圳</option>
  </select>
</template>

<script>
export default {
  data() {
    return {};
  },
  props: {
    selectId:{
        type: String,
        required: true
    }
  },
   methods: {
        changeOption(e){
            this.$emit('update:selectId',e.target.value)
        }
    }
};
</script>

使用v-model实现了父子组件的双向绑定(父亲的数据传递给儿子,儿子可以修改父亲数据)

方法一:

  • 在父组件的子组件标签上使用v-model=‘父数据’

  • 儿子要通过value接收父亲数据,通过触发this.$emit(‘input’,参数)改变父亲的数据

方法二:

  • 在父组件的子组件标签上使用:自定义属性(语义).sync=“父数据”

  • 儿子要通过绑定自定义属性接收父亲数据,通过触发this.$emit(‘updata:自定义属性名’,参数)概念父亲的数据

方法二与方法一区别在于属性语义化

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 中,.sync 是一个语法糖,它能够简化父子组件之间的数据传递。.sync 修饰符实际上是一个双向绑定的简写形式,它会自动创建一个名为 update:propName 的自定义事件,并且在父组件中监听这个事件,然后更新子组件的数据。 例如,在父组件中使用子组件时,可以通过 v-bind.sync 修饰符将父组件的数据与子组件的数据绑定在一起: ``` <template> <ChildComponent :message.sync="messageFromParent"></ChildComponent> </template> ``` 这里的 .sync 修饰符会自动将子组件的 message 属性与父组件的 messageFromParent 属性进行双向绑定,并且在父组件中监听名为 update:message 的自定义事件,以更新父组件的数据。 ``` <template> <ChildComponent :message.sync="messageFromParent"></ChildComponent> <button @click="updateMessage">Update Message</button> </template> <script> export default { data() { return { messageFromParent: 'Hello World' } }, methods: { updateMessage() { this.messageFromParent = 'Hello Vue' } } } </script> ``` 在子组件中,可以通过 $emit() 方法触发 update:message 事件,以更新父组件的数据。 ``` <template> <div> <input type="text" v-model="message"> <button @click="$emit('update:message', message)">Update Message</button> </div> </template> <script> export default { props: { message: { type: String } } } </script> ``` 这样,父组件和子组件之间就可以通过 .sync 修饰符实现双向数据绑定了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值