In my previous post on animating an HTML5 canvas using Phoenix LiveView, we used both a phx-hook
attribute and a phx-update="ignore"
attribute simultaneously on a single DOM element. The goal was to ignore DOM updates (phx-update="ignore"
), while still receiving updated data from our server (phx-hook
) via our data-particles
attribute.
Unfortunately, the technique of using both phx-hook
and phx-update="ignore"
on a single component no longer works as of phoenix_live_view
version 0.2.0
. The "ignore"
update rule causes our hook’s updated
callback to not be called with updates. In hindsight, the previous behavior doesn’t even make sense, and the new behavior seems much more consistent with the metaphors in play.
Joxy pointed this issue out to me, and helped me come up with a workaround. The solution we landed on is to wrap our canvas
component in another DOM element, like a div
. We leave our phx-update="ignore"
on our canvas to preserve our computed width and height attributes, but move our phx-hook
and data attributes to the wrapping div
:
<div
phx-hook="canvas"
data-particles="<%= Jason.encode!(@particles) %>"
>
<canvas phx-update="ignore">
Canvas is not supported!
</canvas>
</div>
In the mounted
callback of our canvas
hook, we need to look to the first child of our div
to find our canvas
element:
mounted() {
let canvas = this.el.firstElementChild;
...
}
Finally, we need to pass a reference to a Phoenix Socket
directly into our LiveSocket
constructor to be compatible with our new version of phoenix_live_view
:
import { Socket } from "phoenix";
let liveSocket = new LiveSocket("/live", Socket, { hooks });
And that’s all there is to it! Our LiveView-powered confetti generator is back up and running with the addition of a small layer of markup.
For more information on this update, be sure to check out this issue I filed to try to get clarity on the situation. And I’d like to give a huge thanks to Joxy for doing all the hard work in putting this fix together!
Top comments (0)