ES6 中使用 Proxy 优雅的实现表单验证

阅读时长 4 分钟读完

在前端开发中,表单验证是必不可少的一环。传统的表单验证方式多为 if-else 或者 switch-case 语句,代码冗长、可读性差且难以维护。本文将介绍使用 ES6 增加的 Proxy 对象,实现简单、优雅并易于维护的表单验证方法。

什么是 Proxy

Proxy 对象是 ES6 中新增加的一个对象,可以用来拦截 JavaScript 操作。它可以拦截的操作包括对象属性的读取、赋值、删除、函数调用等等。在该对象的作用下,我们可以封装一些操作,达到控制、修改甚至是增强现有属性及方法的目的。

例如,我们可以通过 Proxy 对象拦截对某个对象属性的读写,防止属性值被任意修改,保证该属性值的安全。

表单验证的实现

在传统的表单验证方式中,我们需要手动对每个表单元素进行判断,增加了代码量,也降低了代码可读性。而使用 Proxy 对象,则可通过拦截整个表单对象的读写来实现表单验证。

步骤分析

我们可以按照以下步骤来使用 Proxy 实现表单验证:

  1. 创建一个空 Proxy 对象,绑定在表单元素 tagName 为 form 的元素本身上;
  2. 在 Proxy 对象的 set 方法中,监听表单元素的所有键值对变化,判断其值是否合法;
  3. 如果值不合法,则将错误信息存入 errors 对象中;
  4. 最后将 errors 对象输出。

示例代码

下面来看一个具体的示例。这里将创建一个代理对象 formProxy,监听表单元素的变化,并对表单元素进行验证。验证的规则是每个输入框的内容不能为空,并且用户名不能包含数字。

-- -------------------- ---- -------
----- ------ - ---
----- ---- - -------------------------------
----- --------- - --- ----------- -
  ----------- ---- ------ -
    -- ---- --- ----------- -
      ----------- - ------
    - ---- -
      ----- ----- - --------------------------------------
      -- ------- -
        -- ------ --- --- -
          ------------------ - ---------------------------
        - ---- -- ----------- --- ---------- -- -------------------- -
          ------------------ - ------------
        - ---- -
          ------ -------------------
        -
      -
      ----------- - ------
    -
    ------ -----
  -
---

上面的代码中,我们通过 querySelector 方法来获取每个表单元素的名称,然后在 set 方法中监听这个名称对应的值的变化。如果该值为空(即没有输入),则在错误信息对象 errors 中存入该元素的错误信息。如果该值为用户名(即键名为 username),并且包含数字,则同样在错误信息对象中存入该元素的错误信息。

最后,我们可以在提交表单时,检查错误信息是否为空。如果不为空,则阻止表单提交,弹出对应的错误信息。代码如下:

-- -------------------- ---- -------
----- ------------ - --- -- -
  -------------------
  -- --------------------------- - -- -
    --------------------------------
  - ---- -
    -----------------
  -
--

------------------ - -------------

完成上述代码后,我们可以看到表单元素的赋值操作都被代理拦截住了,只有当我们输入一个合法的值时,表单元素才会被赋值,并且错误信息不会产生。

总结

使用 ES6 提供的 Proxy 对象,我们可以实现优雅、简单的表单验证,避免了传统方式中的 if-else 或 switch-case 繁琐的判断。使用代理对象来实现表单验证,提高了代码的可读性和可维护性,是一种非常值得推广的前端开发方式。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6484dd9148841e98943e2371

纠错
反馈