美文网首页
彻底明白 VUE 的 .sync 修饰符

彻底明白 VUE 的 .sync 修饰符

作者: 前端好有趣 | 来源:发表于2020-08-06 18:15 被阅读0次

在有些情况下,我们可能需要对一个 prop 进行 “双向绑定” 。要想实现父子组件的 “双向绑定” ,有如下几种办法。

第一种方式:

我们可以这么做,考虑如下代码

父组件:

<template>
  <div class="app">
    -------------- 父 -------------- <br>
    <input type="text" v-model="doc.title">
    {{ doc.title }}
    <text-document :title="doc.title" @updatetitle="doc.title = $event"></text-document>
  </div>
</template>

<script>
import child from "../components/child";

export default {
  data () {
    return {
      doc: {
        title: 'hello world'
      }
    }
  },
  components: {
    'text-document': child,
  },
}
</script>

子组件:

<template>
  <div>
    -------------- 子 -------------- <br>
    <input @input="sendMsg" :value="title" />
    {{ title }}
  </div>
</template>
<script>
export default {
  inheritAttrs: false,
  props: ['title'],
  computed: {},
  data () {
    return {}
  },
  methods: {
    sendMsg (event) {
      this.$emit('updatetitle', event.target.value)
    }
  }
}
</script>

自行复制代码,查看运行结果:

运行结果

我们在父组件的 input 框内随意输入字符,子组件的显示区域和 input 框中能够立马回显父组件中的数据。在子组件的 input 框内随意输入字符,亦然。

Tips: 有同学可能会问,代码中的 doc.title = $event 是什么意思?我在这里解释一下:

其实 doc.title = $event 只是一个简写,这里的原始写法为: (data) => doc.title = data 。如果连这都还看不懂的同学,我建议先去看看 $emit 的用法。

然后,($event) => doc.title = $event 可以简写成 doc.title = $event

注意,不能简写成 doc.title = data,因为在事件中,$event 作为一个特殊符号,代表事件是能够被直接识别的,data 只是一个普通字符,不能被识别。

接下来,我们换一种方式,注意对比简单的代码变化细节。

第二种方式:

父组件修改项:

<text-document :title="doc.title" @update:title="doc.title = $event"></text-document>

子组件修改项:

this.$emit('update:title', event.target.value)

对,我们分别只修改了父子组件的各一行代码。将原来的 updatetitle 变为了 update:title。至此,代码运行没有问题。

第三种方式:

第三种方式,我们只需要对父组件的一行代码进行修改。

父组件修改项:

<text-document :title.sync="doc.title"></text-document>

注意,至此我们使用到了 .sync 修饰符。现在,我们再回顾一下修改前的父组件代码,然后对两者进行对比。

<text-document :title="doc.title" @update:title="doc.title = $event"></text-document>

对比修改前的代码,我们发现:

之前代码中的 :title=doc.title@update:title="doc.title = $event" 都不见了,取而代之的是 :title.sync="doc.title

这说明,.sync 修饰符在这里承载了两个功能:

  1. .sync 将 title 作为 props 传给了子组件,title 接收 父组件 doc.title 的值
  2. .sync 接收了子组件 $emit 触发的变化,并将相应的变化赋值给了父组件的 doc.title

注意到了吗?:title.sync="doc.title" 只是:title="doc.title" @update:title="doc.title = $event"的一个语法糖而已。

就这样,名为 title 的 props 就在 父子组件 中实现了双向绑定。

相关文章

  • 深入理解vue 修饰符sync【 vue sync修饰符示例】

    在说vue 修饰符sync前,我们先看下官方文档:vue .sync 修饰符,里面说vue .sync 修饰符以前...

  • 2018-10-11

    vue 修饰符sync【 vue sync修饰符示例】 先看下一个参考的文章:深入理解vue 修饰符sync【 v...

  • 彻底明白VUE修饰符sync

    对于VUE的初学者来讲,肯定会感觉prop的写法很麻烦,很讨厌!你肯定想如果prop也可以实现双向绑定那怎是一个爽...

  • 彻底明白 VUE 的 .sync 修饰符

    在有些情况下,我们可能需要对一个 prop 进行 “双向绑定” 。要想实现父子组件的 “双向绑定” ,有如下几种办...

  • vue3 的 v-model

    子组件 类似于vue2的.sync 修饰符

  • .sync修饰符及MVVM

    .sync修饰符 父组件 子组件 vue的数据响应式

  • 关于vue的一些实践

    参考文章:vue中需要注意的问题总结(上) 1.对于sync的使用 参考vue的修饰符sync 在有些情况下,我们...

  • Vue3的组件上v-model的用法

    Vue3的组件上v-model的用法用法示例: 相当于 vue 2 注:Vue3 v-model没有.sync修饰符

  • vue .sync修饰符

    今天又翻了一下vue文档,.sync修饰符一直没有领会,今天总算弄清楚了,它允许在子组件中直接改变父组件数据,而我...

  • vue sync 修饰符

    原文地址:https://juejin.im/post/5b6afe9e5188251b1f228666 sync...

网友评论

      本文标题:彻底明白 VUE 的 .sync 修饰符

      本文链接:https://www.haomeiwen.com/subject/cwbirktx.html