【EasyPage 教你写表单01】- EasyPage 框架介

2024-07-07  本文已影响0人  pikun

简介

EasyPage 正如其名,含义是:简单的页面。它能让我们的前端页面开发更加简单,目前我们专注于解决表单问题。

它提供了一套描述式的 API,来帮助你高效地开发用户界面。无论是简单还是复杂的界面,EasyPage 都可以胜任。

下面是一个最基本的示例,创建一个姓名的表单:

// ./name.tsx
import { nodeUtil } from '@easy-page/antd-ui';

export const name = nodeUtil.createField('name', '姓名', {
  value: '',
  required: true,
});

上面的字段定义,展示了 EasyPage 的两个特性:

你可能已经有了些疑问——先别急,在后续的文档中我们会详细介绍每一个细节。现在,请继续看下去,以确保你对 EasyPage 作为一个框架到底提供了什么有一个宏观的了解。

EasyPage 能做什么?

  • 在后续的文档中,我们将一一见识到上述好处。

EasyPage 的优势是什么?

简洁性

上述示例可以初步看到其简洁性,下面我们描述如下复杂逻辑,再看其简洁性。


/** 选项 **/
const manOption = nodeUtil.createNode('man', { name: '男' });
const womenOption = nodeUtil.createNode('female', { name: '女' })

/** 字段 **/
const sexField = nodeUtil.createField('sex','性别', { value: '', mode: 'single' })

/** 子表单字段 **/
const hobby =  nodeUtil.createField('like', '喜欢看的书', { value: '' })

export const sex = sexField.appendChildren([
    manOption.appendChildren([hobby]),
    womenOption,
  ]);

  • 若此场景有更简洁的写法,请在 Github 下评论。

高内聚、低耦合

你可以想象到的关于字段的一切,都可以在自身定义中,完整独立逻辑闭环。

以下还是以表单元素为一个实际的例子,来展示上述特点:

从上可见,上述字段逻辑比较复杂,依赖 name 的填写,做相关联动,但从头到尾,并没有去其他地方做任何事情,自身就可以把逻辑完全描述。
充分可见其:高内聚、低耦合特点。

  • 小惊喜:我们的 API 描述对于类型提示很友好哦!
    [图片上传失败...(image-ddde6e-1720432245229)]

复用性

对于组件复用,相信大家都不陌生,在这种场景下,我们可以抽离公共组件:

但随着业务的愈发复杂,我们发现:

这种现象和问题在表单里体现的更加淋漓尽致。JAVA 面向对象思想中,提出了:继承的概念来解决复用性问题,但在前端 hooks 的写法下,很难实践。也造成了现在的困扰。

但,EasyPage 提出了针对这一场景的解决方案,以下还是承接上面的例子,来展示其复用性。

import { nodeUtil } from '@easy-page/antd-ui';
import { age } from './age';

export const newAge = nodeUtil.extends(age, {
  name: '我的年龄',
  required: false,
  validate(oldValidate) {
    return (options) => {
      if (!options.value) {
        return { success: true };
      }
      return oldValidate?.(options);
    };
  },
  when(oldWhen) {
    return {
      effectedKeys: oldWhen?.effectedKeys || [],
      show(context) {
        return true;
      },
    };
  },
  fieldUIConfig: (oldConfig) => {
    const newConfig = { ...(oldConfig || {}) };
    newConfig.formItem = newConfig.formItem || {};
    newConfig.formItem.tooltip = '这是新的年龄';
    return newConfig;
  },
});

运行效果见官网。

可以看到,上述年龄字段继承了原来的所有逻辑,并进行了修改和更新,并和原来的代码无任何冲突和交集,也无需做任何的抽象处理。

扩展性

扩展性主要是从开发角度来描述,如何更灵活的应对各种场景。

首先,我们想创建一个输入框字段:

import { nodeUtil } from '@easy-page/antd-ui';

export const name = nodeUtil.createField('name', '姓名', {
  value: '',
  required: true,
});

一般创建的默认组件:

其余,靠指定组件,如:写一个描述字段:

export const desc = nodeUtil.createField(
  'desc',
  '介绍',
  {
    value: '',
  },
  {
    /** 指定 TextArea 组件 **/
    ui: UI_COMPONENTS.TEXTAREA,
  }
);

  • @easy-page/antd-ui 包里的组件即目前所支持的组件。

如果默认的组件,还无法满足要求。此时,有两种方式:

我们除了可以:扩展一个通用组件外,可能还因为不同的公司,要求的基础组件库不一样,如:

我们可以参考:@easy-page/antd-ui 扩展一个自己的组件库,扩展成本大概在 1 - 2 天左右。

  • 在框架的设计上,预留了支持 vue 的可能
  • 除了编写页面外,做 cli 的问题列表开发,也可以扩展

EasyPage 和 Formily

相同点

差异

上一篇下一篇

猜你喜欢

热点阅读