vue3使用composables来取代mixins 来状态复用

前言

最简单理解composables的方式 就是将其视为vue版的自定义hooks

来个demo

比如 页面初始化的时候 我需要请求接口 获取数据 并回填至表单

以前的做法

src/pages/index.vue

<script setup lang="ts">
import { ref, onBeforeMount } from "vue";
import { FormInit } from "./types";
import api from "../../service";

onBeforeMount(() => {
  syncForm();
});

// 表单字段
const form = ref<FormInit>({name:'张三',phone:18211223344});

// 获取基本信息 初始化的时候 回显表单信息
const synctForm = async () => {
  const { data } = await api.getFormDate();
  form.value = data.data;
};

// 提交
const onSubmit = async (values: any) => {
  console.log(values);
};
</script>

<template>
  <van-nav-bar title="表单收集" />
  <van-form @submit="onSubmit">
    <van-cell-group inset>
      <van-field
        v-model="form.name"
        name="name"
        label="姓名"
        :required="true"
      />
      <van-field
        v-model="form.phone"
        type="number"
        name="phone"
        label="手机号"
        :required="true"
      />
    </van-cell-group>
    <div>
      <van-button round block type="primary" native-type="submit">
        提交
      </van-button>
    </div>
  </van-form>
</template>

现在的做法

src/composables/index.ts
(可以看得出 它就像一个没有模板的vue组件)

import axios from "axios";
import { ref, onBeforeMount } from "vue";
import api from "../service";

// 初始化时回显表单信息
export const useForm = <T>(formInit: T) => {
  onBeforeMount(() => {
    syncForm();
  });
  const form = ref<T>(formInit);
  const syncForm = async () => {
    const { data } = await api.getFormDate();
    form.value = { ...formInit, ...data.data };
  };
  return { form , syncForm };
};

src/pages/index.vue

<script setup lang="ts">
import { useForm } from "../../composables";
import { FormInit } from "./types";

// 表单字段
const { form } = useForm <FormInit>({name:'张三',phone:18211223344});

// 提交
const onSubmit = async (values: any) => {
  console.log(values);
};
</script>

<template>
  <van-nav-bar title="表单收集" />
  <van-form @submit="onSubmit">
    <van-cell-group inset>
      <van-field
        v-model="form.name"
        name="name"
        label="姓名"
        :required="true"
      />
      <van-field
        v-model="form.phone"
        type="number"
        name="phone"
        label="手机号"
        :required="true"
      />
    </van-cell-group>
    <div>
      <van-button round block type="primary" native-type="submit">
        提交
      </van-button>
    </div>
  </van-form>
</template>

核心部分

核心变化是:将状态的定义和赋值 抽离出去了

之前的index.vue

onBeforeMount(() => {
  syncForm();
});

// 表单字段
const form = ref<FormInit>({name:'张三',phone:18211223344});

// 获取基本信息 初始化的时候 回显表单信息
const synctForm = async () => {
  const { data } = await api.getFormDate();
  form.value = data.data;
};

现在的index.vue

// 表单字段
const { form } = useForm <FormInit>({name:'张三',phone:18211223344});
posted @   丁少华  阅读(894)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示