Vue 3 composables for Electric SQL. Provides reactive bindings to Electric shapes with automatic sync, caching, and cleanup.
pnpm add @binary-signal/electric-sql-vue @electric-sql/client<script setup lang="ts">
import { ref } from "vue";
import { useShape } from "@binary-signal/electric-sql-vue";
const { data, isLoading, error } = useShape({
url: "http://localhost:3000/v1/shape",
params: { table: "items" },
});
</script>
<template>
<div v-if="isLoading">Loading...</div>
<div v-else-if="error">Error: {{ error }}</div>
<ul v-else>
<li v-for="item in data" :key="item.id">{{ item.name }}</li>
</ul>
</template>Pass a getter to automatically reconnect when parameters change:
const filter = ref("");
const { data } = useShape(() => ({
url: "http://localhost:3000/v1/shape",
params: {
table: "items",
where: `name LIKE '%${filter.value}%'`,
},
}));Use createElectric to provide a base URL and default headers to all useShape calls:
// main.ts
import { createApp } from "vue";
import { createElectric } from "@binary-signal/electric-sql-vue";
import App from "./App.vue";
const app = createApp(App);
app.use(
createElectric({
baseUrl: "http://localhost:3000",
headers: { Authorization: "Bearer token123" },
}),
);
app.mount("#app");Components can then omit the url — it's inherited from the plugin:
<script setup lang="ts">
import { useShape } from "@binary-signal/electric-sql-vue";
// No url needed — inferred as baseUrl + '/v1/shape'
const { data } = useShape({ params: { table: "items" } });
</script>Per-call options override plugin defaults (headers are merged, per-call wins).
By default, data uses shallowRef for performance (Electric replaces the full array on sync). Opt into deep
reactivity if needed:
const { data } = useShape(options, { shallow: false });| Return | Type | Description |
|---|---|---|
data |
ShallowRef<T[]> |
Current rows |
isLoading |
Ref<boolean> |
True during initial fetch |
error |
ShallowRef<Error | false> |
Error or false |
isError |
Ref<boolean> |
True if error state |
lastSyncedAt |
Ref<number | undefined> |
Unix timestamp of last sync |
shape |
ShallowRef<Shape<T>> |
Underlying Shape instance |
stream |
ShallowRef<ShapeStream<T>> |
Underlying ShapeStream instance |
Options: MaybeRefOrGetter<ShapeStreamOptions<T>> — accepts a plain object, ref, or getter function.
Composable options: { shallow?: boolean } — default true.
import { getShapeStream, getShape, preloadShape } from "@binary-signal/electric-sql-vue";getShapeStream(options)— get or create a cached ShapeStreamgetShape(stream)— get or create a cached Shape from a streampreloadShape(options)— preload shape data (useful for SSR)
- Vue 3.3+
@electric-sql/client^1.0.0
MIT