vleam/vue
Types
An incomplete component representation piped during component definition.
See define_component
for a full example.
pub type ComponentBase(required_props, nullable_props, emits)
DebuggerEvent returned from Vue
pub type DebuggerEvent
NullableProp record to be used on component definition.
See define_component
for a full example.
pub type NullableProp(value) {
NullableProp(name: String)
}
Constructors
-
NullableProp(name: String)
Prop record to be used on component definition.
See define_component
for a full example.
pub type Prop(value) {
Prop(name: String, default: Option(value))
}
Constructors
-
Prop(name: String, default: Option(value))
A vue
shallowRef
pub type ShallowRef(value)
Watchable types
pub type Watchable(value) {
Ref(watchable: Ref(value))
ShallowRef(watchable: ShallowRef(value))
Computed(watchable: Computed(value))
Function(watchable: fn() -> value)
Plain(watchable: value)
}
Constructors
-
Ref(watchable: Ref(value))
-
ShallowRef(watchable: ShallowRef(value))
-
Computed(watchable: Computed(value))
-
Function(watchable: fn() -> value)
-
Plain(watchable: value)
Functions
pub fn define_component(
components components: List(#(String, fn() -> Component)),
directives directives: List(#(String, fn() -> Directive)),
inherit_attrs inherit_attrs: Bool,
) -> ComponentBase(Nil, Nil, Nil)
Entrypoint for component definition. optionally piped to a
with_n_props
and/or with_n_nullable_props
and/or with_emits
functions, and must be finally piped to setup
.
components
is a list of #(component_name, fn() -> Component) tuples. There
are three possible ways to gain access to components:
- Using
@external
to refer to a component defined in Javascript - Importing a component defined in Gleam using this library
- Using them without the need to refer them in
define_component
, either by gloabl definition withvue.component
or by an auto-import mechanism similar to Nuxt’s
directives
is a list of #(directive_name, fn() -> Directive) tuples.
inherit_attrs
is a boolean, identical to Vue’s javascript configuration.
Example
import gleam/option.{None, Some}
import gleam/string
import vleam/vue.{
type Component, NullableProp, Prop, define_component, setup,
with_1_nullable_prop, with_1_prop,
}
import vleam_todo/models.{type Todo, type TodoError}
type InputEvent
// Import the default export from HelloWorld.vue
// This is technically an incorrect type, but it'll work. C'est la vie.
@external(javascript, "/src/components/HelloWorld.vue", "default")
fn hello_world_component() -> Component
// Also works for external packages, although @ sign has to be aliased
@external(javascript, "heroicons/vue/24/solid", "UserIcon")
fn user_icon() -> Component
// or you can predefine in TS/JS
@external(javascript, "/src/ffi.ts", "CheckIcon")
fn check_icon() -> #(String, fn() -> Component)
pub fn default_export() -> Component {
define_component(
[
#("HelloWorld", hello_world_component),
#("UserIcon", user_icon),
check_icon(),
],
[],
False,
)
|> with_1_prop(
Prop("initialName", None),
)
|> with_1_nullable_prop(
Prop("greeting", Some("Hello, ")),
)
// Props are handed as Computed for reactivity. It's best practice to
// always type them, as types are only inferred if there's a default value.
|> setup(fn(
required_props: #(Computed(String)),
nullable_props: #(Computed(String)),
_
) {
let initial_name = props.0
let greeting = props.1
// Errors are thrown. This is just a demo, don't throw on bad input,
// only on irrecoverable errors.
use <- bool.guard(
{
greeting
|> vue.computed_value
|> string.length
}
> 0,
Error("Empty greeting"),
)
let change_count = vue.shallow_ref(0)
let increment_count = fn() {
change_count
|> vue.shallow_ref_set(vue.shallow_ref_value(change_count) + 1)
}
let name =
initial_name
|> vue.computed_value
|> vue.shallow_ref
let change_name = fn(new_name) {
name
|> vue.shallow_ref_set(new_name)
}
let full_greeting =
vue.computed(fn() {
name
|> vue.shallow_ref_value
|> string.append(
greeting
|> vue.computed_value
)
increment_count()
})
// To return values to the template, the FFI expects an Ok() with a
// tuple of object entires tuples. The following is identical to Vue's:
//
// return {
// fullGreeting: full_greeting,
// changeName: change_name,
// changeCount: change_count,
// };
Ok(#(
#("fullGreeting", full_greeting),
#("changeName", change_name),
#("changeCount", change_count),
))
})
}
pub fn get_component(
vue_app: App,
component_name: String,
) -> Result(Component, VueError)
Returns components that were registered using app.component
pub fn inject_with_default(key: String, default: a) -> a
pub fn inject_with_factory(key: String, factory: fn() -> a) -> a
pub fn next_tick() -> Promise(Nil)
vue.nextTick() https://vuejs.org/api/general.html#nexttick
pub fn next_tick_action(callback: fn() -> Nil) -> Promise(Nil)
pub fn on_activated(handler: fn() -> Nil) -> Nil
pub fn on_before_mount(handler: fn() -> Nil) -> Nil
pub fn on_before_unmount(handler: fn() -> Nil) -> Nil
pub fn on_before_update(handler: fn() -> Nil) -> Nil
pub fn on_deactivated(handler: fn() -> Nil) -> Nil
pub fn on_mounted(handler: fn() -> Nil) -> Nil
pub fn on_unmounted(handler: fn() -> Nil) -> Nil
pub fn on_updated(handler: fn() -> Nil) -> Nil
pub fn register_component(
vue_app: App,
component_name: String,
component: Component,
) -> App
Registers components using app.component
pub fn setup(
base: ComponentBase(a, b, c),
setup: fn(a, b, c) -> d,
) -> Component
Component setup function
See define_component
for a full example.
pub fn shallow_ref_set(
ref: ShallowRef(a),
value: a,
) -> ShallowRef(a)
Set shallow ref value
pub fn watch1(
reflikes reflikes: #(Watchable(a)),
callback callback: fn(a, a, Option(fn(fn() -> Nil) -> Nil)) ->
Nil,
) -> Nil
pub fn watch1_with_options(
reflikes reflikes: #(Watchable(a)),
callback callback: fn(a, a, Option(fn(fn() -> Nil) -> Nil)) ->
Nil,
immediate immediate: Option(Bool),
deep deep: Option(Bool),
flush flush: Option(String),
on_track on_track: Option(fn(DebuggerEvent) -> Nil),
on_trigger on_trigger: Option(fn(DebuggerEvent) -> Nil),
once once: Option(Bool),
) -> Nil
pub fn watch2(
reflikes reflikes: #(Watchable(a), Watchable(b)),
callback callback: fn(
#(Watchable(a), Watchable(b)),
#(Watchable(a), Watchable(b)),
Option(fn(fn() -> Nil) -> Nil),
) -> Nil,
) -> Nil
pub fn watch2_with_options(
reflikes reflikes: #(Watchable(a), Watchable(b)),
callback callback: fn(
#(Watchable(a), Watchable(b)),
#(Watchable(a), Watchable(b)),
Option(fn(fn() -> Nil) -> Nil),
) -> Nil,
immediate immediate: Option(Bool),
deep deep: Option(Bool),
flush flush: Option(String),
on_track on_track: Option(fn(DebuggerEvent) -> Nil),
on_trigger on_trigger: Option(fn(DebuggerEvent) -> Nil),
once once: Option(Bool),
) -> Nil
pub fn watch3(
reflikes reflikes: #(Watchable(a), Watchable(b), Watchable(c)),
callback callback: fn(
#(Watchable(a), Watchable(b), Watchable(c)),
#(Watchable(a), Watchable(b), Watchable(c)),
Option(fn(fn() -> Nil) -> Nil),
) -> Nil,
) -> Nil
pub fn watch3_with_options(
reflikes reflikes: #(Watchable(a), Watchable(b), Watchable(c)),
callback callback: fn(
#(Watchable(a), Watchable(b), Watchable(c)),
#(Watchable(a), Watchable(b), Watchable(c)),
Option(fn(fn() -> Nil) -> Nil),
) -> Nil,
immediate immediate: Option(Bool),
deep deep: Option(Bool),
flush flush: Option(String),
on_track on_track: Option(fn(DebuggerEvent) -> Nil),
on_trigger on_trigger: Option(fn(DebuggerEvent) -> Nil),
once once: Option(Bool),
) -> Nil
pub fn watch4(
reflikes reflikes: #(
Watchable(a),
Watchable(b),
Watchable(c),
Watchable(d),
),
callback callback: fn(
#(Watchable(a), Watchable(b), Watchable(c), Watchable(d)),
#(Watchable(a), Watchable(b), Watchable(c), Watchable(d)),
Option(fn(fn() -> Nil) -> Nil),
) -> Nil,
) -> Nil
pub fn watch4_with_options(
reflikes reflikes: #(
Watchable(a),
Watchable(b),
Watchable(c),
Watchable(d),
),
callback callback: fn(
#(Watchable(a), Watchable(b), Watchable(c), Watchable(d)),
#(Watchable(a), Watchable(b), Watchable(c), Watchable(d)),
Option(fn(fn() -> Nil) -> Nil),
) -> Nil,
immediate immediate: Option(Bool),
deep deep: Option(Bool),
flush flush: Option(String),
on_track on_track: Option(fn(DebuggerEvent) -> Nil),
on_trigger on_trigger: Option(fn(DebuggerEvent) -> Nil),
once once: Option(Bool),
) -> Nil
pub fn watch5(
reflikes reflikes: #(
Watchable(a),
Watchable(b),
Watchable(c),
Watchable(d),
Watchable(e),
),
callback callback: fn(
#(
Watchable(a),
Watchable(b),
Watchable(c),
Watchable(d),
Watchable(e),
),
#(
Watchable(a),
Watchable(b),
Watchable(c),
Watchable(d),
Watchable(e),
),
Option(fn(fn() -> Nil) -> Nil),
) -> Nil,
) -> Nil
pub fn watch5_with_options(
reflikes reflikes: #(
Watchable(a),
Watchable(b),
Watchable(c),
Watchable(d),
Watchable(e),
),
callback callback: fn(
#(
Watchable(a),
Watchable(b),
Watchable(c),
Watchable(d),
Watchable(e),
),
#(
Watchable(a),
Watchable(b),
Watchable(c),
Watchable(d),
Watchable(e),
),
Option(fn(fn() -> Nil) -> Nil),
) -> Nil,
immediate immediate: Option(Bool),
deep deep: Option(Bool),
flush flush: Option(String),
on_track on_track: Option(fn(DebuggerEvent) -> Nil),
on_trigger on_trigger: Option(fn(DebuggerEvent) -> Nil),
once once: Option(Bool),
) -> Nil
pub fn with_1_nullable_prop(
component: ComponentBase(a, b, c),
prop_1: NullableProp(d),
) -> ComponentBase(a, #(Computed(Option(d))), c)
Define 1 prop on a component
See define_component
for a full example.
pub fn with_1_prop(
component: ComponentBase(a, b, c),
prop_1: Prop(d),
) -> ComponentBase(#(Computed(d)), b, c)
Define 1 prop on a component
See define_component
for a full example.
pub fn with_2_nullable_props(
component: ComponentBase(a, b, c),
prop_1: NullableProp(d),
prop_2: NullableProp(e),
) -> ComponentBase(
a,
#(Computed(Option(d)), Computed(Option(e))),
c,
)
Define 2 props on a component
See define_component
for a full example.
pub fn with_2_props(
component: ComponentBase(a, b, c),
prop_1: Prop(d),
prop_2: Prop(e),
) -> ComponentBase(#(Computed(d), Computed(e)), b, c)
Define 2 props on a component
See define_component
for a full example.
pub fn with_3_nullable_props(
component: ComponentBase(a, b, c),
prop_1: NullableProp(d),
prop_2: NullableProp(e),
prop_3: NullableProp(f),
) -> ComponentBase(
a,
#(Computed(Option(d)), Computed(Option(e)), Computed(Option(f))),
c,
)
Define 3 props on a component
See define_component
for a full example.
pub fn with_3_props(
component: ComponentBase(a, b, c),
prop_1: Prop(d),
prop_2: Prop(e),
prop_3: Prop(f),
) -> ComponentBase(#(Computed(d), Computed(e), Computed(f)), b, c)
Define 3 props on a component
See define_component
for a full example.
pub fn with_4_nullable_props(
component: ComponentBase(a, b, c),
prop_1: NullableProp(d),
prop_2: NullableProp(e),
prop_3: NullableProp(f),
prop_4: NullableProp(g),
) -> ComponentBase(
a,
#(
Computed(Option(d)),
Computed(Option(e)),
Computed(Option(f)),
Computed(Option(g)),
),
c,
)
Define 4 props on a component
See define_component
for a full example.
pub fn with_4_props(
component: ComponentBase(a, b, c),
prop_1: Prop(d),
prop_2: Prop(e),
prop_3: Prop(f),
prop_4: Prop(g),
) -> ComponentBase(
#(Computed(d), Computed(e), Computed(f), Computed(g)),
b,
c,
)
Define 4 props on a component
See define_component
for a full example.
pub fn with_5_nullable_props(
component: ComponentBase(a, b, c),
prop_1: NullableProp(d),
prop_2: NullableProp(e),
prop_3: NullableProp(f),
prop_4: NullableProp(g),
prop_5: NullableProp(h),
) -> ComponentBase(
a,
#(
Computed(Option(d)),
Computed(Option(e)),
Computed(Option(f)),
Computed(Option(g)),
Computed(Option(h)),
),
c,
)
Define 5 props on a component
See define_component
for a full example.
pub fn with_5_props(
component: ComponentBase(a, b, c),
prop_1: Prop(d),
prop_2: Prop(e),
prop_3: Prop(f),
prop_4: Prop(g),
prop_5: Prop(h),
) -> ComponentBase(
#(
Computed(d),
Computed(e),
Computed(f),
Computed(g),
Computed(h),
),
b,
c,
)
Define 5 props on a component
See define_component
for a full example.
pub fn with_6_nullable_props(
component: ComponentBase(a, b, c),
prop_1: NullableProp(d),
prop_2: NullableProp(e),
prop_3: NullableProp(f),
prop_4: NullableProp(g),
prop_5: NullableProp(h),
prop_6: NullableProp(i),
) -> ComponentBase(
a,
#(
Computed(Option(d)),
Computed(Option(e)),
Computed(Option(f)),
Computed(Option(g)),
Computed(Option(h)),
Computed(Option(i)),
),
c,
)
Define 6 props on a component
See define_component
for a full example.
pub fn with_6_props(
component: ComponentBase(a, b, c),
prop_1: Prop(d),
prop_2: Prop(e),
prop_3: Prop(f),
prop_4: Prop(g),
prop_5: Prop(h),
prop_6: Prop(i),
) -> ComponentBase(
#(
Computed(d),
Computed(e),
Computed(f),
Computed(g),
Computed(h),
Computed(i),
),
b,
c,
)
Define 6 props on a component
See define_component
for a full example.
pub fn with_7_nullable_props(
component: ComponentBase(a, b, c),
prop_1: NullableProp(d),
prop_2: NullableProp(e),
prop_3: NullableProp(f),
prop_4: NullableProp(g),
prop_5: NullableProp(h),
prop_6: NullableProp(i),
prop_7: NullableProp(j),
) -> ComponentBase(
a,
#(
Computed(Option(d)),
Computed(Option(e)),
Computed(Option(f)),
Computed(Option(g)),
Computed(Option(h)),
Computed(Option(i)),
Computed(Option(j)),
),
c,
)
Define 7 props on a component
See define_component
for a full example.
pub fn with_7_props(
component: ComponentBase(a, b, c),
prop_1: Prop(d),
prop_2: Prop(e),
prop_3: Prop(f),
prop_4: Prop(g),
prop_5: Prop(h),
prop_6: Prop(i),
prop_7: Prop(j),
) -> ComponentBase(
#(
Computed(d),
Computed(e),
Computed(f),
Computed(g),
Computed(h),
Computed(i),
Computed(j),
),
b,
c,
)
Define 7 props on a component
See define_component
for a full example.
pub fn with_8_nullable_props(
component: ComponentBase(a, b, c),
prop_1: NullableProp(d),
prop_2: NullableProp(e),
prop_3: NullableProp(f),
prop_4: NullableProp(g),
prop_5: NullableProp(h),
prop_6: NullableProp(i),
prop_7: NullableProp(j),
prop_8: NullableProp(k),
) -> ComponentBase(
a,
#(
Computed(Option(d)),
Computed(Option(e)),
Computed(Option(f)),
Computed(Option(g)),
Computed(Option(h)),
Computed(Option(i)),
Computed(Option(j)),
Computed(Option(k)),
),
c,
)
Define 8 props on a component
See define_component
for a full example.
pub fn with_8_props(
component: ComponentBase(a, b, c),
prop_1: Prop(d),
prop_2: Prop(e),
prop_3: Prop(f),
prop_4: Prop(g),
prop_5: Prop(h),
prop_6: Prop(i),
prop_7: Prop(j),
prop_8: Prop(k),
) -> ComponentBase(
#(
Computed(d),
Computed(e),
Computed(f),
Computed(g),
Computed(h),
Computed(i),
Computed(j),
Computed(k),
),
b,
c,
)
Define 8 props on a component
See define_component
for a full example.
pub fn with_9_nullable_props(
component: ComponentBase(a, b, c),
prop_1: NullableProp(d),
prop_2: NullableProp(e),
prop_3: NullableProp(f),
prop_4: NullableProp(g),
prop_5: NullableProp(h),
prop_6: NullableProp(i),
prop_7: NullableProp(j),
prop_8: NullableProp(k),
prop_9: NullableProp(l),
) -> ComponentBase(
a,
#(
Computed(Option(d)),
Computed(Option(e)),
Computed(Option(f)),
Computed(Option(g)),
Computed(Option(h)),
Computed(Option(i)),
Computed(Option(j)),
Computed(Option(k)),
Computed(Option(l)),
),
c,
)
Define 9 props on a component
See define_component
for a full example.
pub fn with_9_props(
component: ComponentBase(a, b, c),
prop_1: Prop(d),
prop_2: Prop(e),
prop_3: Prop(f),
prop_4: Prop(g),
prop_5: Prop(h),
prop_6: Prop(i),
prop_7: Prop(j),
prop_8: Prop(k),
prop_9: Prop(l),
) -> ComponentBase(
#(
Computed(d),
Computed(e),
Computed(f),
Computed(g),
Computed(h),
Computed(i),
Computed(j),
Computed(k),
Computed(l),
),
b,
c,
)
Define 9 props on a component
See define_component
for a full example.
pub fn with_emits(
base: ComponentBase(a, b, c),
emits: List(String),
) -> ComponentBase(a, d, e)
Define emits on a component