彻底理解sync的用法

简介: 彻底理解sync的用法

彻底理解sync的用法

对于VUE的初学者来讲,肯定会感觉prop的写法很麻烦,很讨厌!你肯定想如果prop也可以实现双向绑定那将是怎样的!不过现实是残酷的,如果子组件可以任意修改父组件的内容,那势必会带来数据的混乱,从而造成维护的困扰!毕竟父组件也是有尊严的!

官方推荐使用一种update:my-prop-name 的模式来替代事件触发,目的是为了优雅而不粗鲁的实现父子组件间的双向绑定!先来完成一个小功能:通过父组件按钮将子组件显示出来,如图:

246b09a52a7a9e8cd078aaa8121a200a.gif

父组件代码:

<template>
        <div>
            <input type="button" 
                   value="我是父组件中的按钮" 
                   @click="show">
            <child v-show="isShow"/>
        </div>
    </template>
    <script>
        import child from "@/components/child"
        export default {
            data() {
                return {
                    isShow:false
                }
            },
            components:{
                child
            },
            methods:{
                show(){
                    this.isShow=true;
                }
            }
        }
    </script>

子组件child代码:

<template>
        <div>
             我是一个子组件,我在红色的海洋里!
        </div>
    </template>

接下来加个需求,在子组当中增加一个按钮,通过该按钮来将自已隐藏起来!需要借助父子之间的传值了!如图:

c3c5a3afb79043ec5b71d948c2ac938d.gif

父组件代码:

<template>
        <div>
            <input type="button"
                   value="我是父组件中的按钮"
                   @click="show">
            <child @upIsShow="changeIsShow" v-show="isShow"/>
        </div>
    </template>
    <script>
        import child from "@/components/child"
        export default {
            data() {
                return {
                    isShow:false
                }
            },
            components:{
                child
            },
            methods:{
                show(){
                    this.isShow=true;
                },
                changeIsShow(bol){
                    this.isShow=bol;
                }
            }
        }
    </script>

子组件代码:

<template>
        <div>
             我是一个子组件,我在红色的海洋里!
            <input type="button" value="点我隐身" @click="upIsShow">
        </div>
    </template>
    <script>
        export default {
            methods:{
                upIsShow(){
                    this.$emit("upIsShow",false);
                }
            }
        }
    </script>

如果我要将父组件中的事@upIsShow修改为@update:isShow是没有问题的:

<child @update:isShow="changeIsShow" v-show="isShow"/>

子组件的emit自然也要做对应调整:

upIsShow(){
    this.$emit("update:isShow",false);
}

运行一下,一切正常!

那么如果现在我将父组件的changeIsShow直接写成匿名函数,也能运行吧:

<child @update:isShow="function(bol){isShow=bol}" v-show="isShow"/>

再次运行,一切还是那么美好,真好!

现在我将那匿名函数改成箭头函数,不过分吧:

<child @update:isShow="bol=>isShow=bol" v-show="isShow"/>

再运行一次,完美,真好!

最后我将上面那行代码做最后一次修改:

<child :isShow.sync="isShow" v-show="isShow"/>

至此终于涉及到了sync了。以上代码 :isShow.sync="isShow"其实是 @update:isShow="bol=>isShow=bol"语法糖。是其一种简写形式。附上完整代码。

父组件:

<template>
        <div>
            <input type="button"
                   value="我是父组件中的按钮"
                   @click="show">
            <child :isShow.sync="isShow" v-show="isShow"/>
        </div>
    </template>
    <script>
        import child from "@/components/child"
        export default {
            data() {
                return {
                    isShow:false
                }
            },
            components:{
                child
            },
            methods:{
                show(){
                    this.isShow=true;
                },
                changeIsShow(bol){
                    this.isShow=bol;
                }
            }
        }
    </script>

子组件:

<template>
        <div>
             我是一个子组件,我在红色的海洋里!
            <input type="button" value="点我隐身" @click="upIsShow">
        </div>
    </template>
    <script>
        export default {
            methods:{
                upIsShow(){
                    this.$emit("update:isShow",false);
                }
            }
        }
    </script>

建议使用sync,简单,快捷,有档次!


相关文章
|
11天前
|
数据可视化 JavaScript
使用.sync 修饰符的最佳实践
在组件间通信时,使用 `.sync` 修饰符可以简化父子组件之间的双向数据绑定。通过在子组件中使用 `v-bind.sync`,父组件可以监听并同步子组件的属性变化,实现高效的数据传递和更新。
|
Java
synchronize 三大作用、三大用法
synchronize 三大作用、三大用法
113 0
|
存储 缓存 Go
sync.singleflight 到底怎么用才对?
sync.singleflight 到底怎么用才对?
119 0
|
存储 缓存 Go
原来sync.Once还能这么用
原来sync.Once还能这么用
161 0
原来sync.Once还能这么用
|
程序员 Go
你真的了解 sync.Once 吗
你真的了解 sync.Once 吗
181 0
|
缓存 安全 算法
Go基础:channel、定时器、select、锁、sync、atomic
Go基础:channel、定时器、select、锁、sync、atomic
312 0
Go基础:channel、定时器、select、锁、sync、atomic
|
安全 Java Go
sync
sync包有以下几个内容: (1)sync.Pool 临时对象池 (2)sync.Mutex 互斥锁 (3)sync.RWMutex 读写互斥锁 (4)sync.WaitGroup 组等待 (5)sync.Cond 条件等待 (6)sync.Once 单次执行 一、临时对象池 Pool可以用来存储临时对象,其实原理就是这个对象池指向对象变量,以防没有变量指向对象时,被GC所回收。
1423 0
|
Java C# vr&ar
C# Task用法
原文:C# Task用法 1、Task的优势   ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便。比如:   ◆ ThreadPool不支持线程的取消、完成、失败通知等交互性操作;   ◆ ThreadPool不支持线程执行的先后次序;   以往,如果开发者要实现上述功能,需要完成很多额外的工作,现在,FCL中提供了一个功能更强大的概念:Task。
1648 0