随着Vue3和TypeScript的大浪潮不断袭来,越来越多的Vue项目采用了TypeScript的语法来编写代码,而Vue3的JS中的Setup语法糖也越来越广泛的使用,给我们这些以前用弱类型的JS语法编写Vue代码的人不少冲击,不过随着大量的学习和代码编写,经历过一段难熬的时间后,逐步适应了这种和之前差别不小的写法和冲击。本篇随笔介绍总结了Vue3中一些常见的基于TypeScript的Setup语法与组合式 API的处理代码案例。
TypeScript(简称ts)是微软推出的静态类型的语言,相比于js,TypeScript拥有强类型、编译器严谨的语法检查、更加严苛的语法,TypeScript 是 JS类型的超集,并支持了泛型、类型、命名空间、枚举等特性,弥补了 JS 在大型应用开发中的不足。TypeScript 是 JavaScript 的强类型版本,最终在浏览器中运行的仍然是 JavaScript,所以 TypeScript 并不依赖于浏览器的支持,也并不会带来兼容性问题。
基于TypeScript的Setup语法糖写法越来越多,熟练使用的话,需要一个学习过程,另外ElementPlus控件也有了一些不同的变化,而且它的官方案例代码基本上采用了Setup语法糖的写法来提供例子代码。
我们也可以将 prop 的类型移入一个单独的接口中:
有时候,我们还需要给指定的prop属性给定默认值,那么也可以通过函数withDefaults一起进行处理即可。
如下面是我们指定模块定义的prop接口信息和defineProps的处理代码。
7、Watch函数的使用
有时候,子组件需要监控自身某个值的变化,然后进行相关的处理,那么对值进行监控就需要用到了watch函数。
// 监听外部对props属性变更,如通过ResetFields()方法重置值的时候
watch(
() => props.modelValue,
newValue => {
console.log(newValue);
emit("update:modelValue", newValue + "");
}
);
watch(
() => props.options,
newValue => {
newValue.forEach(item => {
dictItems.value.push(item);
});
}
);
8、onMounted函数的使用
我们一般在 onMounted 的逻辑里面准备好组件或者页面显示的内容,这里面在页面组件准备妥当后进行更新显示。
//页面初始化加载
onMounted(() => {
getlist();
});
或者组件里面
//挂载的时候初始化数据
onMounted(async () => {
var typeName = props.typeName;
var options = props.options;
if (typeName && typeName !== "") {
// 使用字典类型,从服务器请求数据
await dictdata.GetTreeItemByDictType(typeName).then(list => {
if (list) {
list.forEach(item => {
dictItems.value.push({ id: item.id, label: item.label });
});
}
});
} else if (options && options.length > 0) {
// 使用固定字典列表
options.map(item => {
dictItems.value.push({ id: item.id, label: item.label });
});
}
// 设置默认值
keyword.value = props.modelValue;
});
9、自定义组件的ModelValue
一般组件在绑定值的时候,一般使用v-Model的属性来设置它的值。
v-model="editForm.name" />
或者日期组件
v-model="editForm.birthDate" align="right" type="date" placeholder="选择日期" format="YYYY-MM-DD" />
因此我们自定义开发的组件,也应该采用这样约定的属性。这里面的v-Model对应的prop属性就是modelValue的,因此我们需要定义这个属性,并处理Emits事件就可以了。
//声明Props的接口类型
interface Props {
modelvalue?: string | number; // 接受外部v-model传入的值
}
//使用默认值定义Props
const props = withDefaults(defineProps(), {
modelValue: "" //对应自定义控件的v-model的值
});
然后声明组件的事件,在组件内部合适的地方触发即可。
//声明组件事件
interface Emits {
(e: "update:modelValue", value: string): void;
(e: "change", value: string): void;
}
//定义组件事件
const emit = defineEmits();
并在Watch监控它的变化,触发组件的自定义事件
watch(
() => props.modelValue,
newValue => {
console.log(newValue);
emit("update:modelValue", newValue + "");
}
);
10、自定义引入Vue的API和组件
上面所有的setup语法糖代码里面,我们在开始的时候,往往都需要引入ref,reactive等API,如下代码所示。
