Vue3 如何正确使用 异步provide/inject

目前来看代码能正常运行,但有几个问题没想明白,先上代码

父组件

<template>
  <div class="container">
    <china-map></china-map>
    <echart></echart>
  </div>
</template>

<script>
/*省略import*/
export default {
  components: { ChinaMap, Echart },
  name: "MapIndex",
  setup() {
    let yiwancheng = ref("0");
    let weiwancheng = ref("0");
    let zongliang = ref("0");
    provide("yiwancheng", yiwancheng);
    provide("weiwancheng", weiwancheng);
    provide("zongliang", zongliang);

    DATA.FindAllProgress().then((res) => {
      yiwancheng.value = res.data.data["已完成"];
      weiwancheng.value = res.data.data["未完成"];
      zongliang.value = res.data.data["总量"];
    });
    return {
      yiwancheng,
      weiwancheng,
      zongliang,
    };
  },
};

inject 子组件

<template>
  <div class="pie-box">
    <span class="pie-title">比例</span>
    <div class="pie" id="pie"></div>
  </div>
</template>

<script>
/* 省略import */
export default {
  name: "Pie",
  setup() {
    const yiwancheng = inject("yiwancheng", 0);
    const weiwancheng = inject("weiwancheng", 0);
    function LoadPie(yiwancheng, weiwancheng, echart) {
        //加载echart 饼图 代码太多,这里省略了
    }

    watch([yiwancheng, weiwancheng], async ([yiwancheng, weiwancheng]) => {
      const pieChart = echarts.init(document.getElementById("pie"));
      pieChart.showLoading();
      LoadPie(yiwancheng, weiwancheng, pieChart);
    });

    onMounted(() => {
      console.log("挂载");
    });

    return {};
  },
};
</script>

之前我是在子组件 onMounted 中去获取inject数据和加载饼图的,但是inject获取的值一直是默认值0,后来改用watch就一切正常了,因为watch里面需要获取dom,那么watch是否都是在onMounted之后执行的呢,根据我目前console.log打印的结果来看,watch每次都是在挂在后执行的,因为还是有些不确定这样写到底对不对,所以来向大家请教

补充:问题已解决,出现问题原因是使用了原版echarts库,虽然在onMounted中获取inject的数据是初始值,但后续数值更新没有映射到视图中,除非在watch中重新调用LoadPie方法,后面改用了vue-echarts后成解决所有问题

阅读 5.2k
1 个回答

不一定的! 但是大概会是 onMounted之后执行 如果你想稳定是onMounted 之后执行 。
可以这样

 onMounted(()=>{
       DATA.FindAllProgress()
})
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题