-
Notifications
You must be signed in to change notification settings - Fork 30
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
createElement called multiple times even when update always return false #88
Comments
I think this is working as expected! BECAUSE! In your example:
So removing the component from the DOM, then rendering it in the DOM, causes Nanocomponent works great with third party DOM elements as long as you don't remove the enclosing Nanocomponent from the DOM. Hopefully that makes sense! Here's a working example incorporating your example from var morph = require('nanomorph')
var html = require('nanohtml')
var Component = require('nanocomponent')
class Example extends Component {
constructor () {
super()
this.tick = 0
this.internal = 0
}
createElement () {
this.tick++
var interval = setInterval(() => {
if (!this.element) clearInterval(interval)
this.internal++
var p = this.element.querySelector('#internal')
p.innerText = `Example internally updated ${this.internal} times on ${Date.now()}`
}, 500)
return html`
<div>
<p>Example createElement called ${this.tick} times</p>
<p id="internal"></p>
</div>
`
}
update () {
return false
}
}
var widget = new Example()
var p = document.createElement('p')
var morphs = 0
var manuals = 0
function updateMorph () {
console.log('updateMorph', morphs++)
morph(document.body, html`<body>
<p>Updated ${morphs} times by nanomorph on ${Date.now()}</p>
${widget.render()}
${p}
</body>`)
}
function updateManual () {
console.log('updateManual', manuals++)
p.innerText = `Updated ${manuals} manually on ${Date.now()}`
}
updateMorph()
setInterval(updateManual, 1000)
setInterval(updateMorph, 5000) Hope that helps! |
Thanks @ungoldman ! |
Was wondering if you could use
|
I wonder if it works on gists. |
Hopefully this answered your question @mafintosh. Closing this issue for now. |
Thanks @ungoldman, that explains the behaivor. I'd suggest we update the example in the README to be more clearer about this, https://github.com/choojs/nanocomponent#mutating-the-components-instead-of-re-rendering, to not confuse someone else :) |
There is a decent chance I misunderstood the README, but I was expecting createElement only be called once if update always returned false, to make embedding of other DOM elements easier.
This doesn't always seem to be the case when using multiple components. Here is a test-case:
Running the above app will result in 20 createElements being written out. If only one component is used then it's only written out once. Is that working as expected? If so how would you embed a third party dom element.
For now we've published a fork of nanomorph that supports short circuiting "guarded" elements for this using https://github.com/hyperdivision/nanomorph/blob/master/index.js#L63 and https://github.com/hyperdivision/nanomorph-guard
Thanks for all the great stuff btw! :)
The text was updated successfully, but these errors were encountered: