vue3-ElementPlus-ts之表单运用(含表格规则校验)

1、html部分

<template>
 <div>
  <el-form ref="formRef" label-width="100px" :model="state.dialogForm" :rules="rules">
     <el-form-item prop="oldPassword" label="旧密码">
        <el-input v-model="state.dialogForm.oldPassword" size="large" type="password" clearable />
     </el-form-item>
     <el-form-item prop="password" label="新密码">
       <el-input v-model="state.dialogForm.password" size="large" type="password" clearable />
     </el-form-item>
     <el-form-item prop="checkPassword" label="确认密码">
        <el-input v-model="state.dialogForm.checkPassword" size="large" type="password" clearable />
      </el-form-item>
      <el-form-item>
        <div>密码为6-18字母和数字组合</div>
      </el-form-item>
	</el-form>
	 <el-form-item>
		<el-button @click="close(formRef)">取消</el-button>
		<el-button type="primary" :loading="loading" @click="onSubmit(formRef)">确认</el-button>
	</el-form-item>
</div>
</template>

2、ts部分

<script setup lang="ts">
import { reactive, ref, onMounted } from 'vue'
import type { FormInstance, FormRules } from 'element-plus'
const formRef = ref<FormInstance>(); // form表单dom
// 检验确认密码框
const validateCheckPassword = (rule, value, callback) => {
  if (value === "") {
    callback(new Error("确认密码不能为空"));
  } else if (state.dialogForm.password !== value && state.dialogForm.password !== '') {
    callback(new Error("两次密码不一致!"));
  } else {
    callback();
  }
}
// 检验新密码框
const validatePassword = (rule, value, callback) => {
  var pwdRegex = new RegExp(/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,18}$/);
  if (value === "") {
    callback(new Error("新密码不能为空"));
  } else if (!pwdRegex.test(value)) {
    callback(new Error("密码必须为6-18位字母和数字组合"));
  } else if (state.dialogForm.oldPassword === value && state.dialogForm.oldPassword !== '') {
    callback(new Error("新密码不能与旧密码相同"));
  }else {
    callback();
  }
}
const rules = reactive<FormRules>({
  oldPassword: [
    { required: true, message: '旧密码不能为空', trigger: 'blur' },
  ],
  password: [
    { required: true, validator: validatePassword, trigger: 'blur' },
  ],
  checkPassword:  [
    { required: true, validator: validateCheckPassword, trigger: 'blur' },
  ],
})
const state = reactive({
  dialogForm: { // 忘记密码表单
    oldPassword: '', // 旧密码
    password: '', // 新密码
    checkPassword: '' // 确认密码
  },
});
onMounted(() => {
})

/** 取消按钮 */
const close = (formEl: FormInstance | undefined) => {
  if (!formEl) return
  formEl.resetFields() // 清除校验
}
/** 确认按钮 */
const onSubmit = async (formEl: FormInstance | undefined) => {
  loading.value = true;
  if (!formEl) return
  await formEl.validate((valid, fields) => {
    if (valid) {
       state.dialogVisible = false // 关闭弹窗  
    } else {
      return fields;
    }
  })
}
</script>
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Vue 3和TypeScript中,可以通过表单来修改多条数据。下面是一个示例,展示如何使用表单同时修改多条数据: 首先,在Vue组件中定义一个数据对象,用来保存多条数据的表单值: ```vue <template> <form @submit="handleSubmit"> <div v-for="item in items" :key="item.id"> <input v-model="formValues[item.id].name" type="text" /> <input v-model="formValues[item.id].age" type="number" /> </div> <button type="submit">保存</button> </form> </template> <script setup lang="ts"> import { reactive, ref } from 'vue'; interface Item { id: number; name: string; age: number; } const items: Item[] = [ { id: 1, name: 'John', age: 25 }, { id: 2, name: 'Jane', age: 30 }, // ... ]; const formValues = reactive<{ [key: number]: Item }>({}); items.forEach((item) => { formValues[item.id] = { ...item }; }); function handleSubmit() { // 处理表单提交逻辑 // 可以在这里将修改后的数据发送给后端进行保存 console.log(Object.values(formValues)); } </script> ``` 在上述代码中,我们使用了Vue的Composition API来定义响应式的数据对象。`formValues`对象用于保存多条数据的表单值,以每个数据项的id作为键。 在模板中使用`v-for`指令遍历`items`数组,并使用`v-model`指令绑定输入框的值到`formValues`对象上。这样,当用户输入内容时,`formValues`中对应数据项的值会自动更新。 在提交表单时,可以通过`Object.values(formValues)`获取到修改后的数据数组,并进行进一步的处理,例如将数据发送给后端进行保存。 请注意,上述代码使用了Vue 3的新特性 `<script setup>`,可以更简洁地编写组件逻辑。如果你选择使用Options API,可以将相关逻辑放在`data`、`methods`等选项中。 这只是一个简单的示例,你可以根据实际业务需求进行修改和扩展,例如添加校验、数据同步等逻辑。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值