收藏
回答

在页面初次加载时,组件(封装的隐私授权弹窗)中 wx:if 设置为 true 但无显示?

新的隐私授权处理,进页面时需要定位就会触发 wx.onNeedPrivacyAuthorization,打开隐私授权弹窗。多次编译发现有时会无弹窗显示,但监测数据 isShow 是正常变动到 true 的。这是什么原因,该如何处理呢?

在组件的 attached、ready 生命周期和页面的 show 生命周期中进行 popUp(弹窗显示)、或者刚进页面就触发 wx.onNeedPrivacyAuthorization,都会出现 wx:if 设置为 true 但不显示的问题。

使用 weui中的半屏组件 mp-half-screen-dialog(看了源码逻辑也是用的wx:if)或者直接自己写样式使用 wx:if 均存在此问题。

推测可能是部分异步加载基础库/小程序底层内容在此时未完全加载完成导致?开始设置了最短 40ms 的 setTimeout 但仍然存在此问题,应该不是任务轮次导致。

以下为涉及到此问题的代码,已去除部分与此问题无关的逻辑。

js 部分:

    data: {
    isShowfalse, // wx:if 绑定的字段
  },
  lifetimes: {
    attachedfunction () {
      const that = this
      if (that.data._firstCheck) { // 传入属性,判断是否需要进页面时就确定授权情况
        if (wx.canIUse('getPrivacySetting')) {
          wx.getPrivacySetting({
            success(res) => {
              if (res.needAuthorization) {
                  that.popUp()
              }
            }
          })
        }
      }
    },
  },
  pageLifetimes: {
    showfunction () {
      const that = this
      if (wx.canIUse('onNeedPrivacyAuthorization')) {
        wx.onNeedPrivacyAuthorization(resolve => {
          // 监听需授权事件,且仅处理最后一个被触发的需授权事件
          that.data._privacyResolve = resolve
          that.popUp()
        })
      }
    },
  },
  methods: {
    popUp() {
      const that = this
      if (that.data.isShow === false) {
        that.setData({
          isShowtrue
        })
      }
    }
  }
})


wxml 部分:

<mp-half-screen-dialog show="{{isShow}}" maskClosable="{{false}}" title="隐私提示" maskClosable="{{false}}" closabled="{{false}}">
  <view slot="desc">
    <text>隐私提示信息</text>
  </view>
  <view slot="footer">
    <button type="default">不同意</button>
    <button id="agree-btn" type="primary" open-type="agreePrivacyAuthorization">同意</button>
  </view>
</mp-half-screen-dialog>
最后一次编辑于  2023-09-07
回答关注问题邀请回答
收藏

3 个回答

  • Jerry
    Jerry
    2023-09-07

    调试一下wxml啊

    2023-09-07
    有用
    回复 3
    • 芽频
      芽频
      2023-09-07
      wx:if 绑定参数为 true,但是 wxml 中组件的 #shadow-root 下是空的。
      2023-09-07
      回复
    • Jerry
      Jerry
      2023-09-07回复芽频
      wxml代码贴出来
      2023-09-07
      回复
    • 芽频
      芽频
      2023-09-07
      编辑更新了,可以看下。
      2023-09-07
      回复
  • Larry
    Larry
    2023-09-07

    定位是在load吗,可能是loadshow是异步执行的,应该确保调用定位前已经监听了wx.onNeedPrivacyAuthorization

    2023-09-07
    有用
    回复 1
    • 芽频
      芽频
      2023-09-07
      定位是在load,有考虑到异步,但是用 setTimeout 延了一轮次还是存在问题,试着延时 500ms 会没问题,不过考虑到不同手机的性能情况这样做不是很可靠;另外,可以确定已经监听,有调用到打开弹窗的方法 popUp,并且监听了弹窗显示绑定的 isShow 字段,有从 false 到 true 的变化,但页面无弹窗显示(同样的代码多次编译中会有几次)。
      2023-09-07
      回复
  • 清蒸鱼
    清蒸鱼
    2023-09-07

    分享出能复现的代码片段,试过才好查问题。

    2023-09-07
    有用
    回复 1
    • 芽频
      芽频
      2023-09-07
      js 部分已有,wxml 部分用 wx:if 绑下显示对应参数就行。
      2023-09-07
      回复
登录 后发表内容