可视化搭建 - 组件值校验

贾蔷
• 阅读 784

组件值校验,即在组件值变化时判断是否满足校验逻辑,若不满足校验逻辑,可以拿到校验错误信息进行错误提示或其他逻辑处理。

声明 valueValidator 可开启值校验:

import { ComponentMeta } from "designer";

const input: ComponentMeta = {
  componentName: "input",
  element: Input,
  valueValidator: () => ({
    required: true,
    maximum: 10,
  }),
};

如上面的例子,相当于对组件值做了 “不能为 undefined 且最大值为 10” 的限制。

  • 可以内置 JSONSchema validate 的全部校验规则作为内置规则。
  • 支持拓展自定义校验规则。
  • 支持异步校验。
  • 可以用 selector 绑定任意变量(如全局状态 state 或者当前组件实例的 props 来灵活定义组件值校验规则)。

当校验出错时,框架也不会做任何处理,而是将错误抛给业务,由业务来判断如何处理错误。

接下来我们来详细说说每一项特征。

错误处理

定义了组件值校验后,当校验错误出现时,可以通过 selectorvalidateError 拿到错误信息:

const input: ComponentMeta = {
  componentName: "input",
  element: Input,
  valueValidator: () => ({
    required: true,
    maximum: 10,
  }),
  runtimeProps: ({ selector }) => ({
    errorName: selector(({ validateError }) => validateError.ruleName),
    errorMessage: selector(({ validateError }) => validateError.payload),
  }),
};
  • ruleName: 校验规则名称。
  • payload: 该规则未命中时的返回值,校验函数返回什么,这里拿到的就是什么。内置的校验函数返回的是错误信息文案。

拿到校验错误后,通过 runtimeProps 传给组件,我们可通过组件自身或 element 增加统一的组件 React 容器层处理并展示这些错误信息。

也可以使用 fetcher 接收这个错误,并调整取数参数。总之支持 selector 的地方都可以响应校验错误,如何使用完全由你决定。

自定义校验规则

createDesigner 传递的中间件可以拓展自定义校验规则:

import { createMiddleware } from "designer";
const myMiddleware = createMiddleware({
  validateRules: {
    // 自定义校验规则,判断是否为空字符串
    isEmptyString: (value, options?: { errorMessage?: string }) => {
      if (value === "") {
        return true;
      }
      return options.errorMessage;
    },
  },
});

通过 validateRules 定义自定义校验规则后,就可以在 valueValidator 中使用了:

const input: ComponentMeta = {
  componentName: "input",
  element: Input,
  valueValidator: () => ({
    isEmptyString: {
      errorMessage: "字符串必须为空",
    },
  }),
};

用 selector 绑定校验规则

利用 selector 将校验规则绑定到任意状态,比如:

const input: ComponentMeta = {
  componentName: "input",
  element: Input,
  valueValidator: ({ selector }) => selector(({ props }) => props.validator),
};

上面的例子,将所有组件名为 input 组件的校验规则绑定到当前组件实例的 props.validator 上。

const input: ComponentMeta = {
  componentName: "input",
  element: Input,
  valueValidator: ({ selector }) =>
    selector(({ state }) => state.validatorInfo),
};

上面的例子,将所有组件名为 input 组件的校验规则绑定绑定到全局状态 state.validatorInfo 上。

异步校验

将自定义校验函数定义为异步函数,就可以定义异步校验。

const myMiddleware = createMiddleware({
  validateRules: {
    isEmptyString: async (value, options?: { errorMessage?: string }) => {
      await wait(1000);
      if (value === "") {
        return true;
      }
      return options.errorMessage;
    },
  },
});

如上所示,定义了 isEmptyString 的错误校验规则,那么当校验函数执行完后,在 1s 后将会出现校验信息。

总结

组件值校验依然提供了强大的灵活拓展性,以下几种定制能力相互正交,将灵活性成倍放大:

  1. valueValidator 利用 selector 绑定任意值,这样既可以定义固定的校验规则,也可以定义跟随全局状态变化的校验规则,也可定义跟随当前组件实例 props 变化的校验规则。
  2. 在此基础上,还可以自定义校验规则,且支持异步校验。
  3. 更精彩的是,对值校验失败时,如何处理校验失败的表现交给了业务层。我们再次依托强大的 selector 设计,将校验错误传给 selector,就让校验错误的用法产生了无限可能。比如用在 runtimeProps 可以让渲染响应校验错误,用在 fetcher 可以让查询响应校验错误。
讨论地址是:精读《组件值校验》· Issue #473 · dt-fe/weekly

如果你想参与讨论,请 点击这里,每周都有新的主题,周末或周一发布。前端精读 - 帮你筛选靠谱的内容。

关注 前端精读微信公众号

<img width=200 src="https://img.alicdn.com/tfs/TB165W0MCzqK1RjSZFLXXcn2XXa-258-258.jpg">

版权声明:自由转载-非商用-非衍生-保持署名(创意共享 3.0 许可证
点赞
收藏
评论区
推荐文章
Alex799 Alex799
4年前
Vue进阶(幺柒叁):表单元素日期校验
本文主要讲解基于elementuidatetimepicker实现日期时间,在表单校验中的校验逻辑及实现方法。注:在表单检验时间组件时,应在检验中增加type:'date',否则会提示检验对象错误问题。vue部分<开始/结束日期,时间<template<elrowstyle"margintop:
Wesley13 Wesley13
3年前
jango Form表单组件
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入的长度和格式等正不正确。如果用户输入的内容有错误就需要在页面上相应的位置显示对应的错误信息.。Djangoform组件就实
Wesley13 Wesley13
3年前
jcsv导入导出动态扩展思路
我整理的jcsv工具类库简介:csv导入导出组件jcsv(https://my.oschina.net/lipengxs/blog/3094719)jcsv可以支持导入校验规则动态扩展,以及导出规则动态扩展。下面来介绍下扩展思路问题我们支持文件校验、题头校验、列校验等,规则已经多样化,已经覆盖了绝大多数场景,但是难免有一些个性化的校
皕杰报表之数据校验与处理
填报校验分为四种:长度验证、内容校验、计算校验、JavaScript校验。长度校验非空验证就是验证该单元格的值不能为空。内容校验适宜于验证输入内容的格式,譬如:邮箱验证、身份证验证、手机号码验证、邮政编码验证等。计算效验计算效验就是可以进行一些简单的计算校验。JavaScript校验JavaScript校验就是可以与使用一些javascript语言进行校验。
Stella981 Stella981
3年前
SAP OData 后台ETAG校验逻辑
CreatedbyJerryWang,lastmodifiedonJul27,2015修改了lead的数据之后点击savebutton,首先从后台重新读取一次lead的数据:!(https://userimages.g
Stella981 Stella981
3年前
SAP OData的CSRF校验开关
/IWFND/CL\_SODATA\_REST\_HANDLER这个类负责CSRFtoken的校验。布尔变量mv\_check\_csrf\_token控制服务器是否进行校验,默认值为true,意思是要检查。!(https://userimages.githubusercontent.com/5669954/59564398e856f9009
Stella981 Stella981
3年前
Django框架
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入的长度和格式等正不正确。如果用户输入的内容有错误就需要在页面上相应的位置显示显示对应的错误信息.。Djangoform组件
Wesley13 Wesley13
3年前
C#中实现累加校验和计算和校验
为建立中文知识库加块砖       ——中科大胡不归0\.前言如果必须加入一种方法来校验协议数据,累加校验不失为一种好的方案。MD5计算出的Hash太长了,校验和不过1或2个字节,当然MD5的安全性也不是校验和能比的。1\.校验和原理1.1发送方生成检验和1.将发送的进行检验和运算的数据分成若干个16位
Wesley13 Wesley13
3年前
JBolt开发平台入门(13)
在开发中,有些业务简单的select可以满足,在复杂点AutoSelect组件可以满足AutoSelect组件已经可以满足配置几个html属性就能完成数据自动加载、组装、显示、个性化、校验、自动选中默认值等最近JFinal开发者计划成员群里有人喊需要autocomplete组件,在input上输入个关键字,希望通过关键字去数据库里查询相关数据
LeeFJ LeeFJ
2年前
Foxnic-SQL (3) —— 条件表达式(ConditionExpr)
条件表达式ConditionExpr的作用就是完成查询条件的拼装。ConditionExpr支持自由拼装和指定字段的拼装。自由拼装类似Expr的使用方式,并不进行语义或语法的校验。指定字段的拼装,略微严格一点,它会进行简单的字段和值忽略的校验。
SpringBoot如何优雅的进行参数校验(一)
SpringBoot如何优雅的进行参数校验一.为什么要进行参数校验在日常的开发过程中,我们常常需要对传入的参数进行校验,比如在web前后端分离项目中,参数校验有两个方面:前端进行参数校验后端进行参数校验那这两种有什么区别呢?只完成一个可不可以呢?答案是不可
贾蔷
贾蔷
Lv1
墙里秋千墙外道。墙外行人,墙里佳人笑。笑渐不闻声渐悄,多情却被无情恼。
文章
6
粉丝
0
获赞
0