vue-vben-admin 解析一 vue-types 分析

本文将探讨vue-vben-admin项目中vue-types的使用,通过分析代码和提供示例,展示它如何替代Vue原生类型注解,增强代码的可读性和安全性。
摘要由CSDN通过智能技术生成

vue-vben-admin 目前 vue3 的项目中技术栈包括代码都是顶尖的项目存在。
初学vue3-demo:https://github.com/Miofly/vue3-vite-vuex-demo
预览地址:https://vvbin.cn/next/#/dashboard/analysis

首先先分析下项目中的每一个 utils 的使用

propTypes.ts 的使用,对应官网 https://dwightjack.github.io/vue-types/#usage-example
这个文件主要是干什么的呢,他是一个替代 vue 原生 props 传值写法的一个库

源码分析如下

/**
 * @description: 在 TypeScript 项目中使用时,通过 .extend() 添加的验证器可能无法通过类型检查。
 *
 * 要向 TypeScript 说明您的自定义验证器,您可以使用以下模式:
 * 1. 首先创建一个模块来承载扩展的 VueTypes 对象:
 *  	VueTypesInterface: VueTypes 类定义的接口
 *  	VueTypeValidableDef: validation 对象所需的接口(interface)
 *
 * @date 2021/9/26 11:09
 * @example
 */
import { CSSProperties, VNodeChild } from 'vue';
import { createTypes, VueTypeValidableDef, VueTypesInterface } from 'vue-types';
export type VueNode = VNodeChild | JSX.Element;
/** 定义您的自定义 VueTypes 验证器接口 */
type PropTypes = VueTypesInterface & {
  /** 如果新类型将支持 `validate` 方法,使用 VueTypeValidableDef。 */
  readonly style: VueTypeValidableDef<CSSProperties>;
  readonly VNodeChild: VueTypeValidableDef<VueNode>;
  // readonly trueBool: VueTypeValidableDef<boolean>;
};
/**
 *  createTypes 它返回一个新的命名空间对象。
 *  PropTypes 类型作为类型参数传递给 propTypes 变量
 */
const propTypes = createTypes({
  func: undefined,
  bool: undefined,
  string: undefined,
  number: undefined,
  object: undefined,
  integer: undefined,
}) as PropTypes;
/**
 * @description: 可以通过 VueTypes.extend({...}) 扩展命名空间的 VueTypes 对象,如果要传递多个验证参数,将参数定义数组作为传递
 * @date 2021/9/26 10:59
 * @example
 * @param name: 必须传入.自定义类型的名称,将会暴露在 VueType.{name} 上
 * @param validate:	默认 false, 如果为 true 需要提供一个验证方法
 * @param getter:	默认 false,	如果为 ture 将被定义为访问器属性 (例如, VueTypes.string). 如果为 false,将被定义为一个方法 (例如 VueTypes.arrayOf()).
 */
propTypes.extend([
  {
    name: 'style',
    getter: true,
    type: [String, Object],
    default: undefined,
  },
  {
    name: 'VNodeChild',
    getter: true,
    type: undefined,
  },
]);

export { propTypes };

如何使用示例代码如下:

<template>
	<p>mioString:{{ mioString }}</p>
	<p>mioNumber:{{ mioNumber }}</p>
	<p>mioArray:{{ mioArray }}</p>
	<p>mioBoolean:{{ mioBoolean }}</p>
	<p>miotest:{{ miotest }}</p>
	<p>mioObject:{{ mioObject }}</p>
	<p>mioFunction:{{ mioFunction }}</p>
	<p>mioMix:{{ mioMix }}</p>
</template>

<script lang="ts">
import { defineComponent, PropType } from 'vue';
import { propTypes } from '@/utils/propTypes';

export default defineComponent({
	name: 'Child',

	props: {
		mioString: propTypes.string.def('600px'),
		mioBool: propTypes.bool.isRequired,
		mioNumber: propTypes.number,
		mioInteger: propTypes.integer,
		mioObject: propTypes.object,
		mioArray: propTypes.array,
		mioFunction: propTypes.func,
	},

	setup (props, { attrs, emit, slots }) {
		console.log('props:', props);
		console.log('props.mioString:', props.mioString);
	},

});
</script>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wflynn

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

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

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

打赏作者

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

抵扣说明:

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

余额充值