vue中的.sync有什么作用,该如何封装一个组件

如果使用了.sync就说明子组件想要通过某种方式修改父组件的数据的值,比如element-ui中的Dialog弹框中有使用到

如果不将这个弹框单独封装一个组件的情况下这个是很友好的,就不用书写@close事件来关闭弹框了,代码量很大的情况下就需要将这个弹框单独封装成一个子组件

弹框的显示是由子组件里面的:visible来控制的,false隐藏,true显示,但是:visible是由showDialog来控制的,showDialog是由父组件传递过来的,归根结底,弹框的显示与隐藏还是由父组件控制的,子组件使用prop接收父组件传递过来的showDialog,但是由于props是单项数据流,弹框打开后想要关闭,需要将:visible设置为false,可是:visible是由父组件传递过来的变量控制的,子组件不能直接修改父组件传递过来的值,需要使用$emit事件传值让父组件自己修改,然而:visible使用.sync修饰的会自动在子组件中将showDialog设置为fasle就会报错

 这个报错的大概意思就是在Vue2中组件props中的数据只能单向流动,即只能从父组件通过组件的DOM属性attribute传递props给子组件,子组件只能被动接收父组件传递过来的数据,并且在子组件中,不能修改由父组件传来的props数据

正确做法是删掉:visible的.sync然后使用$emit来配合update事件来完成,固定写法是

this.$emit('update:showDialog', false) 

其中的showDialog是props中的父组件传递过来的变量,false是将showDialog修改为false

父组件

说白了封装组件后就是谁的数据谁修改,但是.sync会自动让子组件修改父组件的值,这点要注意

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是一个基本的弹窗组件封装代码。代码使用的是Element UI库的Dialog组件,你可以根据自己的需求进行修改和定制。 ``` <template> <el-dialog :title="title" :visible.sync="visible" :modal="modal" :width="width" :fullscreen="fullscreen" :lock-scroll="lockScroll" :custom-class="customClass" :show-close="showClose" :before-close="beforeClose" > <slot></slot> </el-dialog> </template> <script> export default { name: 'MyDialog', props: { title: { // 弹窗标题 type: String, default: '' }, visible: { // 是否显示弹窗 type: Boolean, default: false }, modal: { // 是否为模态弹窗 type: Boolean, default: true }, width: { // 弹窗宽度 type: String, default: '50%' }, fullscreen: { // 是否全屏显示 type: Boolean, default: false }, lockScroll: { // 是否锁定滚动条 type: Boolean, default: true }, customClass: { // 自定义类名 type: String, default: '' }, showClose: { // 是否显示关闭按钮 type: Boolean, default: true }, beforeClose: { // 关闭前的回调函数 type: Function, default: () => {} } } } </script> ``` 这是一个非常基础的弹窗组件,你可以根据自己的需求进行扩展和修改。在使用时,你需要在父组件引入该组件,并使用v-model绑定visible属性来控制弹窗的显示和隐藏状态。 ``` <template> <div> <el-button @click="visible = true">打开弹窗</el-button> <my-dialog v-model="visible" title="弹窗标题"> <p>这是弹窗内容</p> </my-dialog> </div> </template> <script> import MyDialog from './MyDialog.vue' export default { components: { MyDialog }, data() { return { visible: false } } } </script> ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值