Home > Enterprise >  Vue3 computed property in parent child component structure not working
Vue3 computed property in parent child component structure not working

Time:06-08

After trying to find solution to this issue for hours on various forums i am posting this here.

So i have two components. 1) App and 2) Todo. Both renderes a list and i can complete items so there will be two lists one for incomplete items and one for complete items. you can click on item and it will be gone to complete items list.

So in my example you can see i am using same component but with two diffreent ways to give data to component. one using API and one using native js Data. in both cases it renderes but with api i can click on list item and it will be gone to completed list but with javascript array example it doesn't work. i am completely amazed with this because component is same. how it can affect like that.

many answer here do tell me that computed properties are not reactive as they are cached but what’s the solution to that ? i can put data variable but then the first case of api will not work because time it takes to fetch it. so please help me with this one.

complete code at sfc playground

CodePudding user response:

You have reactivity issues the computed property probably expects that value to be constant because you provide a non-reactive array from the parent.

I think you have 2 options here:

  • you either provide a reactive prop from parent
  • or you set a local data attribute in the child-component so that vue will know that it can change

Your fiddle didn't work for me so I copied your code to codesandbox, I have both examples there but commented out the first solution, there you basically simply add the array to the data object and reference that in the code.

Second solution you can add a mounted hook to define reactiveAssignments to your data in the child component this way it will have the same reference so that's why it would work that way.

I think the first solution is simpler, but it is really up to which one you prefer.

You can check the solutions here in my codesanbox

A better approach could be though by setting up component events instead of v-models in the child you should use it in the parent because this way you are directly modifying the props. You can read more about this here: https://vuejs.org/guide/components/events.html#usage-with-v-model

  • Related