“表单大变身:当ElForm遇上Vue 3,开发效率满级的秘密武器”

在现代Web应用开发中,表单是用户交互不可或缺的一部分,无论是用户注册、登录、还是数据收集,表单都是必不可少的环节。ElementPlus,作为Vue 3的UI组件库,提供了强大的ElForm组件,它不仅简化了表单的创建过程,还提供了丰富的功能和高度的定制性,使得开发者能够轻松构建出既美观又功能强大的表单。

一、ElForm组件概述

ElForm是ElementPlus中用于创建表单的核心组件。它支持双向数据绑定、表单验证、动态表单控件、以及多种类型的输入组件,如ElInput, ElSelect, ElCheckbox, ElRadio等。ElForm组件的核心优势在于其灵活性和强大的API,这使得它能够适应各种复杂的应用场景。

二、基本用法

  1. 创建一个简单的表单 使用ElForm组件,我们可以通过如下代码创建一个简单的表单:
xml 复制代码
<template>
  <ElForm :model="form" status-icon :rules="rules" ref="formRef">
    <ElFormItem label="用户名" prop="username">
      <ElInput v-model="form.username"></ElInput>
    </ElFormItem>
    <ElFormItem label="密码" prop="password">
      <ElInput v-model="form.password" show-password></ElInput>
    </ElFormItem>
    <ElButton type="primary" @click="submitForm">提交</ElButton>
  </ElForm>
</template>

<script setup>
  import { ref } from 'vue';
  import { ElMessage } from 'element-plus';

  const form = ref({
    username: '',
    password: ''
  });

  const rules = ref({
    username: [{ required: true, message: '请输入用户名', trigger: 'blur' }],
    password: [{ required: true, message: '请输入密码', trigger: 'blur' }]
  });

  const formRef = ref(null);

  const submitForm = () => {
    formRef.value.validate(valid => {
      if (valid) {
        ElMessage.success('提交成功!');
      } else {
        console.log('error submit!!');
        return false;
      }
    });
  };
</script>
  1. 双向数据绑定 ElForm中的model属性用于绑定表单的数据模型,v-model指令用于在表单控件和数据模型之间建立双向绑定,使得用户在表单中的输入能够实时反映在数据模型中。
  2. 表单验证
    ElForm提供了内置的表单验证功能,通过rules属性定义验证规则。验证规则可以是复杂的对象结构,支持多种验证类型,如必填、长度、格式等。

三、高级功能

  1. 动态表单控件 ElForm支持动态生成表单项,这对于处理复杂数据结构需要动态增删表单项的场景非常有用。
xml 复制代码
<template>
  <ElForm :model="form" :rules="rules" ref="formRef">
    <ElFormItem v-for="(item, index) in form.items" :key="index" :prop="`items.${index}.name`">
      <ElInput v-model="item.name"></ElInput>
    </ElFormItem>
  </ElForm>
</template>
  1. 嵌套路由与表单 在构建复杂的管理后台或数据录入页面时,ElForm可以与Vue Router结合使用,实现表单数据的动态加载和保存,以及基于路由的表单初始化。(该功能不多加描述)

  2. 国际化与多语言支持 ElForm组件支持多语言,可以轻松地实现表单的国际化,满足不同地区用户的需求。

四、最佳实践

  1. 合理使用ref 使用ref属性来引用ElForm组件实例,这样可以在组件外部调用组件的方法,如validateresetFields等,实现表单的校验和重置。
  2. 优化性能 对于大型表单,可以使用v-ifv-show来控制表单项的显示,避免不必要的DOM渲染,提高应用性能。
  3. 响应式设计 ElForm组件内置了响应式布局,可以根据屏幕大小自动调整表单项的排列,确保在不同设备上都能提供良好的用户体验。

五、项目实例

xml 复制代码
<template>
    <div class="login-bg">
        <div class="login-container">
            <header class="login-header">
                <img class="logo mr10" src="../assets/images/logo.svg" alt="">
                <div class="login-title">后台管理系统</div>
            </header>
            <el-form 
                size="large" 
                :model="param" 
                :rules="rules" 
                ref="login"
            >
                <el-form-item prop="username">
                    <el-input 
                        v-model="param.username" 
                        placeholder="请输入用户名" 
                    />
                </el-form-item>
                <el-form-item prop="password">
                    <el-input 
                        v-model="param.password" 
                        type="password" 
                        placeholder="请输入密码" 
                    />
                </el-form-item>                
                <div class="pwd-tips">
                    <el-checkbox 
                        class="pwd-checkbox" 
                        v-model="checked" 
                        label="记住密码" 
                    />
                    <el-link type="primary">忘记密码</el-link>
                </div>
                <el-button 
                    class="login-btn" 
                    type="primary" 
                    size="large"
                    @click="submitForm(login)"
                >登录</el-button>
                <p class="login-tips">Tips:用户名admin 密码123456</p>
                <p class="login-text">
                    没有账号?<el-link type="primary">立即注册</el-link>
                </p>                
            </el-form>
        </div>
    </div>
</template>

<script setup>
import { ElMessage} from 'element-plus'
import { reactive,ref } from 'vue'
import { useRouter } from 'vue-router'
import { usePermissStore } from '../store/permiss'

const router = useRouter();
const permissStore = usePermissStore();

const login = ref(null) // 绑定form元素
const param = reactive({
    username: '',
    password: ''
})

const rules = {
    username:[
        {
            required: true,
            message: '请输入用户名',
            trigger: 'blur'
        }
    ],
    password:[
        {
            required: true,
            message: '请输入密码',
            trigger: 'blur'
        },
        {
            min: 6,
            message: '密码长度不能小于6位',
            trigger: 'blur'
        }
    ]
}

const checked = ref(false)

const submitForm = (formEl) => {
    console.log(formEl)
    formEl.validate((valid) => {
        if(valid) {
            ElMessage.success('登陆成功');
            localStorage.setItem('ms_name',param.username)
            const keys = permissStore.defaultList[param.username];
            permissStore.handleSet(keys);
            console.log('//////')
            router.push('/')
        }else{
            ElMessage.error('登陆失败');
            console.log('??????')
        }
    })
}
</script>

<style lang="css" scoped>
.login-bg {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 100%;
    height: 100vh;
    background: url(../../assets/img/login-bg.jpg) center/cover no-repeat;
}
.login-header {
    display: flex;
    align-items: center;
    justify-content: center;
    margin-bottom: 40px;
}
.logo {
    width: 35px;
}
.login-title {
    font-size: 22px;
    color: #333;
    font-weight: bold;
}
.login-container {
    width: 450px;
    border-radius: 5px;
    background: #fff;
    padding: 40px 50px 50px;
    box-sizing: border-box;
}
.pwd-tips {
    display: flex;
    justify-content: space-between;
    align-items: center;
    font-size: 14px;
    margin: -10px 0 10px;
    color: #787878;
}
.pwd-checkbox {
    height: auto;
}
.login-btn {
    display: block;
    width: 100%;
}
.login-tips {
    font-size: 12px;
    color: #999;
}
.login-text {
    display: flex;
    align-items: center;
    margin-top: 20px;
    font-size: 14px;
    color: #787878;
}
</style>

这段代码展示了一个基于Vue 3ElementPlus登录表单组件。下面是其中的关键知识点:

  1. 模板结构 :
    • .login-bg.login-container 定义了登录页面的背景和容器样式。
    • <header> 包含了logo和标题。
    • <el-form> 是ElementPlus中的表单组件,用于收集用户输入,并且能够验证这些输入是否符合规则。
  2. 数据绑定 :
    • v-model<el-input><el-checkbox>中使用,用于双向绑定表单字段(如用户名、密码)和checkbox的状态到paramchecked响应式对象上。
  3. 动态绑定 :
    • :model="param" 将表单模型绑定到param对象。
    • :rules="rules" 将验证规则绑定到rules对象。
  4. 事件处理 :
    • @click="submitForm(login)" 在登录按钮上触发提交表单的方法。
  5. 方法与逻辑 :
    • submitForm() 方法用于验证表单数据,如果验证通过则设置本地存储项ms_name,并调用router.push('/')来导航到主页。同时,它还会更新权限状态。
  6. 状态管理 :
    • 使用usePermissStore从Pinia(或Vuex,取决于具体实现)中获取权限状态存储。
    • handleSet() 方法被用来更新用户的权限列表。
  7. 验证规则 :
    • rules 对象定义了对usernamepassword字段的验证规则,包括必填和密码长度限制。
  8. 组件引用 :
    • login 引用了<el-form>组件实例,以便在submitForm()中调用validate()方法进行表单验证。

这个示例涵盖了Vue 3和ElementPlus的基本使用,包括响应式数据绑定、组件引用、表单验证以及路由和状态管理的集成

代码运行成果展示图:

六、总结

ElForm组件是ElementPlus中功能强大且易于使用的表单解决方案。通过学习本文介绍的基本用法和高级功能,开发者可以轻松构建出既美观又功能丰富的表单,满足现代Web应用的各种需求。无论是在构建用户注册表单,还是在设计复杂的管理后台界面,ElForm都能够提供所需的一切,帮助开发者提升开发效率,创建出用户喜爱的应用体验。

相关推荐
Pedantic1 小时前
SwiftUI 手势层级(Gesture Hierarchy)详解
前端
飘尘1 小时前
前端转型全栈(Java后端)的快速上手指引
前端·后端·全栈
一颗烂土豆2 小时前
Meshopt 压缩深度解析,为什么它比 Draco 更快
前端·javascript·webgl
浏览器工程师3 小时前
AI Agent 接浏览器任务,先别让它一路点到底
前端·后端
雨季mo浅忆3 小时前
VSCode自动格式化三要素
前端
爱勇宝3 小时前
深扒 Anthropic 1680 位工程师简历:应届生几乎没机会,AI 公司最缺的不是博士
前端·后端·程序员
kyriewen4 小时前
同事每天催我 Code Review,我写了个脚本让 AI 替我 review PR——现在他反过来催 AI 了
前端·javascript·ai编程
user20585561518136 小时前
Windows 项目安装时报 `node-sass` 错误,如何快速处理
前端
LiaCode6 小时前
Redis 在生产项目的使用
前端·后端