uni-app for循环数据直接取值和子组件内获取props值显示不一致

uni-app for循环数据直接取值和子组件内获取props值显示不一致

类别 信息
产品分类 uniapp/小程序/微信
PC开发环境 Windows
PC开发环境版本 11
HBuilderX类型 Alpha
HBuilderX版本 4.17
第三方开发者工具 RC 1.06.240301
基础库版本 3.4.4
项目创建方式 HBuilderX

示例代码:

<template #tableBody="{ record }" >  
    <view> 循环体直接取值: {{ record.state }}</view>  
    <view>组件内部取值: <StatusPanel :state="record.state" /></view>  
    <view>-----------------------------</view>  
</template>
<template>
    <!-- 组件内部取值::::: -->
    <view style="color: red; display: inline;">
       【 {{ props.state }} 】  
    </view>   
</template>

操作步骤:

点击:【点击按钮产生异常】即可复现。

预期结果:

显示 500 对应 500

实际结果:

显示 500 对应 200

bug描述:

首先我有一个主页面 index.vue , 然后有一个公共的列表样式组件 TableDataRender.vue ( 仅负责样式,数据全部通过父组件传入,并且通过slot进行渲染 )

在index页面的里,如果有渲染一些公共接口响应数据那么将会导致:for循环数据直接取值和子组件(公共状态判断组件)内获取props值显示不一致。

问题现象就是:插槽内直接取值是500 没有问题, 可以只要通过props传入到 StatusPanel.vue 子组件内就是显示了200。

感觉原因像是:index=0的数据没有刷新一样。 因为其他下标都是正常的。

但是呢,我有一行代码:vdata.apiResData = resData; 只要注释掉又是正常的。 也就是只要我的主页面index.vue不进行页面渲染,那么不会有问题。

我猜测是我版本问题, 但是HBuilder和小程序开发者都升级到了最新版本了还是出现该问题,所以才发稿询问。

H5测试问题不复现,仅小程序出现。 如果循环插槽的问题,那么应该第一次循环就应该有问题,现在的的问题是再传入到第二子组件出现的问题。个人感觉还是可以修复的哈。希望uniapp官方能够进行修复,感谢。

问题截屏详见附件。 问题GIF详见附件。 代码示例详见【代码示例】, 也上传了Demo源文件。


更多关于uni-app for循环数据直接取值和子组件内获取props值显示不一致的实战教程也可以访问 https://www.itying.com/category-93-b0.html

9 回复

我这边有你的demo试了没问题,我hbuilderx版本是4.36

请用微信小程序环境

刚刚测试:H5, 支付宝小程序也没影响。 仅微信小程序出现。

有没有大神给指导下

这个问题没人能给解答吗?

三个月了

这个问题官方能解决吗??

在使用 UniApp 进行开发时,如果在 for 循环中直接取值和子组件内获取 props 值时出现显示不一致的情况,可能是由于以下几个原因导致的。下面我将详细分析可能的原因,并提供解决方案。

1. 数据更新时机问题

for 循环中直接取值时,数据是直接从父组件的数据源中获取的,而在子组件中通过 props 获取的值可能会因为父组件数据更新的时机问题导致不一致。

解决方案:

  • 确保父组件的数据更新后,子组件的 props 也能及时更新。可以使用 watch 监听 props 的变化,或者在父组件中使用 this.$nextTick 确保数据更新后再传递给子组件。
// 父组件
methods: {
  updateData() {
    this.dataList = newData;
    this.$nextTick(() => {
      // 确保数据更新后再传递给子组件
    });
  }
}
// 子组件
watch: {
  propValue(newVal) {
    // 监听props的变化
    this.internalValue = newVal;
  }
}

2. props 未正确传递

子组件可能没有正确接收到父组件传递的 props,导致显示不一致。

解决方案:

  • 检查父组件中是否正确传递了 props,并且子组件中正确声明了 props
<!-- 父组件 -->
<child-component :prop-value="dataItem"></child-component>
// 子组件
export default {
  props: {
    propValue: {
      type: Object, // 或其他类型
      required: true
    }
  }
}

3. 数据引用问题

如果 for 循环中的数据是引用类型(如对象或数组),直接修改可能会导致子组件中的 props 也发生变化,从而引发显示不一致。

解决方案:

  • 在传递 props 时,使用深拷贝来避免引用问题。
// 父组件
methods: {
  getDataItem(index) {
    return JSON.parse(JSON.stringify(this.dataList[index]));
  }
}
<!-- 父组件 -->
<child-component :prop-value="getDataItem(index)"></child-component>

4. 子组件内部处理问题

子组件可能在内部对 props 进行了处理,导致显示不一致。

解决方案:

  • 检查子组件内部是否对 props 进行了不必要的处理,确保 props 的值直接用于显示。
// 子组件
computed: {
  displayValue() {
    return this.propValue; // 直接返回props的值
  }
}

5. 异步数据问题

如果数据是异步获取的,可能在数据还未完全加载时,子组件就已经渲染了,导致显示不一致。

解决方案:

  • 使用 v-if 确保数据加载完成后再渲染子组件。
<!-- 父组件 -->
<child-component v-if="dataLoaded" :prop-value="dataItem"></child-component>
// 父组件
data() {
  return {
    dataLoaded: false
  };
},
async created() {
  await this.fetchData();
  this.dataLoaded = true;
}
回到顶部