devpunks / snuggsi

snuggsi ツ - Easy Custom Elements in ~1kB
https://snuggsi.com
MIT License
398 stars 17 forks source link

Automate render after event handler #46

Closed janz93 closed 7 years ago

janz93 commented 7 years ago

Default

currently, we call always render

static onnext () {
  this.date_from_month (+1)
  this.render () 
}

We can implicitly render on all event handlers.

static onnext () {
  this.date_from_month (+1)
  // this.render () // automagically gets rendered.
}

Preventing Default

Inject the event object into the handler MDN Event Object

static onclick (event) {
  event.preventDefault () // stops render

  alert (this.textContent)

  this.render () // explicitly render component
}
snuggs commented 7 years ago

PR #50 Was not able to use event.preventDefault () API as we would have to monkey patch. Introduced a "sugar" method event.prevent () which will be available to all declared on* events

(i.e. static onclick (event) {})

Conversely we also introduced the return false convention for those familiar with jQuery.

Element `foo-bar`

(class extends HTMLElement {

  static onclick (event) {
    event.prevent ()          // pre-operation disable of rendering

    alert `I was clicked ${event.target}`  // operation

    // this.render ()        // always have option to explicitly render

    return false             // post-operation disable of rendering

    // render will immediately fire after handler if event was not prevented
  }
})

@janz93 @RobertChristopher @brandondees @btakita @mrbernnz @scottmacdowell

brandondees commented 7 years ago

is this to reproduce preventDefault()'s behavior or to prevent snuggsi from rendering? if the latter, i think prevent() is not self-descriptive as it could be

snuggs commented 7 years ago

latter @brandondees. API suggestion? To be honest i'm good with return false however really wanted to have event.preventDefault () and i agree is confusing unless it actually Prevents the Default.

I think what i realized from your statement is prevent () is fine if it actually calls preventDefault AND prevents this.render which is a "default behavior" that is prevented. (as per the spec).

Please advise.

https://github.com/devpunks/snuggsi/commit/b99719224704787e3f5d68ad89fa24deca43f64c#commitcomment-22458637

snuggs commented 7 years ago

is this to reproduce preventDefault()'s behavior or to prevent snuggsi from rendering? if the latter, i think prevent() is not self-descriptive as it could be

Actually @brandondees on second thought not an OR situation but an AND situation.

brandondees commented 7 years ago

nah i think the prevent() name is confusing UNLESS it's just a contextual wrapper for e.preventDefault() since that's the only other thing it sounds like.

if its purpose is to prevent default AND prevent render, then maybe we start by calling it preventDefaultHooks() or something a little more descriptive like that. if it's only render() then preventRender()

i'm not sure i've grasped yet where the return false factors in or what it means

snuggs commented 7 years ago

@brandondees some (ancient) insight as to the conventions. https://stackoverflow.com/questions/1357118/event-preventdefault-vs-return-false

http://www.mail-archive.com/jquery-en@googlegroups.com/msg71371.html

brandondees commented 7 years ago

Note that this behaviour differs from normal (non-jQuery) event handlers, in which, notably, return false does not stop the event from bubbling up.

ah ok so there's a scope traversal thing going on also independent of preventDefault()