码迷,mamicode.com
首页 > 其他好文 > 详细

vue3+typescript+element-plus表单验证(非获取实例)

时间:2021-01-15 11:42:05      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:可读性   admin   export   post   button   响应式   mod   click   await   

vue3用composition api 取代了之前的options api,并且加强了支持typescript,另代码可读性和可改性更强了,用习惯了setup函数真的可以说句,真香。

但是不可避免的,需要趟一些雷,比方说element-plus的表单验证功能。由于setup里取消了this获取实例,就突然变得不知所措。以下是我填坑的一些经验。

先看element-plus官方文档中的验证写法。

methods: {
      submitForm(formName) {
        this.$refs[formName].validate((valid) => {
          if (valid) {
            alert(‘submit!‘);
          } else {
            console.log(‘error submit!!‘);
            return false;
          }
        });
      },
    }

可以看到,element-plus的官方示例中,还是按照vue2的options api写法。这显然是我们不会采用的。

于是上网搜索资料,发现很多人说要引用getCurrentInstance方法来获取实例,这个方法是取代vue2中的this的。引用方法是在当前组件import。

import {getCurrentInstance} from "vue";

我们console了一下,发现确实可以找到$refs,但是这个方法显然不是很好的,而且是开发环境中用做调试的方法。我就不详细说了,可以看下面这篇文章,写的很详细。

https://juejin.cn/post/6901087576195760141

我比较吃惊的是,竟然有一些培训机构就用这个方法去写案例进行培训。vue3设计初不就是不让你这样获取实例,否则取消this干嘛呢?你这样取巧绕过去,真的没问题吗?

但是还有一种获取实例的方法,就是在setup中传入context参数,这个我没仔细研究,就是传入打印了一下,没看到自己想要的东西。

于是我们不如从reactive refs api入手。

看相关资料,发现reactive主要作为定义响应式对象,而ref主要作为响应式单值。当然这是我粗浅的理解,因为两个方法可以互相嵌套。

而且还有torefs,unref,toref等等等等很多api,一时间需要一些时间消化。

可以参考https://blog.csdn.net/Yomuki/article/details/112563904

所以,我们的表单验证就可以这么去写。

<el-form
      ref="loginFormRef"
      :model="loginForm"
      :rules="loginRules"
      class="login-form"
      autocomplete="on"
      label-position="left"
>
     <el-form-item prop="username">
        <el-input
            ref="username"
            v-model="loginForm.username"
            :placeholder="请输入用户名"
            name="username"
            type="text"
            tabindex="1"
            autocomplete="on"
          />
    </el-form>
    <el-form-item prop="password">
        <el-input
              :key="passwordType"
              ref="password"
              v-model="loginForm.password"
              :type="passwordType"
              :placeholder="请输入密码"
              name="password"
              tabindex="2"
              autocomplete="on"
              @keyup="checkCapslock"
              @blur="capsTooltip = false"
              @keyup.enter="handleLogin"
            />
    </el-form>
    <el-button
          :loading="loading"
          type="primary"
          style="width:100%; margin-bottom:30px;"
          @click="handleLogin()"
        >
          登录
     </el-button>
</el-form>
import{自己写} from ‘vue‘
export default defineComponent({
  setup(){
      const loginFormRef = ref();
      const loginForm = reactive({
        username: "admin",
        password: "111111"
      });
    const loginRules=ref({.....})

    const handleLogin = async () => {
      const form = unref(loginFormRef);
      if (!form) return;
      await form.validate((valid: boolean) => {
        console.log(1, valid);
        ...
      });
    }
  }
})

 

vue3+typescript+element-plus表单验证(非获取实例)

标签:可读性   admin   export   post   button   响应式   mod   click   await   

原文地址:https://www.cnblogs.com/delgoh/p/14276576.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!