vleam/vue

Types

A Vue App

pub type App

A Vue Component

pub type Component

An incomplete component representation piped during component definition. See define_component for a full example.

pub type ComponentBase(required_props, nullable_props, emits)

A vue computed

pub type Computed(value)

DebuggerEvent returned from Vue

pub type DebuggerEvent

A vue directive

pub type Directive

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 ref

pub type Ref(value)

A vue shallowRef

pub type ShallowRef(value)
pub type VueError {
  ComponentNotFound
}

Constructors

  • ComponentNotFound

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 computed(value: fn() -> a) -> Computed(a)

Define computed

pub fn computed_value(computed: Computed(a)) -> a

Get computed value

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:

  1. Using @external to refer to a component defined in Javascript
  2. Importing a component defined in Gleam using this library
  3. Using them without the need to refer them in define_component, either by gloabl definition with vue.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(key: String) -> Option(a)
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 provide(key: String, value: a) -> Nil
pub fn ref(initial_value: a) -> Ref(a)

Define a ref

pub fn ref_set(ref: Ref(a), value: a) -> Ref(a)

Set ref value

pub fn ref_value(value: Ref(a)) -> a

Get ref value

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(value: a) -> ShallowRef(a)

Define a shallow ref

pub fn shallow_ref_set(
  ref: ShallowRef(a),
  value: a,
) -> ShallowRef(a)

Set shallow ref value

pub fn shallow_ref_value(a: ShallowRef(a)) -> a

Get shallow ref value

pub fn trigger_ref(ref: ShallowRef(a)) -> Nil

Trigger a shallow ref

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

Search Document