如何将反应性数据传递给 Vue 3 中的可组合项

How to pass reactive data to a composable in Vue 3

是否可以在 Vue 中声明一个响应式对象,然后将该对象的成员传递给一个可组合项,同时保持响应式?

例如:

我声明一个“州”类型:

type State = { myObjectList: Array<MyObject> }

然后在我的组件中初始化我的状态:

const state = reactive<State>{( myObjectList: new Array<MyObject>() )}

其中 state.myObjectList 通过 API 调用组件安装

填充

我的问题是,是否可以将 state.myObjectList 传递给可组合项,并让该可组合项知道对 state.myObjectList 内的元素所做的更改?

即有一个像这样的组合:

export default function useSimpleCalculator(list: Array<MyObject>){

  const dynamicSumValue = computed(():number => { 
    let sum = 0;
    list.forEach(el => {  sum += el.someValueThatChanges });
    return sum;
  });

 return { dynamicSumValue }

}

然后像这样使用该可组合项:

const {dynamicSumValue} = useSimpleCalculator(state.myObjectList);

并随着对 state.myObjectList

中元素的更改更新 dynamicSumValue

我尝试像上面那样实现,但是当我传递 state 对象上的任何 属性 时,它在可组合项中失去了反应性。

ref 传递给可组合项似乎可行(即 const val = ref(2) ),但这违背了我们的团队为组件范围的状态数据决定的模式

任何见解都会有所帮助

正如您所发现的,您不能将反应对象的属性传递给函数并保持该函数的反应性 属性。这也经常出现在 props 中,它只是一个反应对象,例如 'state' 在您的示例中。您需要将您的状态转换为 refs 并传递一个 ref 以使反应性正常工作:

useSimpleCalculator(toRef(state, 'myObjectList'));

const { myObjectList } = toRefs(state);
useSimpleCalculator(myObjectList)

两者都有效

Refs 专门用于需要通过引用传递值(因此得名)的情况。

因为 list 不应该被修改,它可以只是一个计算参考:

const myObjectList = computed(() => state.myObjectList);
useSimpleCalculator(myObjectList);

function useSimpleCalculator(list: Ref<Array<MyObject>> | ComputedRef<Array<MyObject>>){...}