uni-app 自定义双向绑定事件在快手小程序ios下点击后页面不重新渲染

uni-app 自定义双向绑定事件在快手小程序ios下点击后页面不重新渲染

开发环境 版本号 项目创建方式
Windows win11 CLI

操作步骤:

双层子组件的自定义双向绑定点击事件,点击之后页面没有重新渲染

预期结果:

页面重新渲染,更新active的css样式

实际结果:

active的css样式没有变化

bug描述:

孙组件

<template>  
  <view class="protocol_box" @click="agreeClick(!agree)">
    <view class="label-item">
      <view class="select" :class="{ active: agree }"></view>
      我已阅读并同意</view  
    >
  </view>
</template>  

<script setup lang="ts">
const props = defineProps({
  // 是否同意
  agree: {
    type: Boolean,
    default: false,
  },
});

const emits = defineEmits(['update:agree']);

// 是否同意勾选
const agreeClick = (selected: boolean) => {
  emits('update:agree', selected);
};
</script>

子组件

<template>  
  <protocol-box
    v-model:agree="agree"
  ></protocol-box>
</template>  
<script setup lang="ts">
import { ref, computed } from 'vue';

const props = defineProps({
  // 是否同意
  modelValue: {
    type: Boolean,
    default: false,
  },
});

const emits = defineEmits(['update:modelValue']);

const agree = computed({
  get() {
    return props.modelValue;
  },
  set(value) {
    emits('update:modelValue', value);
  },
});
</script>

父组件

<template>  
  <pay-agreement
      class="pay-agreement"
      v-model="isAgree"
    ></pay-agreement>
</template>  
<script setup lang="ts">
import { ref, PropType, watch } from 'vue';

const isAgree = ref(false);
</script>
1 回复

在快手小程序中,尤其是在 iOS 环境下,自定义双向绑定事件后页面不重新渲染的问题,可能是由于以下几个原因导致的。你可以根据这些原因进行排查和修复:

1. 数据更新未触发页面渲染

uni-app 中,页面渲染通常依赖于数据的更新。如果你在自定义事件中修改了数据,但页面没有重新渲染,可能是因为数据更新没有触发 setData 或者 Vue 的响应式系统。

解决方案:

  • 确保你在自定义事件中正确地更新了数据,并且使用了 this.setDatathis.$set 来触发视图更新。
  • 如果你使用的是 Vue,确保数据是响应式的,并且通过 this.$set 来更新数据。
this.$set(this.someObject, 'key', value);

2. 快手小程序的 setData 性能问题

快手小程序在 iOS 环境下,setData 的性能可能不如预期,尤其是在频繁更新数据时,可能会导致页面渲染不及时。

解决方案:

  • 尽量减少 setData 的调用次数,合并多次数据更新为一次 setData
  • 使用 uni.$emituni.$on 来进行跨组件通信,减少直接的数据绑定。

3. 异步操作未正确处理

如果你的自定义事件中包含了异步操作(如网络请求、定时器等),可能会导致数据更新后页面没有及时渲染。

解决方案:

  • 确保在异步操作完成后,再调用 setDatathis.$set 来更新数据。
  • 使用 Promiseasync/await 来确保异步操作的正确执行顺序。
async handleCustomEvent() {
    const result = await someAsyncOperation();
    this.$set(this.someObject, 'key', result);
}

4. 快手小程序的兼容性问题

快手小程序在某些情况下可能存在兼容性问题,尤其是在 iOS 环境下。uni-app 的某些特性可能在快手小程序中表现不一致。

解决方案:

  • 检查 uni-app 的官方文档,确保你使用的特性在快手小程序中是支持的。
  • 如果问题依然存在,可以尝试使用原生的小程序代码来实现相同的功能,或者联系快手小程序的官方技术支持。

5. 页面生命周期问题

如果你的自定义事件在页面生命周期钩子中触发,可能会导致页面渲染不及时。

解决方案:

  • 确保在页面生命周期钩子中正确地处理数据更新和页面渲染。
  • 如果需要在页面加载时更新数据,可以在 onLoadonShow 生命周期钩子中进行处理。
onShow() {
    this.handleCustomEvent();
}

6. 检查事件绑定是否正确

确保你的事件绑定是正确的,尤其是在自定义组件中,事件可能没有正确传递或触发。

解决方案:

  • 检查事件绑定的语法,确保事件名称和回调函数正确。
  • 如果使用自定义组件,确保事件通过 $emit 正确触发。
// 父组件
<custom-component [@custom-event](/user/custom-event)="handleCustomEvent"></custom-component>

// 子组件
this.$emit('custom-event', data);

7. 使用 forceUpdate 强制更新

如果以上方法都无法解决问题,可以尝试使用 forceUpdate 强制更新视图。

解决方案:

  • 在数据更新后,调用 this.$forceUpdate() 强制更新视图。
this.$forceUpdate();
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!