Logux is a new way to connect client and server. Instead of sending HTTP requests (e.g., AJAX and GraphQL) it synchronizes log of operations between client, server, and other clients.
- Guide, recipes, and API
- Issues and roadmap
- Projects inside Logux ecosystem
This repository contains Vuex compatible API on top of the Logux Client.
The current version is for Vue 3 and Vuex 4. For Vue 2 support, we have 0.8 version from a separate branch.
npm install @logux/core @logux/client @logux/vuex vuex@nextor
yarn add @logux/core @logux/client @logux/vuex vuex@nextSee documentation for Logux API.
import { CrossTabClient } from '@logux/client'
import { createStoreCreator } from '@logux/vuex'
const client = new CrossTabClient({
  server: process.env.NODE_ENV === 'development'
    ? 'ws://localhost:31337'
    : 'wss://logux.example.com',
  subprotocol: '1.0.0',
  userId: 'anonymous',
  token: ''
})
const createStore = createStoreCreator(client)
const store = createStore({
  state: {},
  mutations: {},
  actions: {},
  modules: {}
})
store.client.start()
export default storeComposable function that subscribes for channels during component initialization and unsubscribes on unmount.
<template>
  <h1 v-if="isSubscribing">Loading</h1>
  <h1 v-else>{{ user.name }}</h1>
</template>
<script>
import { toRefs } from 'vue'
import { useStore, useSubscription } from '@logux/vuex'
export default {
  props: ['userId'],
  setup (props) {
    let store = useStore()
    let { userId } = toRefs(props)
    let channels = computed(() => [`user/${userId.value}`])
    let isSubscribing = useSubscription(channels)
    let user = computed(() => store.state.users[userId.value])
    return {
      user,
      isSubscribing
    }
  }
})
</script>Component-wrapper that subscribes for channels during component initialization and unsubscribes on unmount.
<template>
  <subscribe :channels="channels" v-slot="{ isSubscribing }">
    <h1 v-if="isSubscribing">Loading</h1>
    <h1 v-else>{{ user.name }}</h1>
  </subscribe>
</template>
<script>
import { toRefs, computed } from 'vue'
import { Subscribe, useStore } from '@logux/vuex'
export default {
  components: { Subscribe },
  props: ['userId'],
  setup (props) {
    let store = useStore()
    let { userId } = toRefs(props)
    let user = computed(() => store.state.users[userId.value])
    let channels = computed(() => [`users/${userId.value}`])
    return {
      user,
      channels
    }
  }
}
</script>Place the following code in your project to allow this.$store to be typed correctly:
// shims-vuex.d.ts
import { LoguxVuexStore } from '@logux/vuex'
declare module '@vue/runtime-core' {
  // Declare your own store states.
  interface State {
    count: number
  }
  interface ComponentCustomProperties {
    $store: LoguxVuexStore<State>
  }
}