Skip to content

快速上手

安装

bash
pnpm install fluth-vue

示例

下面以一个表单提交页来展示流式编程范式

第一步:创建流

使用 $() 函数创建一个流:

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

// 创建一个带初始值的流
const form$ = $({
  name: "Alice",
  age: 25,
  email: "alice@example.com",
});
</script>

第二步:添加模板渲染

流可以直接在 Vue 模板中使用,注意不要使用 v-model 来绑定流的数据,因为流的响应式数据是 Readonly 的。

vue
<template>
  <div>
    <form>
      <div>
        <label>商品:</label>
        <input :value="form$.item" />
      </div>
      <div>
        <label>数量:</label>
        <input :value="form$.number" />
      </div>
      <div>
        <label>大小:</label>
        <input :value="form$.size" />
      </div>
    </form>
    <button>提交</button>
  </div>
</template>

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

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

第三步:添加表单逻辑

vue
<template>
  <div>
    <form>
      <div>
        <label>商品:</label>
        <input
          :value="form$.item"
          @input="(value) => updateForm(value, 'item')"
        />
      </div>
      <div>
        <label>数量:</label>
        <input
          :value="form$.number"
          @input="(value) => updateForm(value, 'number')"
        />
      </div>
      <div>
        <label>大小:</label>
        <input
          :value="form$.size"
          @input="(value) => updateForm(value, 'size')"
        />
      </div>
    </form>
    <button @click="trigger$.next()">提交</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>