快上车!Vite + Vue 3 + tsx + element plus 实现表单配置(下)

3,077 阅读1分钟

「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

接着上篇文章「 快上车!Vite + Vue 3 + tsx + element plus 实现表单配置(上)」继续写,上篇文章实现了使用jsxTypescript在编辑器里有语法提示

接下里我选用的是element plus这个UI库来搭建管理后台,然后示例怎样搭建表单

引用element plus库

首先安装element plus

npm install element-plus --save

然后在入口文件引入element plus库,我是选择了全局引用的方式,当然你也可以在各组件里按需引入

import { createApp } from 'vue';
// 引入 element plus
import ElementPlus from 'element-plus';
// 引入 element plus 的样式
import 'element-plus/dist/index.css';
import App from './App.vue';

const app = createApp(App);

// 挂在到 Vue 实例上
app.use(ElementPlus);
app.mount('#app');

表单配置的实践

这里我是使用了<script setup>的语法糖以及tsx的写法,发现没有一篇具体的文章是介绍如何实现,很多都是SFC单组件文件的写法,至于为什么选用tsx,上篇已经介绍了,这里就不重复累述了

element plus库的官方demo都是使用SFC的写法,刚刚开始的转成tsx写法的时候觉得很是无从下手,但是添加了@vitejs/plugin-vue-jsx插件后,还是很容易把SFC语法去改成JSX

大概我们要实现这么一个简单的表单,可以输入名称和年龄两个字段,以及对他们进行校验

效果图

image.png

完整的代码文件

// form.tsx
import { defineComponent, reactive } from 'vue'
type Info = {
    name: string;
    age: number;
}
const Index = defineComponent({
    setup() {
        const state = reactive({
            form: {
                name: '',
                age: 0
            } as Info
        })
        
        const rule = {
            name: [
                {
                  required: true,
                  message: '请输入名称',
                  trigger: 'blur',
                },
            ],
            age: [
                {
                  required: true,
                  message: '请输入年龄',
                  trigger: 'blur',
                },
            ]
        }
           
        // jsx的写法
        return () => (
            <el-form model={state.form} rules={rule} label-width="120px" class="ruleForm" size="medium">
              <el-form-item label="名称" prop="name">
                <el-input v-model={state.form.name} maxlength="10"></el-input>
              </el-form-item>
              <el-form-item label="年龄" prop="age">
                <el-input v-model={state.form.age} maxlength="10"></el-input>
              </el-form-item>
            </el-form>
        )
    }
})

注意事项

声明表单的值要注意初始化,不然会失去响应性

例如刚刚开始声明state时是这样子的,没有初始化form对象里的值,那么后续输入input的值时,form对象里面的值是监听不了的,已经失去了响应性

// 错误的
const state = reactive({
    form: {} as Info
})

正确的应该声明好form里面的值

// 正确的
const state = reactive({
    form: {
        name: '',
        age: 0
    } as Info
})

校验表单失效的坑

form里绑定的值没对

这是一个粗心大意的bug,以为form里传值也是v-model,没仔细看是model,这个问题定位了大半天,还是得仔细看文档

// 错误的
<el-form v-model={state.form} rules={rule} label-width="120px" class="ruleForm" size="medium">
</el-form>
// 正确的
<el-form model={state.form} rules={rule} label-width="120px" class="ruleForm" size="medium">
</el-form>

如果写错了你就会喜提以下这个报错

image.png

ElementPlusError: [Form] model is required for validate to work! 没错,他就是提示要传model这个props

el-form-item 缺少 prop

如果缺少prop,会导致校验规则没生效

// 正确的,需要有 prop
<el-form-item label="名称" prop="name">xx</el-form-item>
还有一个额外的小提示

如果是SFC写法要注意返回值不要失去响应性,因此返回需要调用toRefs方法,以免解构的时候对象失去响应性

<template>
    {{form.name}}
</template>
<script lang='ts'>
    import { reactive, toRefs } from 'vue'
    export default {
        setup() {
            const state = reactive({
                form: {
                    name: '',
                    age: 0
                }
            })
            
            return {
                ...toRefs(state)
            }
           
        }
    }
</script>

结语

以上是我使用Vite + Vue 3 + tsx + element plus实现表单配置的实践,希望能对大家有帮助~如果能获得一个大大的赞❤作为鼓励会十分感激😄!!大家也可以多在评论区交流讨论哦,谢谢啦~

更多文章推荐:

「超详细!监听微信小程序五种切后台情况」

「HTTP响应头之内容安全策略(CSP)为你的网站保驾护航」

「三分钟学会使用requestAnimationFrame实现倒计时」