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});
vue3使用composables来取代mixins 来状态复用的更多相关文章
- 简简单单的Vue3(插件开发,路由系统,状态管理)
既然选择了远方,便只顾风雨兼程 __ HANS许 系列:零基础搭建前后端分离项目 系列:零基础搭建前后端分离项目 插件 路由(vue-router) 状态管理模式(Vuex) 那在上篇文章,我们讲了, ...
- 尝试Vue3.0
Composition API 纯函数式 <!DOCTYPE html> <html lang="en"> <head> <meta ch ...
- 一文解析Pinia和Vuex,带你全面理解这两个Vue状态管理模式
Pinia和Vuex一样都是是vue的全局状态管理器.其实Pinia就是Vuex5,只不过为了尊重原作者的贡献就沿用了这个看起来很甜的名字Pinia. 本文将通过Vue3的形式对两者的不同实现方式进行 ...
- jvm高级特性(6)(线程的种类,调度,状态,安全程度,实现安全的方法,同步种类,锁优化,锁种类)
JVM高级特性与实践(十三):线程实现 与 Java线程调度 JVM高级特性与实践(十四):线程安全 与 锁优化 一. 线程的实现 线程其实是比进程更轻量级的调度执行单位. 线程的引入,可以把一个检查 ...
- 在小程序中实现 Mixins 方案
摘要: 小程序开发技巧 作者:jrainlau 原文:在小程序中实现 Mixins 方案 Fundebug经授权转载,版权归原作者所有. 在原生开发小程序的过程中,发现有多个页面都使用了几乎完全一样的 ...
- 线程基础知识 04 synchronized锁的四种状态和升级
转https://www.cnblogs.com/mingyueyy/p/13054296.html 1 轻量级锁和重量级锁简要说明 线程调度本来是由操作系统来管理的.现在,操作系统上跑了一个虚拟机J ...
- react创建组件的几种方式及其区别
react创建组件有如下几种方式 ①.函数式定义的无状态组件 ②.es5原生方式React.createClass定义的组件 ③.es6形式的extends React.Component定义的组 ...
- [Full-stack] 快速上手开发 - React
故事背景 [1] 博客笔记结合<React快速上手开发>再次系统地.全面地走一遍. [2] React JS Tutorials:包含了JS --> React --> Red ...
- React创建组件的三种方式及其区别
内容转载于http://www.cnblogs.com/wonyun/p/5930333.html React推出后,出于不同的原因先后出现三种定义react组件的方式,殊途同归; 具体的三种方式: ...
- 301-React Ext-React创建组件的三种方式及其区别
一.概述 React推出后,出于不同的原因先后出现三种定义react组件的方式,殊途同归:具体的三种方式: 函数式定义的无状态组件 es5原生方式React.createClass定义的组件 es6形 ...
随机推荐
- Windows IntelliJ IDEA 快捷键终极大全
自动代码 常用的有fori/sout/psvm+Tab即可生成循环.System.out.main方法等boilerplate样板代码 . 例如要输入for(User user : users)只需输 ...
- java程序乱码问题
1.字符编码简介 字符编码从字面上理解,就是将字符编码为由多个bits(0或1)组成的字节序列.但字符和字节序列的映射并不是直接的,可简要概括为2个步骤,第1步由字符映射到unicode码,第2步由u ...
- 从 MySQL 获取数据,是从磁盘读取的吗?(buffer pool)
从 MySQL 获取数据,是从磁盘读取的吗?(Buffer Pool) 在 MySQL 中,数据是否从磁盘读取取决于数据是否已经被加载到内存中.MySQL 使用 InnoDB 存储引擎 中的 Buff ...
- STM32真的是很落后吗?
STM32真的是很落后吗? 作为一名嵌入式开发老兵,我不止一次听到有人说"STM32已经过时了",尤其是那些刚入门或者看了几篇文章的新手.每当听到这样的言论,我都忍不住想笑,但又有 ...
- 🚀 放弃 Oh-My-Posh,转而手搓 FastPrompt,打造快速高效的命令提示
「够用.够快.够自由」才是我心目中的终端提示符. 一个开发者的烦恼 每天打开 PowerShell,等待提示符加载完毕,我的内心就像在等待一个磨蹭的同事. 我用的是 Windows Terminal ...
- 移动开发webapp开发常用meta设置手机浏览器全屏模式,webappmeta
1.WebApp全屏模式: <meta name="viewport" content="width=device-width,initial-scale=1.0, ...
- php高级工程师面试题
转载于:王召波 博客 PHP对象的克隆与引用有什么区别? 摘要: 是这样的,这个问题确切说应该是这样的:" PHP对象的赋值和克隆有什么区别 ",注意不是复制,就是复制,打开窗子说 ...
- 【记录】手机QQ和电脑QQ里的emoji种类有什么差异?
版本 手机 QQ:V 8.9.76.12115 电脑 QQ:QQ9.7.15(29157) 偶然发现,有一种emoji手机上怎么找都找不到,一开始以为自己失忆了,后来发现这种emoji只在电脑上有. ...
- 将数据导出 Excel 并异步发送到指定邮箱:一次性能优化实战
使用 Spring Boot 实现 Excel 导出 + 邮件异步发送功能,解决接口阻塞问题 一.背景介绍最近我在开发一个跑团管理系统的数据导出功能,需求是将用户查询的成员信息.跑量统计等数据导出为 ...
- .NET+AI | eShopSupport 知多少
eShopSupport 项目深度解析 eShopSupport 项目的整体架构示意图.左侧为离线运行的工具(DataGenerator.DataIngestor.Evaluator)用于数据准备和评 ...