Vue3 TS 验证子组件中的表单,多级表单验证

Vue3 TS 验证子组件中的表单,多级表单验证

1. 使用情形

在某些交互场景下,我们同一个页面会嵌套多个表单,例如表单2为表单1的子组件里的表单,但是我们需要在提交场景下同时验证表单1和表单2。

在这里插入图片描述

2. 子组件script中定义并expose

// 子组件表单验证
const validateForm = async () => {
  try {
    return await basicFormRef.value.validate()
  } catch (error) {
    return false
  }
}

defineExpose({ validateForm })

3. 父组件使用

BasicInfo 为子组件,绑定ref

<BasicInfo ref="basicInfoRef" v-model:createForm="onlineCreateForm.basicInfo" />

通过ref调用子组件expose出的validateForm方法,实现子组件中的表单验证

const basicInfoRef = ref()
const validateBasicInfoForm = async () => {
  const validateBasicInfo = await basicInfoRef.value.validateForm()
  if (validateBasicInfo) {
    // 验证成功后的操作
  } else {
    message.error('下一步操作失败:请先完善当前基本信息必填项!')
  }
}

通过上述方法的组合使用,就可以实现复杂的多表单页面的表单验证

### 在Vue 3和TypeScript项目中实现三级动态路由 在Vue 3与TypeScript环境中构建三级动态路由涉及多个方面,包括但不限于定义路由配置、设置组件以及处理参数传递等问题。下面提供一种基于官方推荐的方式完成此操作的方法。 #### 定义路由模块 首先,在`router/index.ts`文件内创建并导出路由实例: ```typescript import { createRouter, createWebHistory, RouteRecordRaw } from &#39;vue-router&#39; import Home from &#39;../views/Home.vue&#39; const routes: Array<RouteRecordRaw> = [ { path: &#39;/&#39;, name: &#39;Home&#39;, component: Home, children: [ { path: &#39;:category/:subCategory/:itemId&#39;, name: &#39;ItemDetail&#39;, props: true, component: () => import(/* webpackChunkName: "item-detail" */ &#39;../components/ItemDetail.vue&#39;) } ] } ] const router = createRouter({ history: createWebHistory(process.env.BASE_URL), routes }) export default router ``` 上述代码片段展示了如何通过嵌套子路径来形成多级结构,并利用`:paramName`形式指定动态部分[^1]。 #### 创建视图组件 对于每一个级别的路由节点都需要关联相应的视图表单;这里假设已经存在名为`Home.vue`作为顶级页面而`ItemDetail.vue`用于呈现最终的具体条目详情页。 在`ItemDetail.vue`内部可以通过props接收来自父级传递的数据项: ```html <template> <div class="detail"> <h2>{{ item.title }}</h2> <!-- 更多功能逻辑 --> </div> </template> <script lang="ts"> import { defineComponent, PropType } from &#39;vue&#39; interface Item { id: number; title: string; } export default defineComponent({ props: { itemId: { type: String as PropType<string>, required: true }, category: { type: String as PropType<string>, required: true }, subCategory: { type: String as PropType<string>, required: true } }, setup(props) { const fetchItemData = async (id: string): Promise<Item | null> => { try { // 模拟API请求获取数据 return await new Promise((resolve) => setTimeout(() => resolve({ id: parseInt(id), title: `Item ${id}` }), 1000) ) } catch (_) { return null } } let item = ref<Item>({ id: -1, title: &#39;&#39; }) onMounted(async () => { item.value = await fetchItemData(props.itemId) }) watch( () => props.itemId, async (newId) => { if (!newId) return item.value = await fetchItemData(newId) } ) return { item } } }) </script> ``` 这段脚本说明了怎样借助于组合式API中的`setup()`函数配合响应式的属性监听机制去加载对应ID的商品信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值