前言

最简单理解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});

vue3使用composables来取代mixins 来状态复用的更多相关文章

  1. 简简单单的Vue3(插件开发,路由系统,状态管理)

    既然选择了远方,便只顾风雨兼程 __ HANS许 系列:零基础搭建前后端分离项目 系列:零基础搭建前后端分离项目 插件 路由(vue-router) 状态管理模式(Vuex) 那在上篇文章,我们讲了, ...

  2. 尝试Vue3.0

    Composition API 纯函数式 <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  3. 一文解析Pinia和Vuex,带你全面理解这两个Vue状态管理模式

    Pinia和Vuex一样都是是vue的全局状态管理器.其实Pinia就是Vuex5,只不过为了尊重原作者的贡献就沿用了这个看起来很甜的名字Pinia. 本文将通过Vue3的形式对两者的不同实现方式进行 ...

  4. jvm高级特性(6)(线程的种类,调度,状态,安全程度,实现安全的方法,同步种类,锁优化,锁种类)

    JVM高级特性与实践(十三):线程实现 与 Java线程调度 JVM高级特性与实践(十四):线程安全 与 锁优化 一. 线程的实现 线程其实是比进程更轻量级的调度执行单位. 线程的引入,可以把一个检查 ...

  5. 在小程序中实现 Mixins 方案

    摘要: 小程序开发技巧 作者:jrainlau 原文:在小程序中实现 Mixins 方案 Fundebug经授权转载,版权归原作者所有. 在原生开发小程序的过程中,发现有多个页面都使用了几乎完全一样的 ...

  6. 线程基础知识 04 synchronized锁的四种状态和升级

    转https://www.cnblogs.com/mingyueyy/p/13054296.html 1 轻量级锁和重量级锁简要说明 线程调度本来是由操作系统来管理的.现在,操作系统上跑了一个虚拟机J ...

  7. react创建组件的几种方式及其区别

    react创建组件有如下几种方式 ①.函数式定义的无状态组件 ②.es5原生方式React.createClass定义的组件   ③.es6形式的extends React.Component定义的组 ...

  8. [Full-stack] 快速上手开发 - React

    故事背景 [1] 博客笔记结合<React快速上手开发>再次系统地.全面地走一遍. [2] React JS Tutorials:包含了JS --> React --> Red ...

  9. React创建组件的三种方式及其区别

    内容转载于http://www.cnblogs.com/wonyun/p/5930333.html React推出后,出于不同的原因先后出现三种定义react组件的方式,殊途同归; 具体的三种方式: ...

  10. 301-React Ext-React创建组件的三种方式及其区别

    一.概述 React推出后,出于不同的原因先后出现三种定义react组件的方式,殊途同归:具体的三种方式: 函数式定义的无状态组件 es5原生方式React.createClass定义的组件 es6形 ...

随机推荐

  1. 二叉树专题学习(C++版) 基础的上机题

    前言: 由于二叉树这一章的题型比较多,涉及到的递归程序也较多,所以单开一个随笔来记录这个学习过程,希望对读者有帮助. 理论知识基础 在二叉树的选择题中,常常会涉及到对于最多或最少结点.最大或最小高度. ...

  2. 基于XML的方式配置AOP

    第一步:把通知类用 bean 标签配置起来 <bean id="txManager" class="com.atguigu.account.utils.Transa ...

  3. nginx禁止IP访问,仅供域名访问(域名访问限制不严格漏洞)

    域名访问限制不严格漏洞解决 nginx添加相关配置 通过default_server,在http中最前面加上该配置 server { listen 80 default_server; server_ ...

  4. 使用 Go 构建一个最小的 API 应用

    最近有项目要使用 Go 开发,作为一个. NET Core 选手,准备先撸一个包含 CRUD 的最小 MVP 项目练手. 要创建一个 TODO 应用,会创建下面这些接口: API Descriptio ...

  5. 2025dsfz-KMP学习笔记

    KMP 前言:这把高端局 关于KMP 时间复杂度为 \(O(n+m)\) 的优秀字符串查找算法. 适用于在句子/文章中查找一段文字(词语). KMP实现 关于共同前后缀数组(PMT) 说人话就是 \( ...

  6. 2025dsfzB层考试总结

    2025年东师附中B层春季测试1考试总结 Designed By Lwj54joy AT 2025-03-01 本文将遵守GNU GPL2.0开源协议. 概述 总分:\(310/400\) 改题分数: ...

  7. [随记]-linux侦听端口的4种方法

    侦听 192.168.0.1 服务器上的 10086 端口是否打开 1. telnet telnet是windows 内置的功能,当然 linux 也有.用法:  tenlet 192.168.0.1 ...

  8. 信息资源管理文字题之“航空集团从哪些方面改变企业的IT服务”

    一.材料:某航空集团公司拥有一个地域分散.多厂商.多平台.多系统的复杂IT环境.IT系统运行复杂,业务系统故障多,技术人员的被动工作方式难以适应企业IT服务需要. 要求:是运用IT服务管理关联只是为该 ...

  9. HarmonyOS NEXT开发教程:加速web页面访问

    在日常app开发中,访问web页面是很常见的功能,在鸿蒙系统中有多种方案来加速web页面的访问,提升用户体验. 首先,可以在Web组件的onAppear方法中对要加载的页面进行预链接,比如: Web( ...

  10. TVM VLOG打印

    TVM 提供了详细日志记录功能,允许提交跟踪级别的调试消息,而不会影响生产中 TVM 的二进制大小或运行时.你可以在你的代码中使用 VLOG 如下: void Foo(const std::strin ...