唯品秀前端博客

通常我们知道,父子组件数据传递:子组件通过props接收父组件传过来的数据,想改变父组件这个数据,那么子组件通过$emit方法触发父组件身上的自定义事件从而改变这个值,晚上听群里小伙伴说起父子组件通信话题,了解到sync修饰符,可以在子组件中直接去修改父组件对应的值,有点叼,打破单向数据流常规,之前并没去关注这东西,带着好奇心赶紧查看了一番。

vue .sync 修饰符以前存在于vue1.0版本里,但是在在 2.0 中移除了 .sync 。但是在 2.0 发布之后的实际应用中,发现 .sync 还是有其适用之处,从 2.3.0 起vue重新引入了 .sync 修饰符,但是这次它只是作为一个编译时的语法糖存在。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<!DOCTYPE html>
<html lang="zh-cn">

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    <link rel="stylesheet" type="text/css" href="./fontFace.css">
    <script crossorigin="anonymous" integrity="sha384-+jvb+jCJ37FkNjPyYLI3KJzQeD8pPFXUra3B/QJFqQ3txYrUPIP1eOfxK4h3cKZP"
        src="https://lib.baomitu.com/vue/2.6.11/vue.js"></script>

</head>

<body>
    <div id="app">
        <div class="details">
            <my-component :show.sync='stateShow' style="border:1px solid #ccc;"></my-component>
            <button @click="changeValue">切换状态</button>
            {{stateShow}}
        </div>
    </div>
</body>
<script>
    Vue.component('my-component', {
        template: `<div v-if="show">
                <p>默认初始值是{{show}},所以是显示的</p>
                <button @click.stop="closeDiv">关闭</button>
                // 实际上这里直接下面方式写也没问题
                // <button @click.stop="$emit('update:show', false)">关闭</button>
             </div>`,
        props: ['show'],
        methods: {
            closeDiv() {
                //触发 input 事件,并传入新值,注意,必须在要改变的值前面带上update
                this.$emit('update:show', false);
            }
        }
    })
    new Vue({
        el: "#app",
        data() {
            return {
                stateShow: true,
            }
        },
        methods: {
            changeValue() {
                this.stateShow = !this.stateShow
            }
        }
    })
</script>

</html>

效果

不使用sync修饰符方式

sync实际就是个语法糖,假设不用sync,我们也可以这么写,只需要在父组件上绑定一个自定义事件,名字必须是update:xx形式,然后在事件中可以接收子组件传过来的参数,如下面'data=>stateShow = data',将子组件修改后传过来的data重新赋值到父组件stateShow

1
2
3
4
5
// 父组件
<my-component :show.sync='stateShow' @update:show='data=>stateShow = data'></my-component>

// 子组件
<button @click.stop="$emit('update:show', false)">关闭</button>

小结

通过上面案例可以看出,整个流程就是父组件通过.sync修饰符将show变量传给了子组件,show变量对应的状态值是valueChild,然后子组件props接收,子组件上的事件去触发this.$emit('update:show', false);去改变show的值,并且直接同步修改了父元素上的valueChild的状态。

最后vue知识点还是很多的,解决问题的方式也很多,大家还是要多多交流,才能共同进步,三人行必有我师焉,和别人交流才能更好的察觉自己的漏洞。

本站所有文章、图片、资源等如无特殊说明或标注,均为来自互联网或者站长原创,版权归原作者所有;仅作为个人学习、研究以及欣赏!如若本站内容侵犯了原著者的合法权益,可联系我们进行处理,邮箱:343049466@qq.com
赞(4) 打赏
标签:

上一篇:

下一篇:

相关推荐

0 条评论关于"Vue.js组件通信之.sync修饰符(父子篇)"

表情

最新评论

    暂无留言哦~~
谢谢你请我吃鸡腿*^_^*

支付宝扫一扫打赏

微信扫一扫打赏