解决v-if作用下popup弹框滑动效果消失的问题

2023-10-18 17:42:10 浏览数 (2)

问题描述

做需求的时候需要封装一个popup的组件,需求是页面进来的时候需要请求接口获取到popup的内容,然后进行展示弹框,但是这里就有一个问题,因为popup是一个组件,接口又是异步操作的,父组件进来的时候就直接引入了该组件,这个时候很大可能接口还没有返回,所以组件里面其实是没有任何内容的,但是组件已经展示出来了,所以效果上其实是一个bug,为了解决这个问题,我就将popup使用v-if 进行了判断,如果接口的返回数据没有成功接收到之前是不展示的,接收到之后引入该组件,但是使用if的话就是比较生硬的效果了,毕竟if只是判断要不要显示,是没有任何的过渡动画的,这就是今天要说的问题 该问题适用于任何本身存在滑动效果但是因为v-if导致没有任何滑动效果的情况

解决方案1

POPUP本身是有滑动效果的,所以第一种方案是我们不进行对组件本身v-if判断,而是在外层添加一个templete非渲染元素标签,默认他是不显示的,里面popup还是正常的使用show进行判断展示,当数据拿到之后直接将template的状态改为true,关闭的时候只改变组件的show的boolean的值,而template的boolean值不进行操作

  • 代码如下
代码语言:javascript复制
<!--
  * @Description: 投保须知弹框
  * @author:clearlove
  * @createTime: 2023-08-16 14:50:29
  -->
<template>
  <view>
    <u-popup :show="show" @close="close" :round="30" @open="open">
      <view class="content">
        <view class="content_title">
          <view class="content_title_image">
            <image src="@/assets/image/insure/logo.png" mode="widthFix"></image>
          </view>
          <view class="content_title_company"> 由{{ insureName }}提供保险经纪服务,{{ tenantName }}承保 </view>
        </view>
        <view class="content_substance">
          <Notes></Notes>
        </view>
        <view class="content_btn" @click="$emit('controlPopup')"> 我知道了 </view>
      </view>
    </u-popup>
  </view>
</template>

<script setup>
import { useCommonStore } from '@/stores/common.js'
const userStore = useCommonStore()
import Notes from './Notes.vue'
const props = defineProps({
  show: {
    type: Boolean,
    require: true,
    default: () => false
  }
})
const close = () => {}
const open = () => {}
const { insureName, tenantName } = userStore.insurePopupInfos // TODO: 获取服务公司和承保公司
</script>

<style lang="scss" scoped>
@import './InsuranceNotice.scss';
</style>
代码语言:javascript复制
<view v-if="controllIsShowNotice">
    <InsuranceNotice :show="insuranceNoticeShow" @controlPopup="onControlInsuranceNoticePopup"></InsuranceNotice>
</view>
解决方案2

使用组件异步加载的方式进行操作,也就是vue中的defineAsyncComponent方法,当我们判断接口数据已经返回的时候,进行加载该组件即可,但是这个方法在uniapp中是不被支持的,所以如果在小程序中使用的话是不适用的,小程序中使用第一个方法比较合适。

解决方案3

通过transition 添加name的方式进行css 添加对应的效果,但是这个有一些bug,具体的因为我很少用,所以这里就不做评论,个人不太推荐这个方案。

0 人点赞