4π
As per my understanding, h()
is a short form to create the vnodes and accept 3 parameters.
h(
tag name,
props/attributes,
array of children
)
As per my understanding, In create_canvas
you are trying to create a div
which contains a class
and inline styles
as a props/attributes and we are creating a canvas
as a children of this div
vnode. Hence, Instead of returning the vNode
directly from setup(), it should return a render function that returns a vNode
.
export default {
props: {
// props will come here
},
setup(props) {
// render() { h(...) } β
return () => {
h('div', {
class: `trading-vue-${id}`,
style: {
left: props.position.x + 'px',
top: props.position.y + 'px',
position: 'absolute',
}
}, [
h('canvas', Object.assign({
id: `${props.tv_id}-${id}-canvas`,
onmousemove: e => renderer.mousemove(e),
onmouseout: e => renderer.mouseout(e),
onmouseup: e => renderer.mouseup(e),
onmousedown: e => renderer.mousedown(e),
ref: 'canvas',
style: props.style,
}, props.attrs))
].concat(props.hs || []))
} β
}
}
2π
First you are are not "calling" render function β you are just declaring it (Vue is caling it when rendering)
In Composition API you just need to return render function from setup
import { ref, h } from 'vue'
export default {
props: {
/* ... */
},
setup(props) {
const count = ref(1)
// return the render function
return () => h('div', props.msg + count.value)
}
}
After applying this knowledge on your own code I would say that the last line of setup
should not be render()
but return render()
(because the the render()
function itself returns actual "render" function)
In JS functions are treated as data β you can store them in variables and return them from the functions. When the function is stored or returned as a result of another function, it is not executed immediately β it is only created. The one who calls the "factory" function (in this case factory function is setup()
and the caller is Vue) can store the reference to the returned function and decides when to call it
The Vue Composition API onMounted hook works very similarly. You are calling onMounted()
passing a newly created function as an argument. onMounted
stores the reference to the function somewhere so the Vue can later call it.
The point is that it does not matter that in setup()
the onMounted()
is executed 1st and your render function is returned as a last statement of setup
. Because Vue decides when to call them "sometimes later". And it is reasonable to expect that Vue for sure will call your render function at least once before calling a function passed into onMounted()
(because component cannot be mounted before it is rendered)