View Source Changelog
0-18-2-2022-10-04
0.18.2 (2022-10-04)
bug-fixes
Bug Fixes
- Fix match error when defining
:valuesbefore:default - Allow tuples in external redirects
- Fix race condition on dispatching click away when enter is pressed
- Fix formatter breaking inline blocks when surrounded by text without whitespace
enhancements
Enhancements
- Add
interspersecomponent for rendering a separator between an enumerable
0-18-1-2022-09-28
0.18.1 (2022-09-28)
bug-fixes-1
Bug Fixes
- Fix phx-loading class being applied to dead views
- Fix
<.live_upload_preview />causing invalid attribute errors on uploads - Do not fire phx events when element is disabled
enhancements-1
Enhancements
- Support
:includeoption to extend global attributes on a case-by-case basis - Warn when accessing a variable binding defined outside of
~H
0-18-0-2022-09-20
0.18.0 (2022-09-20)
LiveView v0.18 includes a major new feature in the form of declarative assigns with new attr
and slot APIs for specifying which attributes a function component supports, the type,
and default values. Attributes and slots are compile-time verified and emit warnings (requires Elixir v1.14.0+).
v0.18 includes a number of new function components which replace their EEx expression
counterparts <%= ... %>. For example, live_redirect, live_patch, and Phoenix.HTML's
link have been replaced by a unified Phoenix.Component.link/1 function component:
<.link href="https://myapp.com">my app</.link>
<.link navigate={@path}>remount</.link>
<.link patch={@path}>patch</.link>Those new components live in the Phoenix.Component module. Phoenix.LiveView.Helpers
itself has been soft deprecated and all relevant functionality has been migrated.
You must import Phoenix.Component where you previously imported Phoenix.LiveView.Helpers
when upgrading. You may also need to import Phoenix.Component where you also imported Phoenix.LiveView and some of its functions have been moved to Phoenix.Component.
Additionally, the special let attribute on function components have been deprecated by
a :let usage.
deprecations
Deprecations
live_redirect- deprecate in favor of new<.link navigate={..}>component ofPhoenix.Componentlive_patch- deprecate in favor of new<.link patch={..}>component ofPhoenix.Componentpush_redirect- deprecate in favor of newpush_navigatefunction onPhoenix.LiveView
enhancements-2
Enhancements
- [Component] Add declarative assigns with compile-time verifications and warnings via
attr/slot - [Component] Add new attrs
:letand:for, and:ifwith HTML tag, function component, and slot support. We still supportletbut the formatter will convert it to:letand soon it will be deprecated. - [Component] Add
dynamic_tagfunction component - [Component] Add
linkfunction component - [Component] Add
focus_wrapfunction component to wrap focus around content like modals and dialogs for accessibility - [Logger] Add new LiveView logger with telemetry instrumentation for lifecycle events
- [JS] Add new JS commands for
focus,focus_first,push_focus, andpop_focusfor accessibility - [Socket] Support sharing
Phoenix.LiveView.Socketwith regular channels viause Phoenix.LiveView.Socket - Add
_live_refererconnect param for handlingpush_navigatereferal URL - Add new
phx-connectedandphx-disconnectedbindings for reacting to lifecycle changes - Add dead view support for JS commands
- Add dead view support for hooks
bug-fixes-2
Bug fixes
- Fix external upload issue where listeners are not cleaned up when an external failure happens on the client
- Do not debounce
phx-blur
0-17-11-2022-07-11
0.17.11 (2022-07-11)
enhancements-3
Enhancements
- Add
replaceTransportto LiveSocket
bug-fixes-3
Bug fixes
- Cancel debounced events from firing after a live navigation event
- Fix hash anchor failing to scroll to anchor element on live navigation
- Do not debounce
phx-blurevents
0-17-10-2022-05-25
0.17.10 (2022-05-25)
bug-fixes-4
Bug fixes
- [Formatter] Preserve single quote delimiter on attrs
- [Formatter] Do not format inline elements surrounded by texts without whitespaces
- [Formatter] Keep text and eex along when there isn't a whitespace
- [Formatter] Fix intentional line breaks after eex expressions
- [Formatter] Handle self close tags as inline
- [Formatter] Do not format inline elements without whitespaces among them
- [Formatter] Do not format when attr contenteditable is present
enhancements-4
Enhancements
- [Formatter] Introduce special attr phx-no-format to skip formatting
0-17-9-2022-04-07
0.17.9 (2022-04-07)
bug-fixes-5
Bug fixes
- Fix sticky LiveViews failing to be patched during live navigation
- Do not raise on dynamic
phx-updatevalue
0-17-8-2022-04-06
0.17.8 (2022-04-06)
enhancements-5
Enhancements
- Add HEEx formatter
- Support
phx-changeon individual inputs - Dispatch
MouseEventon client - Add
:bubblesoption toJS.dispatchto control event bubbling - Expose underlying
liveSocketinstance on hooks - Enable client debug by default on localhost
bug-fixes-6
Bug fixes
- Fix hook and sticky LiveView issues caused by back-to-back live redirects from mount
- Fix hook destroyed callback failing to be invoked for children of phx-remove in some cases
- Do not failsafe reload the page on push timeout if disconnected
- Do not bubble navigation click events to regular phx-click's
- No longer generate
csrf_tokenfor forms without action, reducing the payload during phx-change/phx-submit events
0-17-7-2022-02-07
0.17.7 (2022-02-07)
enhancements-6
Enhancements
- Optimize nested for comprehension diffs
bug-fixes-7
Bug fixes
- Fix error when
live_redirectlinks are clicked when not connected in certain cases
0-17-6-2022-01-18
0.17.6 (2022-01-18)
enhancements-7
Enhancements
- Add
JS.set_attributeandJS.remove_attribute - Add
sticky: trueoption tolive_renderto maintain a nested child on across live redirects - Dispatch
phx:show-start,phx:show-end,phx:hide-startandphx:hide-endonJS.show|hide|toggle - Add
get_connect_info/2that also works on disconnected render - Add
LiveSocketconstructor options for configuration failsafe behavior via newmaxReloads,reloadJitterMin,reloadJitterMax,failsafeJitteroptions
bug-fixes-8
Bug fixes
- Show form errors after submit even when no changes occur on server
- Fix
phx-disable-withfailing to disable elements outside of forms - Fix phx ref tracking leaving elements in awaiting state when targeting an external LiveView
- Fix diff on response failing to await for active transitions in certain cases
- Fix
phx-click-awaynot respectingphx-target - Fix "disconnect" broadcast failing to failsafe refresh the page
- Fix
JS.pushwith:targetfailing to send to correct component in certain cases
deprecations-1
Deprecations
- Deprecate
Phoenix.LiveView.get_connect_info/1in favor ofget_connect_info/2 - Deprecate
Phoenix.LiveViewTest.put_connect_info/2in favor of calling the relevant functions inPlug.Conn - Deprecate returning "raw" values from upload callbacks on
Phoenix.LiveView.consume_uploaded_entry/3andPhoenix.LiveView.consume_uploaded_entries/3. The callback must return either{:ok, value}or{:postpone, value}. Returning any other value will emit a warning.
0-17-5-2021-11-02
0.17.5 (2021-11-02)
bug-fixes-9
Bug fixes
- Do not trigger
phx-click-awayif element is not visible - Fix
phx-removefailing to tear down nested live children
0-17-4-2021-11-01
0.17.4 (2021-11-01)
bug-fixes-10
Bug fixes
- Fix variable scoping issues causing various content block or duplication rendering bugs
0-17-3-2021-10-28
0.17.3 (2021-10-28)
enhancements-8
Enhancements
- Support 3-tuple for JS class transitions to support staged animations where a transition class is applied with a starting and ending class
- Allow JS commands to be executed on DOM nodes outside of the LiveView container
optimization
Optimization
- Avoid duplicate statics inside comprehension. In previous versions, comprehensions were able to avoid duplication only in the content of their root. Now we recursively traverse all comprehension nodes and send the static only once for the whole comprehension. This should massively reduce the cost of sending comprehensions over the wire
bug-fixes-11
Bug fixes
- Fix HTML engine bug causing expressions to be duplicated or not rendered correctly
- Fix HTML engine bug causing slots to not be re-rendered when they should have
- Fix form recovery being sent to wrong target
0-17-2-2021-10-22
0.17.2 (2021-10-22)
bug-fixes-12
Bug fixes
- Fix HTML engine bug causing attribute expressions to be incorrectly evaluated in certain cases
- Fix show/hide/toggle custom display not being restored
- Fix default
totarget forJS.show|hide|dispatch - Fix form input targeting
0-17-1-2021-10-21
0.17.1 (2021-10-21)
bug-fixes-13
Bug fixes
- Fix SVG element support for
phxbinding interactions
0-17-0-2021-10-21
0.17.0 (2021-10-21)
breaking-changes
Breaking Changes
on_mount changes
The hook API introduced in LiveView 0.16 has been improved based on feedback.
LiveView 0.17 removes the custom module-function callbacks for the
Phoenix.LiveView.on_mount/1 macro and the :on_mount option for
Phoenix.LiveView.Router.live_session/3 in favor of supporting a custom
argument. For clarity, the module function to be invoked during the mount
lifecycle stage will always be named on_mount/4.
For example, if you had invoked on_mount/1 like so:
on_mount MyAppWeb.MyHook
on_mount {MyAppWeb.MyHook, :assign_current_user}and defined your callbacks as:
# my_hook.ex
def mount(_params, _session, _socket) do
end
def assign_current_user(_params, _session, _socket) do
endChange the callback to:
# my_hook.ex
def on_mount(:default, _params, _session, _socket) do
end
def on_mount(:assign_current_user, _params, _session, _socket) do
endWhen given only a module name, the first argument to on_mount/4 will be the
atom :default.
LEEx templates in stateful LiveComponents
Stateful LiveComponents (where an :id is given) must now return HEEx templates
(~H sigil or .heex extension). LEEx templates (~L sigil or .leex extension)
are no longer supported. This addresses bugs and allows stateful components
to be rendered more efficiently client-side.
phx-disconnected class has been replaced with phx-loading
Due to a bug in the newly released Safari 15, the previously used .phx-disconnected class has been replaced by a new .phx-loading class. The reason for the change is phx.new included a .phx-disconnected rule in the generated app.css which triggers the Safari bug. Renaming the class avoids applying the erroneous rule for existing applications. Folks can upgrade by simply renaming their .phx-disconnected rules to .phx-loading.
phx-capture-click has been deprecated in favor of phx-click-away
The new phx-click-away binding replaces phx-capture-click and is much more versatile because it can detect "click focus" being lost on containers.
Removal of previously deprecated functionality
Some functionality that was previously deprecated has been removed:
- Implicit assigns in
live_componentdo-blocks is no longer supported - Passing a
@sockettolive_componentwill now raise if possible
enhancements-9
Enhancements
- Allow slots in function components: they are marked as
<:slot_name>and can be rendered with<%= render_slot @slot_name %> - Add
JScommand for executing JavaScript utility operations on the client with an extended push API - Optimize string attributes:
- If the attribute is a string interpolation, such as
<div class={"foo bar #{@baz}"}>, only the interpolation part is marked as dynamic - If the attribute can be empty, such as "class" and "style", keep the attribute name as static
- If the attribute is a string interpolation, such as
- Add a function component for rendering
Phoenix.LiveComponent. Instead of<%= live_component FormComponent, id: "form" %>, you must now do:<.live_component module={FormComponent} id="form" />
bug-fixes-14
Bug fixes
- Fix LiveViews with form recovery failing to properly mount following a reconnect when preceded by a live redirect
- Fix stale session causing full redirect fallback when issuing a
push_redirectfrom mount - Add workaround for Safari bug causing
<img>tags with srcset and video with autoplay to fail to render - Support EEx interpolation inside HTML comments in HEEx templates
- Support HTML tags inside script tags (as in regular HTML)
- Raise if using quotes in attribute names
- Include the filename in error messages when it is not possible to parse interpolated attributes
- Make sure the test client always sends the full URL on
live_patch/live_redirect. This mirrors the behaviour of the JavaScript client - Do not reload flash from session on
live_redirects - Fix select drop-down flashes in Chrome when the DOM is patched during focus
deprecations-2
Deprecations
<%= live_component MyModule, id: @user.id, user: @user %>is deprecated in favor of<.live_component module={MyModule} id={@user.id} user={@user} />. Notice the new API requires using HEEx templates. This change allows us to further improve LiveComponent and bring new features such as slots to them.render_block/2in deprecated in favor ofrender_slot/2
0-16-4-2021-09-22
0.16.4 (2021-09-22)
enhancements-10
Enhancements
- Improve HEEx error messages
- Relax HTML tag validation to support mixed case tags
- Support self closing HTML tags
- Remove requirement for
handle_paramsto be defined for lifecycle hooks
bug-fixes-15
Bug fixes
- Fix pushes failing to include channel
join_refon messages
0-16-3-2021-09-03
0.16.3 (2021-09-03)
bug-fixes-16
Bug fixes
- Fix
on_mounthooks calling view mount before redirecting when the hook issues a halt redirect.
0-16-2-2021-09-03
0.16.2 (2021-09-03)
enhancements-11
Enhancements
- Improve error messages on tokenization
- Improve error message if
@inner_blockis missing
bug-fixes-17
Bug fixes
- Fix
phx-changeform recovery event being sent to wrong component on reconnect when component order changes
0-16-1-2021-08-26
0.16.1 (2021-08-26)
enhancements-12
Enhancements
- Relax
phoenix_htmldependency requirement - Allow testing functional components by passing a function reference
to
Phoenix.LiveViewTest.render_component/3
bug-fixes-18
Bug fixes
- Do not generate CSRF tokens for non-POST forms
- Do not add compile-time dependencies on
on_mountdeclarations
0-16-0-2021-08-10
0.16.0 (2021-08-10)
security-considerations-upgrading-from-0-15
Security Considerations Upgrading from 0.15
LiveView v0.16 optimizes live redirects by supporting navigation purely
over the existing WebSocket connection. This is accomplished by the new
live_session/3 feature of Phoenix.LiveView.Router. The
security guide has always stressed
the following:
... As we have seen, LiveView begins its life-cycle as a regular HTTP request. Then a stateful connection is established. Both the HTTP request and the stateful connection receives the client data via parameters and session. This means that any session validation must happen both in the HTTP request (plug pipeline) and the stateful connection (LiveView mount) ...
These guidelines continue to be valid, but it is now essential that the
stateful connection enforces authentication and session validation within
the LiveView mount lifecycle because a live_redirect from the client
will not go through the plug pipeline as a hard-refresh or initial HTTP
render would. This means authentication, authorization, etc that may be
done in the Plug.Conn pipeline must also be performed within the
LiveView mount lifecycle.
Live sessions allow you to support a shared security model by allowing
live_redirects to only be issued between routes defined under the same
live session name. If a client attempts to live redirect to a different
live session, it will be refused and a graceful client-side redirect will
trigger a regular HTTP request to the attempted URL.
See the Phoenix.LiveView.Router.live_session/3 docs for more information
and example usage.
new-html-engine
New HTML Engine
LiveView v0.16 introduces HEEx (HTML + EEx) templates and the concept of function
components via Phoenix.Component. The new HEEx templates validate the markup in
the template while also providing smarter change tracking as well as syntax
conveniences to make it easier to build composable components.
A function component is any function that receives a map of assigns and returns
a ~H template:
defmodule MyComponent do
use Phoenix.Component
def btn(assigns) do
~H"""
<button class="btn"><%= @text %></button>
"""
end
endThis component can now be used as in your HEEx templates as:
<MyComponent.btn text="Save">The introduction of HEEx and function components brings a series of deprecation warnings, some introduced in this release and others which will be added in the future. Note HEEx templates require Elixir v1.12+.
upgrading-and-deprecations
Upgrading and deprecations
The main deprecation in this release is that the ~L sigil and the .leex extension
are now soft-deprecated. The docs have been updated to discourage them and using them
will emit warnings in future releases. We recommend using the ~H sigil and the .heex
extension for all future templates in your application. You should also plan to migrate
the old templates accordingly using the recommendations below.
Migrating from LEEx to HEEx is relatively straightforward. There are two main differences.
First of all, HEEx does not allow interpolation inside tags. So instead of:
<div id="<%= @id %>">
...
</div>One should use the HEEx syntax:
<div id={@id}>
...
</div>The other difference is in regards to form_for. Some templates may do the following:
~L"""
<%= f = form_for @changeset, "#" %>
<%= input f, :foo %>
</form>
"""However, when converted to ~H, it is not valid HTML: there is a </form> tag but
its opening is hidden inside the Elixir code. On LiveView v0.16, there is a function
component named form:
~H"""
<.form :let={f} for={@changeset}>
<%= input f, :foo %>
</.form>
"""We understand migrating all templates from ~L to ~H can be a daunting task.
Therefore we plan to support ~L in LiveViews for a long time. However, we can't
do the same for stateful LiveComponents, as some important client-side features and
optimizations will depend on the ~H sigil. Therefore our recommendation is to
replace ~L by ~H first in live components, particularly stateful live components.
Furthermore, stateless live_component (i.e. live components without an :id)
will be deprecated in favor of the new function components. Our plan is to support
them for a reasonable period of time, but you should avoid creating new ones in
your application.
breaking-changes-1
Breaking Changes
LiveView 0.16 removes the :layout and :container options from
Phoenix.LiveView.Routing.live/4 in favor of the :root_layout
and :container options on Phoenix.Router.live_session/3.
For instance, if you have the following in LiveView 0.15 and prior:
live "/path", MyAppWeb.PageLive, layout: {MyAppWeb.LayoutView, "custom_layout.html"}Change it to:
live_session :session_name, root_layout: {MyAppWeb.LayoutView, "custom_layout.html"} do
live "/path", MyAppWeb.PageLive
endOn the client, the phoenix_live_view package no longer provides a default export for LiveSocket.
If you have the following in your JavaScript entrypoint (typically located at assets/js/app.js):
import LiveSocket from "phoenix_live_view"Change it to:
import { LiveSocket } from "phoenix_live_view"Additionally on the client, the root LiveView element no longer exposes the
LiveView module name, therefore the phx-view attribute is never set.
Similarly, the viewName property of client hooks has been removed.
Codebases calling a custom function component/3 should rename it or specify its module to avoid a conflict,
as LiveView introduces a macro with that name and it is special cased by the underlying engine.
enhancements-13
Enhancements
- Introduce HEEx templates
- Introduce
Phoenix.Component - Introduce
Phoenix.Router.live_session/3for optimized live redirects - Introduce
on_mountandattach_hookhooks which provide a mechanism to tap into key stages of the LiveView lifecycle - Add upload methods to client-side hooks
- [Helpers] Optimize
live_img_previewrendering - [Helpers] Introduce
formfunction component which wrapsPhoenix.HTML.form_for - [LiveViewTest] Add
with_targetfor scoping components directly - [LiveViewTest] Add
refute_redirected - [LiveViewTest] Support multiple
phx-targetvalues to mirror JS client - [LiveViewTest] Add
follow_trigger_action - [JavaScript Client] Add
sessionStorageoptionLiveSocketconstructor to support client storage overrides - [JavaScript Client] Do not failsafe reload the page in the background when a tab is unable to connect if the page is not visible
bug-fixes-19
Bug fixes
- Make sure components are loaded on
render_componentto ensure all relevant callbacks are invoked - Fix
Phoenix.LiveViewTest.page_titlereturningnilin some cases - Fix buttons being re-enabled when explicitly set to disabled on server
- Fix live patch failing to update URL when live patch link is patched again via
handle_paramswithin the same callback lifecycle - Fix
phx-no-feedbackclass not applied when page is live-patched - Fix
DOMException, querySelector, not a valid selectorwhen performing DOM lookups on non-standard IDs - Fix select dropdown flashing close/opened when assigns are updated on Chrome/macOS
- Fix error with multiple
live_file_inputin one form - Fix race condition in
showErrorcausing nullquerySelector - Fix statics not resolving correctly across recursive diffs
- Fix no function clause matching in
Phoenix.LiveView.Diff.many_to_iodata - Fix upload input not being cleared after files are uploaded via a component
- Fix channel crash when uploading during reconnect
- Fix duplicate progress events being sent for large uploads
deprecations-3
Deprecations
- Implicit assigns when passing a
do-endblock tolive_componentis deprecated - The
~Lsigil and the.leexextension are now soft-deprecated in favor of~Hand.heex - Stateless live components (a
live_componentcall without an:id) are deprecated in favor of the new function component feature
0-15-7-2021-05-24
0.15.7 (2021-05-24)
bug-fixes-20
Bug fixes
- Fix broken webpack build throwing missing morphdom dependency
0-15-6-2021-05-24
0.15.6 (2021-05-24)
bug-fixes-21
Bug fixes
- Fix live patch failing to update URL when live patch link is patched again from
handle_params - Fix regression in
LiveViewTest.render_upload/3when using channel uploads and progress callback - Fix component uploads not being cleaned up on remove
- Fix
KeyErroron LiveView reconnect when an active upload was previously in progress
enhancements-14
Enhancements
- Support function components via
component/3 - Optimize progress events to send less messages for larger file sizes
- Allow session and local storage client overrides
deprecations-4
Deprecations
- Deprecate
@socket/socketargument onlive_component/3call
0-15-5-2021-04-20
0.15.5 (2021-04-20)
enhancements-15
Enhancements
- Add
upload_errors/1for returning top-level upload errors
bug-fixes-22
Bug fixes
- Fix
consume_uploaded_entry/3with external uploads causing inconsistent entries state - Fix
push_eventlosing events when a single diff produces multiple events from different components - Fix deep merging of component tree sharing
0-15-4-2021-01-26
0.15.4 (2021-01-26)
bug-fixes-23
Bug fixes
- Fix nested
live_render's causing remound of child LiveView even when ID does not change - Do not attempt push hook events unless connected
- Fix preflighted refs causing
auto_upload: trueto fail to submit form - Replace single upload entry when
max_entriesis 1 instead of accumulating multiple file selections - Fix
static_pathinopen_browserfailing to load stylesheets
0-15-3-2021-01-02
0.15.3 (2021-01-02)
bug-fixes-24
Bug fixes
- Fix
push_redirectback causing timeout on the client
0-15-2-2021-01-01
0.15.2 (2021-01-01)
backwards-incompatible-changes
Backwards incompatible changes
- Remove
beforeDestroyfromphx-hookcallbacks
bug-fixes-25
Bug fixes
- Fix form recovery failing to send input on first connection failure
- Fix hooks not getting remounted after LiveView reconnect
- Fix hooks
reconnectedcallback being fired with no prior disconnect
0-15-1-2020-12-20
0.15.1 (2020-12-20)
enhancements-16
Enhancements
- Ensure all click events bubble for mobile Safari
- Run
consume_uploaded_entriesin LiveView caller process
bug-fixes-26
Bug fixes
- Fix hooks not getting remounted after LiveView recovery
- Fix bug causing reload with jitter on timeout from previously closed channel
- Fix component child nodes being lost when component patch goes from single root node to multiple child siblings
- Fix
phx-capture-clicktriggering on mouseup during text selection - Fix LiveView
push_event's not clearing up in components - Fix
<textarea>being patched by LiveView while focused
0-15-0-2020-11-20
0.15.0 (2020-11-20)
enhancements-17
Enhancements
- Add live uploads support for file progress, interactive file selection, and direct to cloud support
- Implement
Phoenix.LiveViewTest.open_browser/2that opens up a browser with the LiveView page
backwards-incompatible-changes-1
Backwards incompatible changes
- Remove
@inner_contentin components and introducerender_blockfor rendering component@inner_block - Remove
@live_modulein socket templates in favor of@socket.view
bug-fixes-27
Bug fixes
- Make sure URLs are decoded after they are split
- Do not recover forms without inputs
- Fix race condition when components are removed and then immediately re-added before the client can notify their CIDs have been destroyed
- Do not render LiveView if only events/replies have been added to the socket
- Properly merge different components when sharing component subtrees on initial render
- Allow variables inside do-blocks to be tainted
- Fix
push_redirectfrom mount hanging on the client and causing a fallback to full page reload when following a clickedlive_redirecton the client
0-14-8-2020-10-30
0.14.8 (2020-10-30)
bug-fixes-28
Bug fixes
- Fix compatibility with latest Plug
0-14-7-2020-09-25
0.14.7 (2020-09-25)
bug-fixes-29
Bug fixes
- Fix
redirect(socket, external: ...)when returned from an event - Properly follow location hashes on live patch/redirect
- Fix failure in
Phoenix.LiveViewTestwhenphx-updatehas non-HTML nodes as children - Fix
phx_trigger_actionsubmitting the form before the DOM updates are complete
0-14-6-2020-09-21
0.14.6 (2020-09-21)
bug-fixes-30
Bug fixes
- Fix race condition on
phx-trigger-actioncausing reconnects before server form submit
0-14-5-2020-09-20
0.14.5 (2020-09-20)
enhancements-18
Enhancements
- Optimize DOM prepend and append operations
- Add
Phoenix.LiveView.send_update_after/3
bug-fixes-31
Bug fixes
- Fix scroll position when using back/forward with
live_redirect's - Handle recursive components when generating diffs
- Support hard redirects on mount
- Properly track nested components on deletion on
Phoenix.LiveViewTest
0-14-4-2020-07-30
0.14.4 (2020-07-30)
bug-fixes-32
Bug fixes
- Fix hidden inputs throwing selection range error
0-14-3-2020-07-24
0.14.3 (2020-07-24)
enhancements-19
Enhancements
- Support
render_layoutwith LiveEEx
bug-fixes-33
Bug fixes
- Fix focused inputs being overwritten by latent patch
- Fix LiveView error when
"_target"input name contains array - Fix change tracking when passing a do-block to components
0-14-2-2020-07-21
0.14.2 (2020-07-21)
bug-fixes-34
Bug fixes
- Fix Map of assigns together with
@inner_contentcausingno function clause matching in Keyword.put/3error - Fix
LiveViewTestfailing to patch children properly for append/prepend based phx-update's - Fix argument error when providing
:asoption to aliveroute - Fix page becoming unresponsive when the server crashes while handling a live patch
- Fix empty diff causing pending data-ref based updates, such as classes and
phx-disable-withcontent to not be updated - Fix bug where throttling keydown events would eat key presses
- Fix
<textarea>'s failing to be disabled on form submit - Fix text node DOM memory leak when using
phx-updateappend/prepend
enhancements-20
Enhancements
- Allow
:routerto be given torender_component - Display file on compile warning for
~L - Log error on client when using a hook without a DOM ID
- Optimize
phx-updateappend/prepend based DOM updates
0-14-1-2020-07-09
0.14.1 (2020-07-09)
bug-fixes-35
Bug fixes
- Fix nested
live_render's failing to be torn down when removed from the DOM in certain cases - Fix LEEx issue for nested conditions failing to be re-evaluated
0-14-0-2020-07-07
0.14.0 (2020-07-07)
bug-fixes-36
Bug fixes
- Fix IE11 issue where
document.activeElementcreates a null reference - Fix setup and teardown of root views when explicitly calling
liveSocket.disconnect()followed byliveSocket.connect() - Fix
error_tagfailing to be displayed for non-text based inputs such as selects and checkboxes as thephx-no-feedbackclass was always applied - Fix
phx-errorclass being applied onlive_redirect - Properly handle Elixir's special variables, such as
__MODULE__ - No longer set disconnected class during patch
- Track flash keys to fix back-to-back flashes from being discarded
- Properly handle empty component diffs in the client for cases where the component has already been removed on the server
- Make sure components in nested live views do not conflict
- Fix
phx-staticnot being sent from the client for child views - Do not fail when trying to delete a view that was already deleted
- Ensure
beforeDestroyis called on hooks in children of a removed element
enhancements-21
Enhancements
- Allow the whole component static subtree to be shared when the component already exists on the client
- Add telemetry events to
mount,handle_params, andhandle_event - Add
push_eventfor pushing events and data from the server to the client - Add client
handleEventhook method for receiving events pushed from the server - Add ability to receive a reply to a
pushEventfrom the server via{:reply, map, socket} - Use event listener for popstate to avoid conflicting with user-defined popstate handlers
- Log error on client when rendering a component with no direct DOM children
- Make
assigns.myselfa struct to catch mistakes - Log if component doesn't exist on
send_update, raise if module is unavailable
0-13-3-2020-06-04
0.13.3 (2020-06-04)
bug-fixes-37
Bug fixes
- Fix duplicate debounced events from being triggered on blur with timed debounce
- Fix client error when
live_redirected route results in a redirect to a non-live route on the server - Fix DOM siblings being removed when a rootless component is updated
- Fix debounced input failing to send last change when blurred via Tab, Meta, or other non-printable keys
enhancements-22
Enhancements
- Add
domoption toLiveSocketwithonBeforeElUpdatedcallback for external client library support of broad DOM operations
0-13-2-2020-05-27
0.13.2 (2020-05-27)
bug-fixes-38
Bug fixes
- Fix a bug where swapping a root template with components would cause the LiveView to crash
0-13-1-2020-05-26
0.13.1 (2020-05-26)
bug-fixes-39
Bug fixes
- Fix forced page refresh when
push_redirectfrom alive_redirect
enhancements-23
Enhancements
- Optimize component diffs to avoid sending empty diffs
- Optimize components to share static values
- [LiveViewTest] Automatically synchronize before render events
0-13-0-2020-05-21
0.13.0 (2020-05-21)
backwards-incompatible-changes-2
Backwards incompatible changes
- No longer send event metadata by default. Metadata is now opt-in and user defined at the
LiveSocketlevel. To maintain backwards compatibility with pre-0.13 behaviour, you can provide the following metadata option:
let liveSocket = new LiveSocket("/live", Socket, {
params: {_csrf_token: csrfToken},
metadata: {
click: (e, el) => {
return {
altKey: e.altKey,
shiftKey: e.shiftKey,
ctrlKey: e.ctrlKey,
metaKey: e.metaKey,
x: e.x || e.clientX,
y: e.y || e.clientY,
pageX: e.pageX,
pageY: e.pageY,
screenX: e.screenX,
screenY: e.screenY,
offsetX: e.offsetX,
offsetY: e.offsetY,
detail: e.detail || 1,
}
},
keydown: (e, el) => {
return {
altGraphKey: e.altGraphKey,
altKey: e.altKey,
code: e.code,
ctrlKey: e.ctrlKey,
key: e.key,
keyIdentifier: e.keyIdentifier,
keyLocation: e.keyLocation,
location: e.location,
metaKey: e.metaKey,
repeat: e.repeat,
shiftKey: e.shiftKey
}
}
}
})
bug-fixes-40
Bug fixes
- Fix error caused by Chrome sending a keydown event on native UI autocomplete without a
key - Fix server error when a live navigation request issues a redirect
- Fix double window bindings when explicit calls to LiveSocket connect/disconnect/connect
enhancements-24
Enhancements
- Add
Phoenix.LiveView.get_connect_info/1 - Add
Phoenix.LiveViewTest.put_connect_info/2andPhoenix.LiveViewTest.put_connect_params/2 - Add support for tracking static asset changes on the page across cold server deploys
- Add support for passing a
@myselftarget to a hook'spushEventTotarget - Add configurable metadata for events with new
metadataLiveSocket option - Add
"_mounts"key in connect params which specifies the number of times a LiveView has mounted
0-12-1-2020-04-19
0.12.1 (2020-04-19)
bug-fixes-41
Bug fixes
- Fix component
innerHTMLbeing discarded when a sibling DOM element appears above it, in cases where the component lacks a DOM ID - Fix Firefox reconnecting briefly during hard redirects
- Fix
phx-disable-withand other pending attributes failing to be restored when an empty patch is returned by server - Ensure LiveView module is loaded before mount to prevent first application request logging errors if the very first request is to a connected LiveView
0-12-0-2020-04-16
0.12.0 (2020-04-16)
This version of LiveView comes with an overhaul of the testing module, more closely integrating your LiveView template with your LiveView events. For example, in previous versions, you could write this test:
render_click(live_view, "increment_by", %{by: 1})However, there is no guarantee that there is any element on the page with a phx-click="increment" attribute and phx-value-by set to 1. With LiveView 0.12.0, you can now write:
live_view
|> element("#term .buttons a", "Increment")
|> render_click()The new implementation will check there is a button at #term .buttons a, with "Increment" as text, validate that it has a phx-click attribute and automatically submit to it with all relevant phx-value entries. This brings us closer to integration/acceptance test frameworks without any of the overhead and complexities of running a headless browser.
enhancements-25
Enhancements
- Add
assert_patch/3andassert_patched/2for asserting on patches - Add
follow_redirect/3to automatically follow redirects fromrender_*events - Add
phx-trigger-actionform annotation to trigger an HTTP form submit on next DOM patch
bug-fixes-42
Bug fixes
- Fix
phx-target@myselftargeting a sibling LiveView component with the same component ID - Fix
phx:page-loading-stopfiring before the DOM patch has been performed - Fix
phx-update="prepend"failing to properly patch the DOM when the same ID is updated back to back - Fix redirects on mount failing to copy flash
backwards-incompatible-changes-3
Backwards incompatible changes
phx-error-forhas been removed in favor ofphx-feedback-for.phx-feedback-forwill set aphx-no-feedbackclass whenever feedback has to be hiddenPhoenix.LiveViewTest.children/1has been renamed toPhoenix.LiveViewTest.live_children/1Phoenix.LiveViewTest.find_child/2has been renamed toPhoenix.LiveViewTest.find_live_child/2Phoenix.LiveViewTest.assert_redirect/3no longer matches on the flash, instead it returns the flashPhoenix.LiveViewTest.assert_redirect/3no longer matches on the patch redirects, useassert_patch/3insteadPhoenix.LiveViewTest.assert_remove/3has been removed. If the LiveView crashes, it will cause the test to crash tooPassing a path with DOM IDs to
render_*test functions is deprecated. Furthermore, they now require aphx-target="<%= @id %>"on the given DOM ID:<div id="component-id" phx-target="component-id"> ... </div>html = render_submit([view, "#component-id"], event, value)In any case, this API is deprecated and you should migrate to the new element based API.
0-11-1-2020-04-08
0.11.1 (2020-04-08)
bug-fixes-43
Bug fixes
- Fix readonly states failing to be undone after an empty diff
- Fix dynamically added child failing to be joined by the client
- Fix teardown bug causing stale client sessions to attempt a rejoin on reconnect
- Fix orphaned prepend/append content across joins
- Track
unlessin LiveEEx engine
backwards-incompatible-changes-4
Backwards incompatible changes
render_event/render_clickand friends now expect a DOM ID selector to be given when working with components. For example, instead ofrender_click([live, "user-13"]), you should writerender_click([live, "#user-13"]), mirroring thephx-targetAPI.- Accessing the socket assigns directly
@socket.assigns[...]in a template will now raise the exceptionPhoenix.LiveView.Socket.AssignsNotInSocket. The socket assigns are available directly inside the template as LiveEExassigns, such as@fooand@bar. Any assign access should be done using the assigns in the template where proper change tracking takes place.
enhancements-26
Enhancements
- Trigger debounced events immediately on input blur
- Support
defaultsoption onLiveSocketconstructor to configure defaultphx-debounceandphx-throttlevalues, allowing<input ... phx-debounce> - Add
detailkey to click event metadata for detecting double/triple clicks
0-11-0-2020-04-06
0.11.0 (2020-04-06)
backwards-incompatible-changes-5
Backwards incompatible changes
Remove
socket.assignsduring render to avoid change tracking bugs. If you were previously relying on passing@socketto functions then referencing socket assigns, pass the explicit assign instead to your functions from the template.Removed
assets/css/live_view.css. If you want to show a progress bar then inapp.css, replace- @import "../../../../deps/phoenix_live_view/assets/css/live_view.css"; + @import "../node_modules/nprogress/nprogress.css";and add
nprogresstoassets/package.json. Full details in the Progress animation guide
bug-fixes-44
Bug fixes
- Fix client issue with greater than two levels of LiveView nesting
- Fix bug causing entire LiveView to be re-rendering with only a component changed
- Fix issue where rejoins would not trigger
phx:page-loading-stop
enhancements-27
Enhancements
- Support deep change tracking so
@foo.baronly executes and diffs when bar changes - Add
@myselfassign, to allow components to target themselves instead of relying on a DOM ID, for example:phx-target="<%= @myself %>" - Optimize various client rendering scenarios for faster DOM patching of components and append/prepended content
- Add
enableProfiling()anddisableProfiling()toLiveSocketfor client performance profiling to aid the development process - Allow LiveViews to be rendered inside LiveComponents
- Add support for clearing flash inside components
0-10-0-2020-03-18
0.10.0 (2020-03-18)
backwards-incompatible-changes-6
Backwards incompatible changes
- Rename socket assign
@live_view_moduleto@live_module - Rename socket assign
@live_view_actionto@live_action - LiveView no longer uses the default app layout and
put_live_layoutis no longer supported. Instead, useput_root_layout. Note, however, that the layout given toput_root_layoutmust use@inner_contentinstead of<%= render(@view_module, @view_template, assigns) %>and that the root layout will also be used by regular views. Check the Live Layouts section of the docs.
bug-fixes-45
Bug fixes
- Fix loading states causing nested LiveViews to be removed during live navigation
- Only trigger
phx-update="ignore"hook if data attributes have changed - Fix LiveEEx fingerprint bug causing no diff to be sent in certain cases
enhancements-28
Enhancements
- Support collocated templates where an
.html.leextemplate of the same basename of the LiveView will be automatically used forrender/1 - Add
live_title_tag/2helper for automatic prefix/suffix on@page_titleupdates
0-9-0-2020-03-08
0.9.0 (2020-03-08)
bug-fixes-46
Bug fixes
- Do not set ignored inputs and buttons as readonly
- Only decode paths in URIs
- Only destroy main descendents when replacing main
- Fix sibling component patches when siblings at same root DOM tree
- Do not pick the layout from
:useon child LiveViews - Respect when the layout is set to
falsein the router and on mount - Fix sibling component patch when component siblings lack a container
- Make flash optional (i.e. LiveView will still work if you don't
fetch_flashbefore)
enhancements-29
Enhancements
- Raise if
:flashis given as an assign - Support user-defined metadata in router
- Allow the router to be accessed as
socket.router - Allow
MFArgsas the:sessionoption in theliverouter macro - Trigger page loading event when main LV errors
- Automatically clear the flash on live navigation examples - only the newly assigned flash is persisted
0-8-1-2020-02-27
0.8.1 (2020-02-27)
enhancements-30
Enhancements
- Support
phx-disable-withon live redirect and live patch links
bug-fixes-47
Bug Fixes
- Fix focus issue on date and time inputs
- Fix LiveViews failing to mount when page restored from back/forward cache following a
redirecton the server - Fix IE coercing
undefinedto string when issuing pushState - Fix IE error when focused element is null
- Fix client error when using components and live navigation where a dynamic template is rendered
- Fix latent component diff causing error when component removed from DOM before patch arrives
- Fix race condition where a component event received on the server for a component already removed by the server raised a match error
0-8-0-2020-02-22
0.8.0 (2020-02-22)
backwards-incompatible-changes-7
Backwards incompatible changes
- Remove
Phoenix.LiveView.Flashin favor of:fetch_live_flashimported byPhoenix.LiveView.Router - Live layout must now access the child contents with
@inner_contentinstead of invoking the LiveView directly - Returning
:stoptuples from LiveViewmountorhandle_[params|call|cast|info|event]is no longer supported. LiveViews are stopped when issuing aredirectorpush_redirect
enhancements-31
Enhancements
- Add
put_live_layoutplug to put the root layout used for live routes - Allow
redirectandpush_redirectfrom mount - Use acknowledgement tracking to avoid patching inputs until the server has processed the form event
- Add css loading states to all phx bound elements with event specific css classes
- Dispatch
phx:page-loading-startandphx:page-loading-stopon window for live navigation, initial page loads, and form submits, for user controlled page loading integration - Allow any phx bound element to specify
phx-page-loadingto dispatch loading events above when the event is pushed - Add client side latency simulator with new
enableLatencySim(milliseconds)anddisableLatencySim() - Add
enableDebug()anddisableDebug()toLiveSocketfor ondemand browser debugging from the web console - Do not connect LiveSocket WebSocket or bind client events unless a LiveView is found on the page
- Add
transport_pid/1to return the websocket transport pid when the socket is connected
bug-fixes-48
Bug Fixes
- Fix issue where a failed mount from a
live_redirectwould reload the current URL instead of the attempted new URL
0-7-1-2020-02-13
0.7.1 (2020-02-13)
bug-fixes-49
Bug Fixes
- Fix checkbox bug failing to send
phx-changeevent to the server in certain cases - Fix checkbox bug failing to maintain checked state when a checkbox is programmatically updated by the server
- Fix select bug in Firefox causing the highlighted index to jump when a patch is applied during hover state
0-7-0-2020-02-12
0.7.0 (2020-02-12)
backwards-incompatible-changes-8
Backwards incompatible changes
live_redirectwas removed in favor ofpush_patch(for updating the URL and params of the current LiveView) andpush_redirect(for updating the URL to another LiveView)live_linkwas removed in favor oflive_patch(for updating the URL and params of the current LiveView) andlive_redirect(for updating the URL to another LiveView)Phoenix.LiveViewTest.assert_redirectno longer accepts an anonymous function in favor of executing the code prior to asserting the redirects, just likeassert_receive.
enhancements-32
Enhancements
- Support
@live_view_actionin LiveViews to simplify tracking of URL state - Recovery form input data automatically on disconnects or crash recovery
- Add
phx-auto-recoverform binding for specialized recovery - Scroll to top of page while respecting anchor hash targets on
live_patchandlive_redirect - Add
phx-capture-clickto use event capturing to bind a click event as it propagates inwards from the target - Revamp flash support so it works between static views, live views, and components
- Add
phx-keybinding to scopephx-window-keydownandphx-window-keyupevents
bug-fixes-50
Bug Fixes
- Send
phx-value-*on key events - Trigger
updatedhook callbacks onphx-update="ignore"container when the container's attributes have changed - Fix nested
phx-update="append"raising ArgumentError in LiveViewTest - Fix updates not being applied in rare cases where an leex template is wrapped in an if expression
0-6-0-2020-01-22
0.6.0 (2020-01-22)
deprecations-5
Deprecations
- LiveView
mount/2has been deprecated in favor ofmount/3. The params are now passed as the first argument tomount/3, followed by the session and socket.
backwards-incompatible-changes-9
Backwards incompatible changes
- The socket session now accepts only string keys
enhancements-33
Enhancements
- Allow window beforeunload to be cancelled without losing websocket connection
bug-fixes-51
Bug Fixes
- Fix handle_params not decoding URL path parameters properly
- Fix LiveViewTest error when routing at root path
- Fix URI encoded params failing to be decoded in
handle_params - Fix component target failing to locate correct component when the target is on an input tag
0-5-2-2020-01-17
0.5.2 (2020-01-17)
bug-fixes-52
Bug Fixes
- Fix optimization bug causing some DOM nodes to be removed on updates
0-5-1-2020-01-15
0.5.1 (2020-01-15)
bug-fixes-53
Bug Fixes
- Fix phx-change bug causing phx-target to not be used
0-5-0-2020-01-15
0.5.0 (2020-01-15)
LiveView now makes the connection session automatically available in LiveViews. However, to do so, you need to configure your endpoint accordingly, otherwise LiveView will fail to connect.
The steps are:
Find
plug Plug.Session, ...in your endpoint.ex and move the options...to a module attribute:@session_options [ ... ]Change the
plug Plug.Sessionto use said attribute:plug Plug.Session, @session_optionsAlso pass the
@session_optionsto your LiveView socket:socket "/live", Phoenix.LiveView.Socket, websocket: [connect_info: [session: @session_options]]You should define the CSRF meta tag inside <head> in your layout, before
app.jsis included:<%= csrf_meta_tag() %> <script type="text/javascript" src="<%= Routes.static_path(@conn, "/js/app.js") %>"></script>Then in your app.js:
let csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content"); let liveSocket = new LiveSocket("/live", Socket, {params: {_csrf_token: csrfToken}});
Also note that the session from now on will have string keys. LiveView will warn if atom keys are used.
enhancements-34
Enhancements
- Respect new tab behavior in
live_link - Add
beforeUpdateandbeforeDestroyJS hooks - Make all assigns defined on the socket mount available on the layout on first render
- Provide support for live layouts with new
:layoutoption - Detect duplicate IDs on the front-end when DEBUG mode is enabled
- Automatically forward the session to LiveView
- Support "live_socket_id" session key for identifying (and disconnecting) LiveView sockets
- Add support for
hibernate_afteron LiveView processes - Support redirecting to full URLs on
live_redirectandredirect - Add
offsetXandoffsetYto click event metadata - Allow
live_linkandlive_redirectto exist anywhere in the page and it will always target the main LiveView (the one defined at the router)
backwards-incompatible-changes-10
Backwards incompatible changes
phx-target="window"has been removed in favor ofphx-window-keydown,phx-window-focus, etc, and thephx-targetbinding has been repurposed for targeting LiveView and LiveComponent events from the clientPhoenix.LiveViewno longer definedlive_renderandlive_link. These functions have been moved toPhoenix.LiveView.Helperswhich can now be fully imported in your views. In other words, replaceimport Phoenix.LiveView, only: [live_render: ..., live_link: ...]byimport Phoenix.LiveView.Helpers
0-4-1-2019-11-07
0.4.1 (2019-11-07)
bug-fixes-54
Bug Fixes
- Fix bug causing blurred inputs
0-4-0-2019-11-07
0.4.0 (2019-11-07)
enhancements-35
Enhancements
- Add
Phoenix.LiveComponentto compartmentalize state, markup, and events in LiveView - Handle outdated clients by refreshing the page with jitter when a valid, but outdated session is detected
- Only dispatch live link clicks to router LiveView
- Refresh the page for graceful error recovery on failed mount when the socket is in a connected state
bug-fixes-55
Bug Fixes
- Fix
phx-hookdestroyed callback failing to be called in certain cases - Fix back/forward bug causing LiveView to fail to remount
0-3-1-2019-09-23
0.3.1 (2019-09-23)
backwards-incompatible-changes-11
Backwards incompatible changes
live_isolatedin tests no longer requires a router and a pipeline (it now expects only 3 arguments)- Raise if
handle_paramsis used on a non-router LiveView
bug-fixes-56
Bug Fixes
- [LiveViewTest] Fix function clause errors caused by HTML comments
0-3-0-2019-09-19
0.3.0 (2019-09-19)
enhancements-36
Enhancements
- Add
phx-debounceandphx-throttlebindings to rate limit events
backwards-incompatible-changes-12
Backwards incompatible changes
- IE11 support now requires two additional polyfills,
mdn-polyfills/CustomEventandmdn-polyfills/String.prototype.startsWith
bug-fixes-57
Bug Fixes
- Fix IE11 support caused by unsupported
getAttributeNameslookup - Fix Floki dependency compilation warnings
0-2-1-2019-09-17
0.2.1 (2019-09-17)
bug-fixes-58
Bug Fixes
- [LiveView.Router] Fix module concat failing to build correct layout module when using custom namespace
- [LiveViewTest] Fix
phx-updateappend/prepend containers not building proper DOM content - [LiveViewTest] Fix
phx-updateappend/prepend containers not updating existing child containers with matching IDs
0-2-0-2019-09-12
0.2.0 (2019-09-12)
enhancements-37
Enhancements
- [LiveView] Add new
:containeroption touse Phoenix.LiveView - [LiveViewTest] Add
live_isolatedtest helper for testing LiveViews which are not routable
backwards-incompatible-changes-13
Backwards incompatible changes
- Replace
configure_temporary_assigns/2with 3-tuple mount return, supporting a:temporary_assignskey - Do not allow
redirect/live_redirecton mount nor in child live views - All
phx-updatecontainers now require a unique ID LiveSocketJavaScript constructor now requires explicit dependency injection of Phoenix Socket constructor. For example:
import {Socket} from "phoenix"
import LiveSocket from "phoenix_live_view"
let liveSocket = new LiveSocket("/live", Socket, {...})
bug-fixes-59
Bug Fixes
- Fix
phx-update=append/prependfailing to join new nested live views or wire up new phx-hooks - Fix number input handling causing some browsers to reset form fields on invalid inputs
- Fix multi-select decoding causing server error
- Fix multi-select change tracking failing to submit an event when a value is deselected
- Fix live redirect loop triggered under certain scenarios
- Fix params failing to update on re-mounts after live_redirect
- Fix blur event metadata being sent with type of
"focus"
0-1-2-2019-08-28
0.1.2 (2019-08-28)
backwards-incompatible-changes-14
Backwards incompatible changes
phx-valuehas no effect, usephx-value-*instead- The
:path_paramskey in session has no effect (usehandle_paramsinLiveViewinstead)
0-1-1-2019-08-27
0.1.1 (2019-08-27)
enhancements-38
Enhancements
- Use optimized
insertAdjacentHTMLfor faster append/prepend and proper css animation handling - Allow for replacing previously appended/prepended elements by replacing duplicate IDs during append/prepend instead of adding new DOM nodes
bug-fixes-60
Bug Fixes
- Fix duplicate append/prepend updates when parent content is updated
- Fix JS hooks not being applied for appending and prepended content
0-1-0-2019-08-25
0.1.0 (2019-08-25)
enhancements-39
Enhancements
- The LiveView
handle_in/3callback now receives a map of metadata about the client event - For
phx-changeevents,handle_in/3now receives a"_target"param representing the keyspace of the form input name which triggered the change - Multiple values may be provided for any phx binding by using the
phx-value-prefix, such asphx-value-myval1,phx-value-myval2, etc - Add control over the DOM patching via
phx-update, which can be set to"replace","append","prepend"or"ignore"
backwards-incompatible-changes-15
Backwards incompatible changes
phx-ignorewas renamed tophx-update="ignore"