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

Specifying the deep/immediate flags on watches is awkward #31

Open
thecodewarrior opened this issue Nov 5, 2021 · 5 comments
Open

Specifying the deep/immediate flags on watches is awkward #31

thecodewarrior opened this issue Nov 5, 2021 · 5 comments

Comments

@thecodewarrior
Copy link

Background

Currently, defining a watcher with either the deep or immediate flags requires a watch property with an object value that specifies the handler and flags. This is awkward and breaks type checking because this isn't defined.

@VueStore
class Store {
  prop = {value: 10}

  'on:prop' = {
    handler: function() {
      this.prop // type error because `this` isn't defined
    },
    deep: true
  }
}

That's in the Vue 2 branch. Due to the way the watches are created in the Vue 3 branch, setting those flags is impossible so your only option is to manually call watch yourself.

Proposal

I propose a suffix syntax for setting these flags. The flags would be defined, comma-separated, after a pound sign. e.g. 'on:prop#deep' or 'on:prop#deep,immediate'.

In Vue 2 the only flags will be deep and immediate. Vue 3 adds the flush watch option, which adds three more (mutually exclusive) flags: pre, post, and sync.

@davestewart
Copy link
Owner

I think it's a great idea.

What about just adding the flags without additional punctuation?

'on:foo.bar.baz deep immediate'

@thecodewarrior
Copy link
Author

On top of (imo) reducing the chances of conflicts, I feel like the pound sign syntax is easier to read.

  • The pound sign clearly separates and distinguishes between the property being watched and the flags.
  • The property and flags aren't the same thing, so imo they shouldn't be put side by side like they're peers.
  • A similar pound sign syntax is already used in URLs, so it'll be familiar to people.
  • Personally it feels more "syntactic" to me. More concrete.

@davestewart
Copy link
Owner

The pound and commas don't feel particularly idiomatic with respect to Vue.

Maybe something like this...

'on:foo.bar.baz'
'on.deep:foo.bar.baz'
'on.deep.immediate:foo.bar.baz'

@thecodewarrior
Copy link
Author

Oh, yeah that would work. Similar to .prevent/.sync/etc.

@davestewart
Copy link
Owner

Pretty much exactly like Vue's directive syntax!

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

2 participants