我想从 Vue 3 中的父组件访问子组件中异步存储的数据

I want to access asynchronously stored data in a child component from the parent component in Vue 3

提问人:stella kim 提问时间:11/17/2023 最后编辑:stella kim 更新时间:11/21/2023 访问量:18

问:

我不擅长英语。请谅解。 从 Vue3 中的子组件异步接收数据并将其存储在存储中 检查父组件中存储的值后 我想将isLoad设置为true,但是即使我使用watch,watchEffect也无法检测到它。 怎么了?

App.vue (英语)

const commonStore = useCommonStore();
const storeRef = storeToRefs(commonStore);
watchEffect(() => {
  if (state.value.data1.value !== null && state.value.data2.value !== null) {
    isLoad.value = true;
    // console.log('true', isLoad.value);
  } else {
    console.log('false', isLoad.value);
  }
});


<template>   
     <Component1 />
      <Component2 />
</template>


商店.vue


export const useCommonStore = () => {

  const state = {
    data1: ref(null),
    data2: ref(null),
    isDataLoaded: ref(false),
  };

  const stateInfo = computed(()=>state)
  const getterIsDataLoaded = computed(()=>state.isDataLoaded.value)

  const setData1 = (data: any) => {
    state.data1.value = data;
  };

  const setData2 = (data: any) => {
    state.data2.value = data;
  };

  const resolveIsDataLoaded = (data:any) => {
    state.isDataLoaded.value = data;
  };


  return {
    state,
    stateInfo,
    setData1,
    setData2,
    getterIsDataLoaded,
    resolveIsDataLoaded
  };
};


vuejs3

评论

0赞 IVO GELOV 11/18/2023
从子级发出事件并在父级中处理它,或者使用共享数据存储(如 Pinia)。

答:

0赞 Tal Mogendorff 11/19/2023 #1

我缺乏有关商店类型(Vuex / pinia)的信息,但我仍然可以引导您找到解决方案。

首先,我建议检查加载的分配变量,在 App.vue 中,您正在设置“isLoad.value”,而在 Store 中,您有一个名为“isDataLoaded”的状态属性。

此外,I 将更改为:const storeRef = storeToRefs(commonStore);

const {data1, data2, isDataLoaded} = storeToRefs(commonStore);

然后,您可以在所需的场景中根据需要使用它们。

*请注意,建议仅在 Action 回调中更改 Pinia 中的状态,例如:

setData1(data1) {
  this.data1 = data1;
},

并且还可以通过 Getter 函数获取状态:

getData1: (state) => state.data1,

这是更清洁的方式,希望它能帮助:)