深入vue3学习(7)+ts 封装useForm+封装useTable

nexttick

官方的解释就是:
将回调推迟到下一个DOM更新周期之后执行,在更改了一些数据后等待dom更新后立即使用。
比如有个需求,点击按钮后修改h2的message, 在修改h2后要获取其高度。
一般有三种做法:
1 点击按钮后立即获取到h2的高度(X)
2 在updated获取 (其他数据更改也会影响)
3 在nexttick中获取。
在这里插入图片描述

nextTick只有在这个方法里面用才有效。别的state更新的时候不会触发这个函数。只有changeMessage执行了nextTick才会执行。
nextTick的作用是将回调函数加到微任务的队尾上。
vue里面需要做很多任务调度的处理,比如watch,更新dom,生命周期的回调这些,vue里面也有很多任务队列。而nextTick则加入到微任务的队尾上作为最后一个任务,当dom更新完后再去取出来执行。同步的代码也永远不会拿到最新的dom值,因为此时dom还没执行呢。

ts

unkonw与any

unkonw只能赋值给any和unknow类型,而any类型可以赋值给任意类型。
如果一个值未知,最好不要使用any,不然拿去乱用也不会报错,而unknow类型如果拿去赋值给其他类型则会报错。为的就似乎防止乱用

never

表示永远不会发生的值。那么永远不会发生,这个值有啥用呢?
尤大大举了一个例子
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上面例子讲了当你写了一些逻辑代码依赖于这个type All的时候,当你的同时改动了里面的值,而没有修改handValue的逻辑的时候,never就登场了,他会直接报错提醒你的同事,要修改All也要修改handValue的逻辑。如果最后没加never,这个代码就通过了,从而造成错误。

联合类型

联合成员,表明可以是联合类型中的一个,
比如在这里插入图片描述

可以是Number或者string
在这里插入图片描述
而这种情况只能是其中一个比如,
在这里插入图片描述
在这里插入图片描述
也可以
在这里插入图片描述
也就说,联合类型范围可以往大了扩,但不能往小扩。可以满足AB,但不能一个都不满足。

函数重载

函数的名称相同,但是参数不同的几个函数,就是函数的重载
比如
在其他语言中
在这里插入图片描述
会根据具体入参个数调用对应的函数,但是ts不一样

必须写成如下模样在这里插入图片描述
在这里插入图片描述
这个add就是调用第一个,、
在这里插入图片描述
这个就会找到第二个函数声明。调用第二个add。

interface 与 type

如果是定义非对象类型,建议type
interface 可以重复的对某个接口定义属性和方法
type定义的是别名,别名是不可以重复的
在这里插入图片描述
小技巧
在这里插入图片描述
多了个d,因为ts会有一个freshness的操作,擦除。

类型的查找

ts的类型推断查找
1 内置类型声明(安装ts的时候顺便自带的.d.ts文件。比如内置对象,dom api等等)
2 外部定义类型声明(一些包,比如@types/axios这些)
3 自己定义类型声明 (自定定义的.d.ts文件)

封装useForm

封装element-plus的form表单实现传入一个配置对象生成一个表单的组件,简单逻辑交互的可以用,复杂逻辑交互的建议还是自己写,不然配置文件也会很复杂。
先看思路,传入一个配置文件,支持四种类型,input password select datepicker 四种组件。
首先定义接口
在这里插入图片描述
在这里插入图片描述
接口定义完毕

在这里插入图片描述
在这里插入图片描述
再到具体的某个实现,配置对象就配置好了,然后我们直接
在这里插入图片描述
v-bind绑定这个对象,内部就会帮助我们解构传进去,如react的<A {…props}>一样方便
在这里插入图片描述
然后根据该foremItems遍历
在这里插入图片描述
这就是我们将各个组建的options分开的原因,可以直接V-bind很方便。然后每个属性都需要传入一个naem用来做v-model使用。
在这里插入图片描述

这样我们的useForm就完成一大半了。

插槽的使用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

接着需要完成v-model,双向数据绑定,切记,不可在外部直接扔进来一个reactive对象,然后在内部直接v-model,这样会破坏数据单一流动性。

所以我们可以通过外部传入一个对象。然后通过ref生成一个拷贝的对象,接着在深度监听该对象,一改变就传去外部组件。

react的话的antd库的form表单有一个onValueChange,一旦值改变则触发,所以可以外部传入一个函数,值改变就回调去修改夫组件的值。
而vue的话数据的修改不会放映在内部,所以我们必须通过watch深度监听,将值emit出去,在外部监听,触发回调,修改值,而Vue的v-model组件刚好帮助我们实现这点如。
在这里插入图片描述
在这里插入图片描述
内部
在这里插入图片描述
在这里插入图片描述
关键是
在这里插入图片描述
watch触发回调,组建的v-model就是这么使用的,不了解的可以先看下官网。
我们坚挺的是对象,所以需要深度监听。
完成:
在这里插入图片描述

封装useTable

跟封装useForm一样,useTable也是可以封装的,因为其代码较多且相似,故可以封装起来,但如果逻辑较为复杂的table建议也是自己写会好点。否则配置文件也会很大。

思路

传入配置文件,根据配置文件动态生成表头,然后定义插槽,让外部可以控制展示的内容。

1 接口定义

在这里插入图片描述
这些接口并非写死,完全可以根据需要从element-plus的文档加。
然后看组件定义
在这里插入图片描述
传入该传入的值。
接着
在这里插入图片描述
先不看插槽,我们先把该绑定的属性通过v-bind绑定上去。
然后通过template的v-for去遍历column这个数组,vue3的v-for是建议在外面包一层template,而不是直接写在组件上。
然后看配置文件
在这里插入图片描述
我们把整个table和单个colunmn的定义分开来,这样好绑定。
在这里插入图片描述
这就是单个column的配置。
然乎看组件使用
在这里插入图片描述
直接将我们的tableOptios直接v-bind,让内部去解构。很方便。
看效果在这里插入图片描述

基本表结构就已经有了,我们可以根据自己的需要去实现一写需求,比如固定表头,数据剧中这些。如
在这里插入图片描述
可以根据需要去扩展该组件。

插槽的实现

在这里插入图片描述

这些特定的数据展示都是根据插槽来实现的。
在这里插入图片描述
element-plus的表格自带插槽,header控制表头,default控制展示内容。
后面的scope可以拿到该行的数据。
但是这些内容不应该组件写死,而应该在用的组件去完成,所以我们可以定义插槽,让外部的去实现。在这里插入图片描述
注意,此处的插槽不应该是写死的,而是由外部决定的。
因为每一列的表头可能展示的内容是不一样的,写死的话只能展示一种效果,所以我们由配置文件来传,一旦有hSlotName,表明你要自定义表头了。然后通过Slot的row属性将label传出去,因为表头一般不需要获取该行数据。
在这里插入图片描述
在这里插入图片描述
通过name绑定对应的插槽,然后拿到传出来的label。效果如图:
在这里插入图片描述
表头修改成功。
再看表格的插槽一样的道理,
在这里插入图片描述
默认值就是直接展示改行对应的props属性的数据。使用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到是以我们想要的效果渲染了,usetable就差不多完成了。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
你可以尝试以下步骤来封装一个Vue 3和TypeScript下使用Element Plus的表单提交组件: 1. 安装必要的依赖: - Vue 3:`npm install vue@next` - TypeScript:`npm install -D typescript` - Element Plus:`npm install element-plus` 2. 创建一个新的Vue组件,并为其选择一个合适的名称,例如`FormSubmit.vue`。 3. 在`FormSubmit.vue`文件中,导入必要的模块和样式: ```vue <template> <!-- 表单内容 --> </template> <script lang="ts"> import { defineComponent } from 'vue'; import { ElButton, ElForm, ElFormItem } from 'element-plus'; export default defineComponent({ components: { ElButton, ElForm, ElFormItem, }, }); </script> <style scoped> /* Element Plus 样式 */ @import 'element-plus/packages/theme-chalk/src/index.scss'; /* 自定义样式 */ /* ... */ </style> ``` 4. 在模板中编写表单内容,并使用Element Plus的组件来构建表单: ```vue <template> <el-form ref="form" :model="formData" label-width="120px"> <el-form-item label="姓名" prop="name"> <el-input v-model="formData.name"></el-input> </el-form-item> <!-- 更多表单项 --> <el-form-item> <el-button type="primary" @click="submitForm">提交</el-button> </el-form-item> </el-form> </template> <script lang="ts"> // ... export default defineComponent({ // ... data() { return { formData: { name: '', // 更多表单字段 } }; }, methods: { submitForm() { // 表单提交逻辑 if (this.$refs.form.validate()) { // 表单验证通过,执行提交操作 // ... } } } }); </script> ``` 这样,你就可以使用封装好的表单提交组件来方便地处理表单提交了。你可以根据实际需求添加更多的表单项,并在`submitForm`方法中实现你的提交逻辑。希望这可以帮到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coderlin_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值