东飘西荡网

vxe-talbe单元格触发实时校验

vxe-talbe单元格触发实时校验

vxe-talbe单元格触发实时校验
两种设置方法
如这篇博客的单元第三点所说 传送门

  1. 手动调用输入组件的change事件
  1. 在cloumn上使用renderEdit配置(

第一种还好理解,手动调用输入框的格触change事件,当数据发生改变时,发实更新table数据的时校状态来触发校验;

第二种直接配置参数也可以的话,那个肯定是单元框架自己根据配置来做了这一步的处理,接下来探究了一下vxe-table的格触源码

说明:下面提及的源码的方法都在项目目录下的node_modules\vxe-table\lib\index.umd.js(umd 是统一模块定义方法,可以兼容所有其他的发实模块定义方法。我也是时校刚刚百度的)
  1. 有这样一个渲染内置组件的的Map


其中有个renderEdit、renderDefault属性,单元对应了EditRender(nativeEditRender、格触defaultEditRender)方法

  1. 渲染原生的发实标签

在这里插入图片描述
渲染标签的函数最后return 一个h函数,h函数中的时校对象参数有on、nativeOn这两个属性,单元其分别对应绑定原生事件与绑定框架封装的格触事件。(这里稍微看了下源码,发实大概猜测是如此)

  1. getNativeEditOns与getEditOns结构是类似的,如下:

function getEditOns(renderOpts, params) {   var $table = params.$table,      row = params.row,      column = params.column;  var name = renderOpts.name;  var model = column.model;  var isImmediate = isImmediateCell(renderOpts, params);  return getOns(renderOpts, params, function (cellValue) {     // 处理 model 值双向绑定    if (isImmediate) {       UtilTools.setCellValue(row, column, cellValue);    } else {       model.update = true;      model.value = cellValue;    }  }, function (eventParams) {     // 处理 change 事件相关逻辑    if (!isImmediate && (name === '$input' || name === '$textarea')) {       $table.updateStatus(params, eventParams.value);    } else {       $table.updateStatus(params);    }  });}function getNativeEditOns(renderOpts, params) {   var $table = params.$table,      row = params.row,      column = params.column;  var model = column.model;  return getOns(renderOpts, params, function (evnt) {     // 处理 model 值双向绑定    var cellValue = evnt.target.value;    if (isImmediateCell(renderOpts, params)) {       UtilTools.setCellValue(row, column, cellValue);    } else {       model.update = true;      model.value = cellValue;    }  }, function (evnt) {     // 处理 change 事件相关逻辑    var cellValue = evnt.target.value;    $table.updateStatus(params, cellValue);  });}

到了这里可以发现,它们都有处理change事件的相关逻辑,所以对于上面所述第二种触发实时使用配置参数的方法,框架会自动去调updateStatus()这个函数来更新数据的状态。

  1. 最后来看看这个updateStatus函数吧

/**     * 更新项状态     * 如果组件值 v-model 发生 change 时,调用改函数用于更新某一项编辑状态   注:源码中还有一个同名函数处理更新某一列的编辑状态     * 如果单元格配置了校验规则,则会进行校验     */    updateStatus: function updateStatus(scope, itemValue) {       var _this9 = this;      var property = scope.property;      if (property) {         this.validItemRules('change', property, itemValue).then(function () {           _this9.clearValidate(property);        }).catch(function (_ref3) {           var rule = _ref3.rule;          var itemList = _this9.getItems();          var item = itemList.find(function (item) {             return item.field === property;          });          if (item) {             item.showError = true;            item.errRule = rule;          }        });      }    }

其注释已经说得很清楚了,这里就是调用了校验规则来校验改变的数据,从而会在数据不匹配时,显示错误信息、从而实现了实时校验

从上面第一步的截图中可以发现,有input和$input ,那么配置参数时 input 与 $input 有什么区别呢
  1. 首先$input 多了个renderCell的属性,也就多了一个处理:
    在这里插入图片描述
    从其逻辑来看,其应该会对于日期、浮点数有个处理,具体怎么用,我现在也不清楚

  2. 页面渲染上如下图:$input 多了一个div来处理
    在这里插入图片描述
    今天就到此为止吧

未经允许不得转载:东飘西荡网 » vxe-talbe单元格触发实时校验