View Source LiveViewNative.Component (live_view_native v0.3.1)
Define reusable LiveView Native function components with NEEx templates.
This module is used for the following
- format specific render components
- format specific functional components
- format specific layouts
LiveView Native Components differ from Phoenix Components in that they make
use of a two-argument function instead of a single argument function. For example,
with a Phoenix Component that has a template named foo_bar.html.heex it would define
foo_bar/1 as the rendering function for that template when embeded. LiveView Native Components
would definee foo_bar/2 for foo_bar.swiftui.neex with the 1st argument still being assigns and
the 2nd argument being interface map with information about the native client that is connecting.
For more information on template embedding see LiveViewNative.Renderer.embed_templates/2
Interface map
Each native client can optionally send along an interface map that has at least the following information:
"target"- the target device within the platform family. For example,ios,ipados,watchosare all targets for the SwiftUI platform. Each client library should have information on the valid targets"version"- the version of your application. This is a value that you can control and pattern match on. Theversionwill need to be set in the native client build."client_version"- the version of the client library that is connecting. The client will set this.
Summary
Functions
Uses LiveView Native Component in the current module
Embed the CSRF token for LiveView as a tag
The ~LVN sigil for writing HEEx templates inside source files.
Functions
Uses LiveView Native Component in the current module
Options
:format- the format that corresponds to a LiveView Native client format for this component:root- the directory relative to the component module's location where templates are stored. SeeLiveViewNative.Renderer.embed_templates/2for more information.:as- will override the name of the rendering function injected into the module. SeeLiveViewNative.Renderer.embed_templates/2for more information.
Format-Specific Render Component
defmodule MyAppWeb.HomeLive.SwiftUI do
use LiveViewNative.Component,
format: :swiftui,
as: :render
endIn this example :as is used and this will inject following:
embed_templates("swiftui/home_live*", root: nil, name: :render)Assuming there is a swiftui/home_live.swiftui.neex this will be embeded in the render
component as render/2.
Alternatively if you do not want to use templates but the in-line rendering you can declare your own
render/2 functions
def render(assigns, %{"target" => "watchos"}) do
~LVN"""
<Text>Hello, from WatchOS!</Text>
"""
end
def render(assigns, %{"target" => target}) when target in ~w{macos tvos} do
~LVN"""
<Text>Hello, from <%= target %>!</Text>
"""
end
def render(assigns, _interface) do
~LVN"""
<Text>Hello, from SwiftUI!</Text>
"""
endFormat-Specific Function Component
defmodule MyAppWeb.NativeComponent.SwiftUI do
use LiveViewNative.Component,
format: :swiftui
endWhen using to write your own function components it is nearly identical to Phoenix.Component.
You will use embed_templates/2 for template embedding and this will inject functions that take
assigns and interface as arguments.
You can also define your own functions but you lose the 2 arity, or you can create it yourself.
def radio_button(assigns) do
interface = LiveViewNative.Utils.get_interface(assigns)
radio_button(assign, interface)
end
def radio_button(assigns, %{"target" => "watchos"}) do
~LVN"""
...
"""
endFormat-Specific Layouts
defmodule MyAppWeb.Layouts.SwiftUI do
use LiveViewNative.Component,
format: :swiftui
import LiveViewNative.Component, only: [csrf_token: 1]
embed_templates "layouts_swiftui/*"
endMost times you will want to provide app and root templates.
For stylesheet embedding refer to LiveViewNative.Stylesheet.Component
Embed the CSRF token for LiveView as a tag
The ~LVN sigil for writing HEEx templates inside source files.
Using ~LVN is nearly identical to ~H in Phoenix.Component but deviates
in various ways.
One common misconception is that LiveView Native templates are just HTML or XML. This is not true. Both HTML and XML have specifications that at times conflict with the needs of how LiveView Native client UI frameworks should be represented. Think of LiveView Native templates as a composable markup whose specification is currently under development. As we continue to expand the LiveView Native ecosystem this list will likely grow:
- casing -
~LVNdoes not enforce downcasing of tag names so<Text>is a valid tag name