Description
Hex.pmHexdocs.pmGitHub

Vue inside Phoenix LiveView with seamless end-to-end reactivity.

Features

Resources

Example

After installation, you can use Vue components in the same way as you’d use functional LiveView components. You can even handle Vue events with JS hooks! All the phx-click, phx-change attributes works inside Vue components as well.

<script setup lang="ts">
import {ref} from "vue"

// props are passed from LiveView
const props = defineProps<{count: number}>()

// local state
const diff = ref(1)
</script>

<template>
  Current count: {{ props.count }}
  <label>Diff: </label>
  <input v-model.number="diff" type="range" min="1" max="10" />

  <button phx-click="inc" :phx-value-diff="diff">
    Increase counter by {{ diff }}
  </button>
</template>
defmodule MyAppWeb.CounterLive do
  use MyAppWeb, :live_view

  def render(assigns) do
    ~H"""
    <.vue count={@count} v-component="Counter" v-socket={@socket} />
    """
  end

  def mount(_params, _session, socket) do
    {:ok, assign(socket, count: 0)}
  end

  def handle_event("inc", %{"diff" => value}, socket) do
    {:noreply, update(socket, :count, &(&1 + value))}
  end
end

Why?

Phoenix Live View makes it possible to create rich, interactive web apps without writing JS.

But once you’ll need to do anything even slightly complex on the client-side, you’ll end up writing lots of imperative, hard-to-maintain hooks.

LiveVue allows to create hybrid apps, where part of the session state is on the server and part on the client.

Reasons why you’d like to use LiveVue

Installation

New project:

mix archive.install hex igniter_new
mix igniter.new my_app --with phx.new --install live_vue

Existing project (Phoenix 1.8+ only):

mix igniter.install live_vue

Igniter installer works only for Phoenix 1.8+ projects. For detailed installation instructions, see the Installation Guide.

VS Code Extension

For syntax highlighting of the ~VUE sigil:

Guides

Getting Started

Core Usage

Reference

Advanced Topics

Help & Troubleshooting

Relation to LiveSvelte

This project is heavily inspired by ✨ LiveSvelte ✨. Both projects try to solve the same problem. LiveVue was started as a fork of LiveSvelte with adjusted ESbuild settings, and evolved to use Vite and a slightly different syntax. I strongly believe more options are always better, and since I love Vue and it’s ecosystem I’ve decided to give it a go 😉

You can read more about differences between Vue and Svelte in FAQ or in comparison guide.

LiveVue Development

Local Setup

Ensure you have Node.js installed. Clone the repo and run mix setup.

No build step is required for the library itself - Vite handles TypeScript transpilation when consumers bundle their app.

Use npm run e2e:test to run the Playwright E2E tests.

Testing Local Changes in Another Project

To test local LiveVue changes in a separate Phoenix project, use a path dependency in your project’s mix.exs:

{:live_vue, path: "../live_vue"}

Then run mix deps.get && npm install. The installer already configures package.json to use file:./deps/live_vue, so both Elixir and npm will point to your local copy.

Elixir changes are reflected immediately. For TypeScript changes, run npm install again to pick them up.

Releasing

Release is done with expublish package.

Run

git add INSTALLATION.md
git commit -m "INSTALLATION version bump"

# to ensure everything works fine
mix expublish.minor --dry-run --allow-untracked --branch=main

# to publish
mix expublish.minor --allow-untracked --branch=main

Features Implemented 🎯

Credits

LiveSvelte

Star History

Star History Chart