• vue v-model与.sync详解


    用过vue的小伙伴应该都知道,使用表单绑定值的时候,我们通常会用到一个 v-model 指令,它可以在表单以及元素上面创建双向数据绑定

    1、但是其实 v-model 是一个语法糖,它真的是实现是这样的:

    1. "val" type="text">
    2. // 本质:
    3. <input :value="val" @input="val=$event.target.value" />

    要理解这行代码,首先你要知道 input 元素本身有个input 事件,这是 HTML5 新增加的,类似 onchange ,每当输入框内容发生变化,就会触发 input 事件,把最新的value值传给传递给val ,完成双向数据绑定的效果 。

     2、相信用 v-mode 绑定绑定表单,大家都非常熟悉,但是 v-model 还有一个作用,可以用于父子组件之间数据的双向绑定。

    1. // parent组件,也就是我们的父组件
    2. <script>
    3. import son from './son.vue'
    4. export default {
    5. components: {son},
    6. data() {
    7. return {
    8. name:"旺柴"
    9. }
    10. }
    11. }
    12. script>
    1. // son 组件,也就是我们的子组件
    2. <script>
    3. export default {
    4. // 这里必须用value名称,换成其他的无效
    5. props: {
    6. value: {
    7. type:String,
    8. required: true
    9. }
    10. }
    11. }
    12. script>

    但是有一点需要注意:由于vue是单向数据流的,所以我们不能子组件中直接修改value值,根据我们的经验,一般我们会通过在子组件中使用$emit('自定义事件名',值)的方法将值传入父组件。

    但是这里不能这样做,因为是使用v-model绑定的值,我们要用@input事件进行修改

    1. // 子组件中通过 $emit()方法,绑定一个input方法,注意,只能是input

    成功修改value的值!撒花~

    3、.sync修饰符作用

    .sync修饰符可以实现子组件与父组件的双向绑定,并且可以实现子组件同步修改父组件的值。

    不使用.sync的情况下是: 

    1. // 父组件:
    2. <script>
    3. import mySon from "./components/mySon.vue"
    4. export default {
    5. components: {
    6. mySon
    7. },
    8. data () {
    9. return {
    10. name: '旺柴'
    11. };
    12. },
    13. methods: {
    14. changeName (value) {
    15. this.name = this.name + value
    16. }
    17. },
    18. }
    19. script>
    20. // 子组件
    21. <template>
    22. <div @click='changeName'>
    23. {{name}}
    24. div>
    25. template>
    26. <script>
    27. export default {
    28. props: {
    29. name: {
    30. type: String,
    31. default: ''
    32. }
    33. },
    34. methods: {
    35. changeName () {
    36. this.$emit('changeName', '汪汪汪')
    37. }
    38. },
    39. }
    40. script>

    使用 .async。

    1. // 父组件
    2. <script>
    3. import mySon from "./components/mySon.vue"
    4. export default {
    5. components: {
    6. mySon
    7. },
    8. data () {
    9. return {
    10. name: '旺柴'
    11. };
    12. },
    13. }
    14. script>
    15. // 子组件
    16. <template>
    17. <div @click='changeName'>
    18. {{name}}
    19. div>
    20. template>
    21. <script>
    22. export default {
    23. props: {
    24. name: {
    25. type: String,
    26. default: ''
    27. }
    28. },
    29. methods: {
    30. changeName () {
    31. this.$emit('update:name', this.name + '汪汪汪')
    32. }
    33. },
    34. }
    35. script>

    区别在于往回传值的时候. async 的 $emit 所调用的事件名必须是update:属性名。

    4、.sync与v-model区别:
    相同点:都是语法糖,都可以实现父子组件中的数据的双向通信。
    区别点:
    格式不同。 v-model=“num”, :num.sync=“num”
    v-model: @input + value
    :num.sync: @update:num
    v-model只能用一次;.sync可以有多个。

  • 相关阅读:
    FFmpeg 命令:从入门到精通 | ffppeg 命令提取音视频数据
    多路h265监控录放开发-(10)XCameraRecord类完成视频的录制
    LeetCode 周赛上分之旅 #47 前后缀分解结合单调栈的贡献问题
    【2024秋招】2023-9-16 贝壳后端开发二面
    深入浅出计算机组成原理04-穿越功耗墙,我们该从哪些方面提升“性能”?
    10个美妙的Python装饰器
    k8s TLS bootstrap解析-k8s TLS bootstrap流程分析
    maven打包项目,然后给其他项目引用
    淘宝/天猫API:item_videolist-按分类搜索淘宝直播接口
    使用Linux编写最简单的hello world驱动程序
  • 原文地址:https://blog.csdn.net/small_cutey/article/details/126865216