【vue】vue子组件修改父组件数据,不使用v-model的形式

这是我项目中自己实现的一个抽屉,感兴趣的可以复制使用(diaCounts是我挂在Vue.prototype下的一个全局变量),父组件传入参数时用 [变量名].sync,子组件触发变化时用$emit(‘update:变量名’, false)可以直接修改父组件数据,这是子组件直接修改父组件数据的其中一种方式。
父组件:

<template>
	<Drawer :visible.sync="dataVisible"></Drawer>
	<div @click="changeVisible">切换</div>
</template>
<script>
import Drawer from './components/test.vue'
export default {
	components:{Drawer},
	data(){
		return {
			dataVisible:false,
		}
	},
	methods:{
		changeVisible(){
			this.dataVisible = !this.dataVisible
		}
	}
}
</script>

子组件:

<template>
    <transition name="dia_fade_d">
        <div class="drawer_cover_yy" :style="{'z-index':getZIndex(),'width':width||'856px'}" v-show="visible" @click.self="clickSelf">
            <div class="draw_wrapper_yy" :style="{'width':width||'856px'}">
                <div class="draw_wrapper_yy_close" @click="close"></div>
                <slot></slot>
            </div>
        </div>
    </transition>
</template>
<script>
export default {
    props:{
        width:String,
        title:String,
        top:String,
        visible:{
            type:Boolean,
            default:false
        },
        showClose:{
            type:Boolean,
            default:false
        },
        beforeClose:Function,
        closeOnClickModal:{
            type:Boolean,
            default:false
        },
    },
    data(){
        return {
        }
    },
    methods:{
        getZIndex(){
            return this.$root.diaCounts++
        },
        close(){
            if(typeof this.beforeClose == 'function'){
                this.beforeClose()
            }else {
                this.$emit('update:visible', false);
            }
        },
        clickSelf(){
            if(this.closeOnClickModal){
                this.$emit('update:visible', false);
            }
        },
    },
}
</script>
<style lang="scss">
.dia_fade_d-enter-active {
  right: 0;
  animation: dia_fade_enter 0.3s;
}
 .dia_fade_d-leave-active {
  right: 0;
  animation: dia_fade_leave 0.3s;
}
@keyframes dia_fade_enter {
    0% {transform:translateX(100%);opacity: 0;}
    100% {transform:translateX(0);opacity: 1;}
}
@keyframes dia_fade_leave {
    0% {transform:translateX(0);opacity: 1;}
    100% {transform:translateX(100%);opacity: 0;}
}
.drawer_cover_yy {
    height: calc(100vh - 64px);
    position: fixed;
    right: 0;
    top: 56px;
    background-color: rgba(0,0,0,0.3);
    // overflow: auto;
    .draw_wrapper_yy {
        width: 100%;
        height: 100%;
        background: #ffffff;
        position: absolute;
        right: 0;
        top: 0;
        // overflow: auto;
        box-shadow: -5px 0px 10px 0px rgba(0, 0, 0, 0.1);
        .draw_wrapper_yy_close {
            width: 32px;
            height: 32px;
            position: absolute;
            right: 16px;
            top: 16px;
            cursor: pointer;
            background:url(./img/close.png);
            background-size: 32px 32px;
        }
    }
}
</style>

上一篇:怎么给vue自定义组件加上v-model?
下一篇:vue用了keep-alive声明周期只执行一次怎么办?

Vue中,可以通过设置z-index属性来控制元素的层级。然而,有一些情况下设置z-index生效,比如在表格中。根据引用中的说法,表格的z-index管怎么设置,td元素的层级都是高于td的内容元素的层级。所以,如果你在Vue使用z-index设置了一个元素的层级,但是该元素在表格的td元素内部,那么设置的z-index可能会被忽略。 另一种解决方法是使用position属性。根据引用中的描述,在Vue中,如果一个组件A设置了层级或者A的子元素设置了层级(大于1),而另一个组件B没有设置层级,那么无论B的子元素的层级有多高,B都会显示在A的上面。因此,可以通过调整元素的position属性来控制元素的层级关系。 在Vue中,你还可以自定义指令来处理特定情况下的层级问题。引用展示了一个自定义指令的例子,该指令可以根据传入的参数递归地找到要修改的父元素,并进行相应的操作。 综上所述,在Vue中可以使用z-index属性来控制元素的层级,但在某些情况下可能会被忽略。另外,可以使用position属性来调整元素的层级关系,并且还可以通过自定义指令来处理特定情况下的层级问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [用vue 自定义指令解决表格td内容元素设置z-index生效问题](https://blog.csdn.net/BAtodl/article/details/114991562)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [vue同组件z-index层级显示问题](https://blog.csdn.net/zfz5720/article/details/80068127)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值