uni-app HBuilder X最新版本4.15 vue3的watch函数仅执行一次,旧版本不会,是否正常,目前回退3.99版本,望排查

uni-app HBuilder X最新版本4.15 vue3的watch函数仅执行一次,旧版本不会,是否正常,目前回退3.99版本,望排查

项目信息 详细信息
产品分类 uniapp/小程序/微信
PC开发环境操作系统 Windows
PC开发环境操作系统版本号 win10 22H2
HBuilderX类型 正式
HBuilderX版本号 4.15
第三方开发者工具版本号 1.06
基础库版本号 3.43
项目创建方式 HBuilderX

操作步骤:

watch(props, () => {  
    if (!props.restaurantId) return;  
    /**  
     * @type { {  
                canCount: 0,  
                curCount: 0,  
                list: []  
            }}  
     */  
    const e = cartStore.getSelectGroupInfo({ restaurantId: props.restaurantId, categoryId: props.category.Id, typeList:props.category.ComboList })  
    // console.log("e", e)  
    entry.value = {  
        curCount: e.curCount,  
        canCount: e.canCount,  
        listStr: e.list.map(l => l.Name).join(",")  
    }  
}, {  
    deep:true,  
    immediate: true,  
})

预期结果:

watch(props, () => {  
    if (!props.restaurantId) return;  
    /**  
     * @type { {  
                canCount: 0,  
                curCount: 0,  
                list: []  
            }}  
     */  
    const e = cartStore.getSelectGroupInfo({ restaurantId: props.restaurantId, categoryId: props.category.Id, typeList:props.category.ComboList })  
    // console.log("e", e)  
    entry.value = {  
        curCount: e.curCount,  
        canCount: e.canCount,  
        listStr: e.list.map(l => l.Name).join(",")  
    }  
}, {  
    deep:true,  
    immediate: true,  
})

实际结果:

watch(props, () => {  
    if (!props.restaurantId) return;  
    /**  
     * @type { {  
                canCount: 0,  
                curCount: 0,  
                list: []  
            }}  
     */  
    const e = cartStore.getSelectGroupInfo({ restaurantId: props.restaurantId, categoryId: props.category.Id, typeList:props.category.ComboList })  
    // console.log("e", e)  
    entry.value = {  
        curCount: e.curCount,  
        canCount: e.canCount,  
        listStr: e.list.map(l => l.Name).join(",")  
    }  
}, {  
    deep:true,  
    immediate: true,  
})

bug描述:

使用watch函数仅执行一次,但是旧版本是正常的,近两天HBuilderX工具提示更新最新版本,更新之后发现watch失效,变量变化不触发更新 使用的vue3 场景是一个购物车,选择商品之后的监听


更多关于uni-app HBuilder X最新版本4.15 vue3的watch函数仅执行一次,旧版本不会,是否正常,目前回退3.99版本,望排查的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于uni-app HBuilder X最新版本4.15 vue3的watch函数仅执行一次,旧版本不会,是否正常,目前回退3.99版本,望排查的实战教程也可以访问 https://www.itying.com/category-93-b0.html


在uni-app HBuilder X的较新版本(如4.15)中,如果你发现watch函数仅执行一次,而在旧版本(如3.99)中表现正常,这可能是由于Vue 3的某些更新或HBuilder X引入的变化导致的。以下是一些可能的原因和排查步骤:

1. Vue 3的watch行为变化

  • Vue 3中watch的行为在某些情况下可能与Vue 2有所不同。例如,如果你的watch依赖的数据在初始化时没有变化,watch可能不会立即触发。
  • 确保你正确理解了Vue 3中watch的行为,可以参考Vue 3官方文档中的说明。

2. HBuilder X版本差异

  • HBuilder X 4.15可能引入了某些框架或工具链的更新,导致watch行为发生变化。你可以检查HBuilder X的更新日志,看看是否有相关的改动。
  • 如果你发现是HBuilder X的问题,可以尝试回退到3.99版本,或者等待官方修复。

3. 代码排查

  • 确保你的watch函数依赖的数据是响应式的。如果数据不是响应式的,watch可能不会触发。
  • 检查watchimmediate选项是否设置为true。如果你希望在初始化时立即执行watch函数,可以设置immediate: true
watch(
  () => someReactiveData,
  (newValue, oldValue) => {
    console.log('数据变化了', newValue, oldValue);
  },
  { immediate: true }
);

4. 调试与日志

  • watch函数中添加日志,确认它是否被调用。如果watch函数没有被调用,可能是依赖的数据没有变化,或者watch本身没有正确设置。
  • 使用console.log或调试工具检查watch依赖的数据是否按预期变化。

5. 回退版本

  • 如果你确认是HBuilder X 4.15版本的问题,并且回退到3.99版本后问题解决,建议在项目中暂时使用3.99版本,同时向HBuilder X的官方团队反馈问题。

6. 官方支持

  • 如果问题依然存在,建议在DCloud社区或HBuilder X的GitHub仓库中提交问题,提供详细的代码和复现步骤,以便官方团队排查和修复。

示例代码

import { ref, watch } from 'vue';

export default {
  setup() {
    const count = ref(0);

    watch(
      () => count.value,
      (newValue, oldValue) => {
        console.log('count changed:', newValue, oldValue);
      },
      { immediate: true }
    );

    return {
      count,
    };
  },
};
回到顶部