Rendering
What happens when a component is rendered? Quite a bit actually. Letβs have a look.
View template
All Phlex components have the view_template
method. This method is where you implement the logic for rendering the componentβs HTML.
class MyComponent < Base::Component
def view_template
div do
h1 { "Hello, World!" }
end
end
end
Rendering inside Rails
Rendering the component from an Erb view in Rails might look something like this:
<%= render MyComponent.new %>
π Unlock content
Pre-order this course to unlock this video, source code, and content.
βββ βββββ ββββββ ββββββ βββββ βββ ββββββββββ ββββββ ββ βββ ββββββββ ββ ββββββββββββββββ ββββ ββ βββ βββββ ββββ ββ βββββ ββββββββββββ βββ ββββββββ ββββ ββββββββ ββ βββββββββ ββββ ββ ββββββββ ββ ββββββ ββββ ββ βββ βββββββββββββ ββββββ ββ ββββββ ββ ββββββββββ βββββ βββββββββββββββ βββ βββββ βββββββ ββββ ββ ββ ββββ βββββ
Rendering before
and after
hooks
βββββ βββ βββββββββ βββββ ββββ βββ ββββββ βββ ββββββββββββ ββββββββ βββββββββ βββββ βββ βββββ βββ ββββββββ βββ ββββ βββββ βββββββββ ββ βββββ ββββββββββ β βββββββ ββββββ βββ βββββ βββ βββββββββββ βββββ
class Base::Component < βββββ::βββββββββ
if βββββ.βββ.ββββββββββββ
def βββββββββββββββ
βββββββ { "Before #{self.βββββ.ββββ}" }
super
end
def ββββββββββββββ
βββββββ { "After #{self.βββββ.ββββ}" }
super
end
end
end
ββββ βββββ ββ ββββββ βββ βββββββββ ββ βββββββββββ ββββ ββββ βββββββββ βββββ βββ βββββ ββββββββββββ ββββββββββββββββ ββββ
The around_template
hook
β ββββ ββββββ ββββ ββββββ βββ ββ ββββ βββββββββββ ββββ ββ βββ βββββββββββββββ βββββββ ββββ ββββββ ββ ββββββ ββββββ βββ βββββββββββββ ββββββ βββ βββ ββ ββββ ββ βββββββββ ββββββ βββββββββββ
ββββββββ βββ βββββββββ ββββ ββββββββββ
class CardComponent < ββββ::βββββββββ
def βββββββββββββββ
super do
βββ(class: "card") do
yield β βββββββ βββ βββββββββββββββ
end
end
end
def βββββββββββββ
βββ do
ββ { "Hello, World!" }
end
end
end
ββ ββββ ββββββββ ββ ββββ βββ ββββ ββββββββ ββ β βββ βββ ββββ βββ ββββ ββββββ βββββββ β βββ βββββ ββ βββββ βββ βββββ ββββββ βββββ βββ βββββββββββββββ ββββββ ββββ βββ βββββββββββ ββ ββ ββββ ββββ ββββ ββ ββββββββ βββ βββ ββββ ββββββββ ββ βββββββββββ ββ βββ βββββββββββββββ βββββββββββ
βββ βββββ βββββ ββ βββββ βββ βββββββββββββ ββ βββββββββ ββββ β βββββ ββββ ββ ββββββ ββ βββ βββββββββββββββ ββββββ βββ ββ ββββββ ββββββ βββ ββββββ
The around_template
hook is useful for implementing layouts for components.
βββ βββββββββββββ ββ βββββββββββ βββββ βββ ββββ ββββββ βββββ βββββ ββββ βββββ βββ ββ βββ ββββ βββ ββββββ ββββββ βββββ ββββββββββ ββββ ββ ββββ ββ β βββ ββ ββββ βββ ββββ βββββββ ββββββ β ββββββββββββββ βββββ ββ βββ βββββββ ββββ βββββββ
class ContactCard < βββββββββββββ
def ββββββββββ(ββββ:)
βββββ = ββββ
end
def βββββββββββββ
ββ { βββββ.ββββ}
ββ { "Contact Information" }
ββ do
ββ { "Phone" }
ββ { βββββ.βββββ }
ββ { "Email" }
ββ { βββββ.βββββ }
end
end
end
ββββ ββββ ββββββββ βββ ββββββββ ββ βββ βββββββββββββ βββ βββββββ ββββ βββ βββ βββ ββ βββ βββββββββββββββ ββββββ ββββ βββ βββββββββββββ βββββββββββ βββββββ β ββββββ βββ ββ βββββββββ βββββββ βββββββ βββββ βββββ βββ ββββ ββ β βββββ ββββββββ
Rendering is polymorphic
βββ ββββββ ββββββ ββ βββββ ββ βββββ ββββββββ βββ βββ ββββ ββ βββββββ ββββββ βββββββ βββ ββ ββββ ββ βββββββ βββββ βββββββ ββ ββββ ββββββ βββ
βββββ ββββββββββ βββ βββββββββββ βββββββββ ββ ββββββ ββ β βββββ ββββββ ββββ βββ ββ βββββββ
class TitleCard < βββββββββββββ
def βββββ = nil
def ββββββββ = nil
def βββββββββββββββ(&βββββ)
super do
β ββββββ βββ βββββ
ββ { βββββ }
ββ &method(:subtitle)
yield
end
end
end
βββ βββββ ββββββββββββ βββ βββββββββββ βββββββββ βββββ βββ βββββββββ ββββββββββ
class ContactCard < βββββββββ
def ββββββββββ(ββββ:)
βββββ = ββββ
end
def βββββ = βββββ.ββββ
def ββββββββ = "Contact Information"
def βββββββββββββ
ββ do
ββ { "Phone" }
ββ { βββββ.βββββ }
ββ { "Email" }
ββ { βββββ.βββββ }
end
end
end
ββ βββ βββββββ βββ ββββββββ βββ βββββ βββ ββββββββ βββββββ ββββββ βββββββ ββββ βββββ ββββββββ βββ ββββ ββ ββ ββββ βββ βββββ ββ ββββ ββ βββ ββββββ βββββββ βββββ
class ContactCard < βββββββββ
def ββββββββββ(ββββ:)
βββββ = ββββ
end
def βββββ
β(href: βββββββββ(βββββ)) { βββββ.ββββ }
end
def ββββββββ = "Contact Information"
def βββββββββββββ
ββ do
ββ { "Phone" }
ββ { βββββ.βββββ }
ββ { "Email" }
ββ { βββββ.βββββ }
end
end
end
ββ ββββ ββββββββ βββ βββββ ββββββ βββ ββββββββ ββββ βββββββ βββββ ββββββββ ββββ βββββββ βββ βββ βββββ ββββ ββ ββββββββ ββββ βββ ββββ ββββββ ββββββββ ββ ββββββ