A Crystal abstract class for building server-rendered HTML components with client-side interactivity.
These live views are framework-agnostic. You can use them with any framework and even without a framework at all. They define to_s(io) so you can either build a string out of them or pipe them to an IO object (such as your web response).
-
Add the dependency to your
shard.yml:dependencies: live_view: github: jgaskins/live_view
-
Run
shards install
To see a complete example app, check out crystal_live_view_example
require "live_view"To define a live view, you can inherit from the LiveView abstract class:
class MyView < LiveView
endIn your HTML layout:
<%= LiveView.javascript_tag %>To define what to render, you can either use the render macro to define the HTML inline or the template macro and specify the ECR template to render:
class CurrentTime < LiveView
render "The time is <time>#{Time.now}</time>"
endThe update(socket : HTTP::WebSocket) method will update the client with the new UI:
update(socket) # Update with the current stateThere are 3 hooks:
mount(socket : HTTP::WebSocket)is called when the client makes a successful websocket connectionunmount(socket : HTTP::WebSocket)is called when the websocket is closedhandle_event(message : String, data : String, socket : HTTP::WebSocket)is called when an incoming message is received from the client websocket. Thedataargument will be aStringin JSON format.
def mount(socket)
end
def unmount(socket)
end
def handle_event(message, data, socket)
case message
when "increment"
update(socket) { @count += 1 }
when "decrement"
update(socket) { @count -= 1 }
end
endYou can use the every(interval : Time::Span) method to call update at that interval. Use the mount(socket : HTTP::WebSocket) hook to set that up when the view mounts:
class CurrentTime < LiveView
render "The time is <time>#{Time.now}</time>"
def mount(socket)
every(1.second) { update socket }
end
end- While the client is connected via WebSocket, the view remains in memory. When the client disconnects, the view is discarded.
- LiveViews which either never mount or which encounter errors (such as
IO::Errorbreaking communication) will be discarded. - The client will be given 30-60 seconds to connect after the view has been instantiated, depending on where the system is in the collection cycle.
- Fork it (https://github.com/jgaskins/live_view/fork)
- Create your feature branch (
git checkout -b my-new-feature) - Commit your changes (
git commit -am 'Add some feature') - Push to the branch (
git push origin my-new-feature) - Create a new Pull Request
- Jamie Gaskins - creator and maintainer