uni-app uni-popup组件需求 只能在当前元素下渲染
uni-app uni-popup组件需求 只能在当前元素下渲染
官方的uni-popup只能在当前元素下渲染经常遇到层级问题, 能否实现渲染到body下或者支持vue3的Teleport组件 (app端)
app上没有body,所以没办法这样。。你放到那个页面的template下的子节点就差不多了,你页面上的除了fixed和uni原生的基本上都不会盖住
我使用<root-portal>元素解决的
<root-portal>
<uni-popup ref="selectImageDiaRef" :mask-click="true" backgroundColor="#ffffff" borderRadius="30rpx 30rpx 0 0"
type="bottom">
</uni-popup>
</root-portal>
这个只有uniappx的微信小程序能用吧
在uni-app中,uni-popup
组件默认是挂载在根节点下的,这意味着它会脱离当前组件的DOM树,显示在页面的最上层。然而,在某些特定需求下,你可能希望uni-popup
组件只能在当前元素下渲染,即保持其层级在当前组件内部。虽然uni-app官方没有直接提供这样的功能,但我们可以通过一些技巧来实现类似的效果。
以下是一个利用CSS和JavaScript结合的方式,模拟在当前元素下渲染uni-popup
的效果。这里我们不会直接修改uni-popup
的挂载方式,而是通过覆盖和定位来实现视觉上的效果。
<template>
<view class="container">
<button @click="showPopup">显示Popup</button>
<view class="popup-wrapper" v-if="isPopupVisible">
<uni-popup ref="myPopup" type="bottom" :show="isPopupVisible">
<view class="popup-content">
这是自定义的Popup内容
<button @click="hidePopup">关闭</button>
</view>
</uni-popup>
</view>
</view>
</template>
<script>
export default {
data() {
return {
isPopupVisible: false
};
},
methods: {
showPopup() {
this.isPopupVisible = true;
this.$nextTick(() => {
const popupWrapper = this.$el.querySelector('.popup-wrapper');
const popupElement = this.$refs.myPopup.$el.querySelector('.uni-popup__content');
popupElement.style.position = 'static'; // 取消默认定位
popupWrapper.appendChild(popupElement.parentNode); // 将Popup内容移动到wrapper内
});
},
hidePopup() {
this.isPopupVisible = false;
// 重置Popup的定位和内容(如果需要的话)
this.$nextTick(() => {
const popupContent = this.$refs.myPopup.$el.querySelector('.uni-popup__content');
if (popupContent.parentNode.classList.contains('popup-wrapper')) {
popupContent.parentNode.removeChild(popupContent.parentNode); // 还原到原始位置
}
});
}
}
};
</script>
<style scoped>
.container {
position: relative;
}
.popup-wrapper {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 1000; /* 确保Popup在最上层 */
pointer-events: none; /* 防止点击穿透 */
}
.popup-content {
pointer-events: auto; /* 恢复点击事件 */
}
</style>
注意:这种方法并不是官方推荐的做法,且可能存在兼容性和性能问题。在实际项目中,建议根据具体需求和场景选择合适的解决方案。如果确实需要在当前元素下渲染组件,可以考虑使用其他UI框架或自定义组件来实现。