Vue 3 Emit

Posted on  by admin

Modified1 year, 1 month ago. So I'm trying to build a component in Vue 3 that acts as a form, and in order for the data to be processed by the parent I want it to emit an object with all the inputs on change.

The issue I'm having is that I don't seem to be able to call $emit from within watch() (probably because of the context, but I also don't see why the component-wide context isn't passed by default, and it doesn't accept this).

I also cannot call any method because of the same reason.

I do see some people using the watch: {} syntax but as I understand it that is deprecated and it doesn't make a whole lot of sense to me either.

Here's a minimal example of what I'm trying to accomplish. Whenever the input date is changed, I want the component to emit a custom event.

129129 bronze badges.

Don't mix between option and composition api in order to keep the component consistent, the emit function is available in the context parameter of the setup hook::.

if you want to add the method watchHandler you could define it a plain js function like :.

1414 gold badges105105 silver badges129129 bronze badges.

129129 bronze badges. Transcript from the "commit & emit" Lesson. [00:00:00]>> Usage in components.

For state we'd say this.store.state.nameofthing. So this is a read, so we can actually just access the state directly.

We can access getters directly.

We could say this.store.getters.nameofthing. For mutations, we would say this.store.commit.nameofthing, just like we just did in that action.

So if we were in a method, and don't worry, we'll do this in a method in just a second, we can call a mutation from a component.

[00:00:29] And we can access it that way.

Actions are also write, this.store.dispatch.nameofthing.

So if we wanted to show this in a component, typically what you would do is, you'd use it in a computed property.

And the reason why is, we're really trying to use this as efficiently as possible and we wanna cache this and not update it until the dependency is changed.

[00:00:55] So computed properties are really good for this. So in the computed properties we would say count is this.$store.state.count.

Triple counter is this.$store.getters.tripleCounter.

In methods, if I went and clicked a button and I wanted something to fire in the store I would say, add click increment.

It would call this increment and we'd say this.store.commit, increment and pass in something.

[00:01:20] Same with asyncIncrement, this.store.dispatch, asyncIncrement.

And move that forward. So in the repo, you have an application that's set up for you.

And it's called vuex-example, and it does this, what it's showing on the page.

So we have the state from the store. We have a getter from the triple counter from the store.

[00:01:43] Let's increment two from a mutation, let's increment by two with an action async.

And what I've done here is I've moved each type of these things into its own component, so that you can see them separately.

So you can see a getter by itself, you can see a mutation by itself. [00:02:05] So if you go into vuex-example, and in that source you can see a store that looks just like what we just showed in that last slide.

And then if you go back to the components, you can see AppGetter, AppMutation and AppAction, and I'll walk you through each one of them.

[00:02:28] So in the store, it's what we just talked about with the state.counter. In the main app, we've got the state from the store is state.

And we have, as a computed property, state return this.$store.state.counter.

I could have also called this counter, and then this would be called counter.

[00:02:48] So that's how I would use state directly. I'm also importing these components, Getter, Mutation and Action.