Vue框架,sync修饰符原理详解和代码demo、视频教程

一、视频教程

二、原理和作用

原理

  • sync修饰符本质就是语法糖::属性名和@update:属性名
    :isShow.sync="isShow" 等价于
    :isShow="isShow" @update:isShow="isShow=$event"
    
  • prop属性名,可以自定义,非固定为value
  • 当属性名确定的时候,子组件的事件同时确定。比如当属性名为 isShow,子组件的事件必须为 update:isShow,否则 sync 会失效。

作用

  • 封装弹框类的基础组件,visible属性 true显示false隐藏
  • 可以实现子组件与父组件数据的双向绑定,简化代码。

三、自定义组件实现sync修饰符

  • 当自定义组件实现sync修饰符时,子组件 props 接收的变量名没有限制,但是该变量名与事件名需要一一对应,否则sync修饰符将失效,比如当变量名为show时,事件名必须为 update:show。

  • 可自行更改代码,即可理解

  • 优点:父组件v-model 简化代码,实现子组件和父组件数据双向绑定。父组件简化了代码,子组件的代码并没有简化

  • 页面显示效果
    在这里插入图片描述

单文件demo

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Prop</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.22/dist/vue.js"></script>

</head>
<!--

-->

<body>

    <div id="app">
        当前isShow的值为:{{isShow}}<br>
        <button @click="openDialog">退出按钮</button>
        <base-dialog :show.sync="isShow"></base-dialog>
    </div>
    <script>
        Vue.component('BaseDialog', {
            template: "<div class=\"base-dialog-wrap\" v-show=\"show\">\n    <div class=\"base-dialog\">\n      <div class=\"title\">\n        <h3>温馨提示:</h3>\n        <button class=\"close\" @click=\"closeDialog\">x</button>\n      </div>\n      <div class=\"content\">\n        <p>你确认要退出本系统么?</p>\n      </div>\n      <div class=\"footer\">\n        <button @click=\"closeDialog\">确认</button>\n        <button >取消</button>\n      </div>\n    </div>\n  </div>",
            methods:{
                closeDialog(){
                    this.$emit('update:show',false)
                }
            },
            props: {
                show: Boolean,
            }
        })
        let vm = new Vue({
            el: "#app",
            data() {
                return {
                    isShow: false,
                }
            },
            methods: {
                openDialog() {
                    this.isShow = true
                },
            }
        })
    </script>
</body>

<style scoped>
    .base-dialog-wrap {
        width: 300px;
        height: 200px;
        box-shadow: 2px 2px 2px 2px #ccc;
        position: fixed;
        left: 50%;
        top: 50%;
        transform: translate(-50%, -50%);
        padding: 0 10px;
    }
    .base-dialog .title {
        display: flex;
        justify-content: space-between;
        align-items: center;
        border-bottom: 2px solid #000;
    }
    .base-dialog .content {
        margin-top: 38px;
    }
    .base-dialog .title .close {
        width: 20px;
        height: 20px;
        cursor: pointer;
        line-height: 10px;
    }
    .footer {
        display: flex;
        justify-content: flex-end;
        margin-top: 26px;
    }
    .footer button {
        width: 80px;
        height: 40px;
    }
    .footer button:nth-child(1) {
        margin-right: 10px;
        cursor: pointer;
    }
</style>

</html>

组件版demo(两个文件)

  • App.vue
<template>
  <div class="app">
    当前isShow的值为:{{isShow}}<br>
    <button @click="openDialog">退出按钮</button>
    <BaseDialog :isShow.sync="isShow"></BaseDialog>
  </div>
</template>

<script>
import BaseDialog from './components/BaseDialog.vue'
export default {
  data() {
    return {
      isShow: false,
    }
  },
  methods: {
    openDialog() {
      this.isShow = true
    },
  },
  components: {
    BaseDialog,
  },
}
</script>

<style>
</style>
  • BaseDialog.vue
<template>
  <div class="base-dialog-wrap" v-show="isShow">
    <div class="base-dialog">
      <div class="title">
        <h3>温馨提示:</h3>
        <button class="close" @click="closeDialog">x</button>
      </div>
      <div class="content">
        <p>你确认要退出本系统么?</p>
      </div>
      <div class="footer">
        <button @click="closeDialog">确认</button>
        <button >取消</button>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  props: {
    isShow: Boolean,
  },
  methods:{
    closeDialog(){
      this.$emit('update:isShow',false)
    }
  }
}
</script>

<style scoped>
.base-dialog-wrap {
  width: 300px;
  height: 200px;
  box-shadow: 2px 2px 2px 2px #ccc;
  position: fixed;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  padding: 0 10px;
}
.base-dialog .title {
  display: flex;
  justify-content: space-between;
  align-items: center;
  border-bottom: 2px solid #000;
}
.base-dialog .content {
  margin-top: 38px;
}
.base-dialog .title .close {
  width: 20px;
  height: 20px;
  cursor: pointer;
  line-height: 10px;
}
.footer {
  display: flex;
  justify-content: flex-end;
  margin-top: 26px;
}
.footer button {
  width: 80px;
  height: 40px;
}
.footer button:nth-child(1) {
  margin-right: 10px;
  cursor: pointer;
}
</style>
  • 24
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 中,.sync 是一个语法糖,它能够简化父子组件之间的数据传递。.sync 修饰符实际上是一个双向绑定的简写形式,它会自动创建一个名为 update:propName 的自定义事件,并且在父组件中监听这个事件,然后更新子组件的数据。 例如,在父组件中使用子组件时,可以通过 v-bind.sync 修饰符将父组件的数据与子组件的数据绑定在一起: ``` <template> <ChildComponent :message.sync="messageFromParent"></ChildComponent> </template> ``` 这里的 .sync 修饰符会自动将子组件的 message 属性与父组件的 messageFromParent 属性进行双向绑定,并且在父组件中监听名为 update:message 的自定义事件,以更新父组件的数据。 ``` <template> <ChildComponent :message.sync="messageFromParent"></ChildComponent> <button @click="updateMessage">Update Message</button> </template> <script> export default { data() { return { messageFromParent: 'Hello World' } }, methods: { updateMessage() { this.messageFromParent = 'Hello Vue' } } } </script> ``` 在子组件中,可以通过 $emit() 方法触发 update:message 事件,以更新父组件的数据。 ``` <template> <div> <input type="text" v-model="message"> <button @click="$emit('update:message', message)">Update Message</button> </div> </template> <script> export default { props: { message: { type: String } } } </script> ``` 这样,父组件和子组件之间就可以通过 .sync 修饰符实现双向数据绑定了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值