Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MutationAction not having access to module state? #372

Open
leobezr opened this issue Jul 12, 2021 · 5 comments
Open

MutationAction not having access to module state? #372

leobezr opened this issue Jul 12, 2021 · 5 comments

Comments

@leobezr
Copy link

leobezr commented Jul 12, 2021

Is this by design or am I doing something wrong ?

The snippet bellow breaks because this.value is undefined.

When using this.state.value it works but the type is all wrong, so I get a lot of TS error.

Am I missing something?

@Module
class Mod extends VuexModule {
   public value = 2;

   @MutationAction({ mutate: ["value"] })
   async valueIncrement(): Promise<Record<"value", number>> {
      const req: AxiosRequest = await axios.get("...randomValue/");

      return {
         value: this.value += req.data
      }
   }
}

If possible, someone please send me a link to a Discord community with people who know Vuex Module Decorators.

@NikhilVerma
Copy link

  1. Mutation is called with the context of state
  2. MutationAction is called with the context of store

I agree it's not evident at all, and perhaps the fix can be done via Typescript by setting the right context

@NikhilVerma
Copy link

I made a PR which documents how to "fix" this issue - #374

@ymarcov
Copy link

ymarcov commented Sep 24, 2021

@NikhilVerma Thank you for that potential fix. I hoped it would allow me to move on with my project, after already having invested in the transition to this library, but unfortunately (as stated in the replies to your PR) Typescript still complains about changing the type of this.

It actually seems backward to me that the type of this is changed under the covers, and I tend to agree with Typescript's confusion here. I think the issue needs to be solved at its root, which means finding a way to have MutationActions without changing the this type.

@championswimmer What is the reason, in the first place, that the this is switched under the hood for MutationAction rather than being similar to the other actions/mutations, which work directly on the state?

@ymarcov
Copy link

ymarcov commented Sep 24, 2021

I've examined the code and saw the tricks employed in the decorators.
The quickest fix to this issue IMO would be to add the following lines to mutationaction.ts, in the part right before mutactFunction gets called:

const thisObj = { context }
addPropertiesToObject(thisObj, context.state)
addPropertiesToObject(thisObj, context.getters)
// and then
const actionPayload = await mutactFunction.call(thisObj, payload)

This would make the Action part of MutationAction analogous with what we've come to expect from Action.

@ymarcov
Copy link

ymarcov commented Sep 25, 2021

Since the repo has not been updated in over a year, I have forked it and applied the update mention above, so that state and getters can be accessed from a MutationAction similarly to Action.

To use my fork you can replace the vuex-module-decorators dependency line in your package.json file as follows:

"vuex-module-decorators": "github:ymarcov/vuex-module-decorators"

then run npm update vuex-module-decorators

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants