Skip to content

Quick Start

Installation

bash
pnpm install fluth-vue

Example

Below is a form submission page to demonstrate the streaming programming paradigm

Step 1: Create Stream

Use the $() function to create a stream:

vue
<script setup>
import { $ } from "fluth-vue";

// Create a stream with initial value
const form$ = $({
  item: "apple",
  number: 1,
  size: "large",
});
</script>

Step 2: Add Template Rendering

Streams can be used directly in Vue templates. Note that you should not use v-model to bind streams, because the reactive data of the stream is Readonly.

vue
<template>
  <div>
    <form>
      <div>
        <label>Product:</label>
        <input
          :value="form$.item"
          @input="(value) => updateForm(value, 'item')"
        />
      </div>
      <div>
        <label>Quantity:</label>
        <input
          :value="form$.number"
          @input="(value) => updateForm(value, 'number')"
        />
      </div>
      <div>
        <label>Size:</label>
        <input
          :value="form$.size"
          @input="(value) => updateForm(value, 'size')"
        />
      </div>
    </form>
    <button>Submit</button>
  </div>
</template>

<script setup>
import { $ } from "fluth-vue";

const form$ = $({
  item: "apple",
  number: 1,
  size: "large",
});

const updateForm = (value, key) => {
  form$.set((v) => (v[key] = value));
};
</script>

Step 3: Add Form Logic

vue
<template>
  <div>
    <form>
      <div>
        <label>Product:</label>
        <input
          :value="form$.item"
          @input="(value) => updateForm(value, 'item')"
        />
      </div>
      <div>
        <label>Quantity:</label>
        <input
          :value="form$.number"
          @input="(value) => updateForm(value, 'number')"
        />
      </div>
      <div>
        <label>Size:</label>
        <input
          :value="form$.size"
          @input="(value) => updateForm(value, 'size')"
        />
      </div>
    </form>
    <button @click="trigger$.next()">Submit</button>
  </div>
</template>

<script setup>
import { $, audit, debounce, useFetch, filter } from "fluth-vue";

const useFetchAddOrder =  (payload$) => {
  const { promise$ } =  useFetch({
    url: "https://api.example.com/addOrder",
    { immediate: false, refetch: true },
  }).post(payload$).json();
  return promise$;
};

const form$ = $({
  item: "apple",
  number: 1,
  size: "large",
});

const updateForm = (value, key) => {
  form$.set((v) => (v[key] = value));
};

const trigger$ = $();
const submit$ = form$.pipe(audit(trigger$.pipe(debounce(300))));
const validate$ = submit$.then((value) => validateForm(value));
const payload$ = validate$
  .pipe(filter((value) => !!value))
  .then((value) => ({ ...value, user: 'fluth', address: "No. 88, XX Road, Chaoyang District, Beijing" }));
const addOrder$ = useFetchAddOrder(payload$)
</script>