首页 > 其他分享 >vue3使用composables来取代mixins 来状态复用

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

时间:2022-12-22 17:59:25浏览次数:43  
标签:vue const form composables mixins formInit vue3 import data

前言

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

来个demo

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

以前的做法

src/pages/index.vue

<script setup lang="ts">
import { ref } from "vue";
import { formInit, FormInit} from "./helper";
import api from "../../service";
import _ from "lodash";

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

// 表单字段
const form = ref<FormInit>(_.cloneDeep(formInit));

// 获取基本信息 初始化的时候 回显表单信息
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";

// 表单字段
const { form } = useForm <FormInit>(_.cloneDeep(formInit));

// 提交
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>(_.cloneDeep(formInit));

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

现在的index.vue

// 表单字段
const { form } = useForm <FormInit>(_.cloneDeep(formInit));

标签:vue,const,form,composables,mixins,formInit,vue3,import,data
From: https://www.cnblogs.com/dingshaohua/p/16999258.html

相关文章

  • VUE3状态管理Pinia使用介绍
    vue3中推荐使用的状态管理工具:pinia,真的很好用官方文档,中文文档一、安装piniayarnaddpinia#或者使用npmnpminstallpinia二、src文件夹下新建store文件夹,并新建......
  • VUE3项目中的Router路由配置
    一、安装路由如果新建项目的时候已经有选择了Router选项就不需要再次安装了npminstallvue-router二、src目录下新增router文件夹,并在文件夹中新建index.ts文件impor......
  • Vue3.0 生命周期
    所有生命周期钩子的this上下文都是绑定至实例的。beforeCreate:在实例初始化之后、进行数据帧听和事件/侦听器的配置之前同步调用。created:实例创建完成,主要包括数据帧听......
  • Vite + Vue3导入 vue-i18n 插件
    使用Vite+Vue3导入vue-i18n插件Step1下载vue-i18n插件npminstallvue-i18nStep2新建local文件夹,创建index.jsindex.jsimport{createI18n}from"v......
  • vue3 + ts 路由换标题
    npminstallvue-wechat-title--save//引入换标题的插件importVueWechatTitlefrom'vue-wechat-title'//使用插件VueWechatTitleapp.use(store).use(router)......
  • vue3 Composition API使用
    Vue3新增了CompositionAPI。我们只需将实现某一功能的相关代码全部放进一个函数中,然后return需要对外暴露的对象。不同功能的代码都是一个个函数,最终在setup()函数中......
  • Vue3 清空Reactive定义的数组
    shallowRef定义得数组清空letcomponent_list=shallowRef([{unit:Head,name:'Head',id:1},{unit:TopClass,name:'TopClass',id:2},])component_lis......
  • 面试官:vue2和vue3的区别有哪些?
    一、Vue3与Vue2区别详述1.生命周期对于生命周期来说,整体上变化不大,只是大部分生命周期钩子名称上+“on”,功能上是类似的。不过有一点需要注意,Vue3在组合式API(Comp......
  • vue3+ts项目中无法识别vue文件
    在vue3+ts的项目中,如果缺少声明文件,会出现类似于下面的报错。只需要在src的根目录下创建一个声明文件:env.d.ts,就可以解决这个报错。代码内容如下:declaremodule"*.......
  • 学习vue3组件事件时,思维发散(溜号)的感悟
    https://cn.vuejs.org/guide/components/events.html#usage-with-v-model 老婆在客厅看,英文、日文影片(或动漫) 我就溜号了,想起英文发音和日文发音(包括中文发音)的差异,......