VUE修饰符sync使用

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

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

父组件代码

<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>

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

父组件代码:

<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只是给大家伙提供了一种与父组件沟通的思路而已!所以在后面日子里,你如果只是单纯的在子组件当中修改父组件的某个数据时,建议使用sync,简单,快捷,有档次!真好!

在来一个案例:
父组件:

<template>
    <div>
        <Aninput :keyword.sync="keywords" placeholder="搜索扫描任务" @trigger-event="getlist"/>

    </div>
</template>
<script>
    import Aninput from "./Aninput"
    export default {
        data() {
            return {
                keywords:"",
            }
        },
        components:{
            Aninput
        },
        methods:{
            getlist(){
                console.log('调取接口')
            }
        }
    }
</script>

子组件:

<template>
  <div class="input-wrapper">
    <input v-model="_keyword"  :clearable="true" @keypress.enter="trigger">
  
  </div>
</template>
<script>


export default {
    data(){
        return{

        }
    },
    props:{
      keyword:{
        type: String,
        default:""
      }
    },
    computed:{
        _keyword:{
            get(){
               return  this.keyword
            },
            set(val){
                this.$emit('update:keyword', val)
            }
        }
    },
    methods:{
        trigger() {
            this.$emit('trigger-event')
            console.log('111')
        }
    }
}
</script>

原文链接:https://blog.csdn.net/z591102/article/details/105506866

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue修饰符sync是用于实现子组件对父组件数据的双向绑定。当我们需要在子组件中修改父组件中的数据时,可以使用sync修饰符。具体的实现方法如下: 在父组件中,通过v-bind指令传递数据,并使用sync修饰符,如下所示: ``` <template> <child :data.sync="parentData"></child> </template> <script> export default { data() { return { parentData: 'hello' } }, ... } </script> ``` 在子组件中,通过props接收父组件传递过来的数据,并使用$emit方法将修改的数据传递回父组件,如下所示: ``` <template> <div> <input type="text" v-model="localData" @input="updateData"> </div> </template> <script> export default { props: { data: String }, data() { return { localData: this.data } }, methods: { updateData() { this.$emit('update:data', this.localData); } } } </script> ``` 在以上的代码中,子组件通过props接收父组件传递过来的数据,并将数据保存在localData属性中。当用户修改localData属性时,触发updateData方法,该方法使用$emit方法将修改后的数据传递回父组件。 在父组件中,监听子组件中的update:data事件,并将传递过来的数据赋值给parentData属性,如下所示: ``` <template> <child :data.sync="parentData" @update:data="handleUpdate"></child> </template> <script> export default { data() { return { parentData: 'hello' } }, methods: { handleUpdate(data) { this.parentData = data; } } } </script> ``` 在以上的代码中,父组件监听子组件中的update:data事件,并将传递过来的数据赋值给parentData属性。由于父组件使用sync修饰符,因此可以直接使用parentData属性获取子组件中修改后的数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值