Vue integration
SyncedStore works seamlessly together with Vue3's Reactivity system. To enable this, call enableVueBindings
once, for example when setting up your store.
import * as Vue from "vue";
import { enableVueBindings } from "@syncedstore/core";
enableVueBindings(Vue);
Then, place the SyncedStore store
on the Vue data
. See the example below.
Vue Example
See this example of creating a collaborative Todo application with Vue3 and SyncedStore:
<template> <main id="app"> <h1>Todo Vue</h1> <input class="new-todo" autofocus autocomplete="off" placeholder="What needs to be done?" v-model="newTodo" @keyup.enter="addTodo" /> <ul class="todo-list"> <li v-for="todo in store.todos" class="todo" > <div class="view"> <label> <input class="toggle" type="checkbox" v-model="todo.completed" /> {{ todo.title }} </label> <button class="destroy" @click="removeTodo(todo)">Delete</button> </div> </li> </ul> </main> </template> <script> import { store } from "./store"; import { ref } from "vue"; import * as Vue from "vue"; import { enableVueBindings } from "@syncedstore/core"; // make SyncedStore use Vuejs internally enableVueBindings(Vue); export default { name: "App", data() { return { store, // Put the store on the data() of the component newTodo: "" }; }, methods: { addTodo() { const value = this.newTodo && this.newTodo.trim(); if (!value) { return; } this.store.todos.push({ title: value, completed: false, }); this.newTodo = ""; }, removeTodo(todo) { this.store.todos.splice(this.store.todos.indexOf(todo), 1); } } }; </script> <style> #app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; } ul { text-align:left; } li button { margin-left:1em; } </style>