react 表单受控的现代实现方案

简介: `react-form-simple`是一个轻量级的React表单库,专注于简化受控表单的开发,提供数据绑定、验证、错误处理和UI更新等功能。它通过简洁的API减少复杂性,支持第三方UI库集成,并具备高度可扩展性。核心特点包括基于Proxy的数据绑定、实时错误处理、高效的UI更新和灵活的使用方式。通过`useForm`和`render`等钩子,开发者可以快速构建表单应用,同时支持动态表单和自定义验证规则。该库旨在提高开发效率,适用于复杂表单场景,降低学习和维护成本。

1716526178538.jpg

引言

在现代Web开发中,表单处理是用户与应用交互的核心环节。无论是用户注册、登录、填写调查问卷,还是完成在线购买,表单都是收集用户信息和提供个性化体验的关键工具。高效的表单处理不仅能够提升用户体验,还能显著提高应用的整体质量和可靠性。

然而,表单处理也带来了诸多挑战。开发者需要处理数据绑定、验证规则、错误处理、状态管理和UI更新等多个复杂的环节。现有的解决方案虽然能够部分解决这些问题,但往往难以平衡灵活性和简洁性。

在React中,数据受控一直是一个让人头疼的问题。为了实现一个输入框的受控状态,我们通常需要定义onChange和value属性,并手动管理数据绑定。当表单元素众多时,代码中充斥着大量的setState调用,导致代码冗长且难以维护。管理这些状态也将变得更加复杂和繁琐。

而现有的许多表单库要么功能单一,无法满足复杂场景的需求;要么设计过于繁琐,不够直观,增加了开发者的学习和使用成本。这使得开发者在处理复杂表单时常常感到束手无策,难以找到一种既简洁又高效的解决方案。

简介

logo.jpg

react-form-simple是一个基于react的可受控可扩展的轻量级表单库,以最快的速度以及最精简的代码渲染出一个可受控的表单。 react-form-simple 除了集成自身功能之外,还具有非常可扩展的接口, 并可与第三方ui集成使用。

react-form-simple 库提供了一套全面的解决方案,涵盖了数据绑定、验证规则、错误处理和UI更新等多个方面。其设计理念是简化开发流程,提升开发效率,并为开发者提供高度灵活和可扩展的工具。并高效构建复杂的表单应用。

背景

1. 现有表单解决方案的不足

  • 复杂性

现有的表单解决方案在使用过程中往往存在较高的复杂性,使得开发者不得不花费大量的时间和精力去学习和理解其复杂的API和工作原理。例如,一些表单库采用了繁琐的配置方式,需要编写大量的配置代码,使得使用起来不够直观和高效。比如 Formily,其复杂的配置和API学习曲线较陡,对新手和时间紧迫的开发者来说并不友好。

  • 灵活性

一些表单解决方案缺乏足够的灵活性,无法满足开发者个性化的需求。例如,许多表单库只提供了预定义的验证规则和错误处理机制,难以满足特定业务场景下的定制需求。更糟的是,它们对字段之间的相互依赖,有着比较大的处理难度,导致开发者在实际应用中遇到困难。例如 react-hook-form,尽管其轻量级和性能优秀,但在处理复杂交互和自定义验证时显得力不从心。

  • 集成性不足

一些表单解决方案存在集成性不足的问题,无法与第三方UI库或其他工具良好地集成使用。这使得开发者在构建一致的用户界面时遇到困难。例如 Antd Form,虽然强大,但其与其他非Ant Design组件库的集成并不总是顺利,限制了开发者在 UI 选择上的自由度。

2. React表单库的开发动机和目标

  • 简化开发流程:通过提供简洁直观的API,减少开发者在学习和使用过程中的复杂性,使表单开发变得更加轻松和高效。
  • 提高灵活性:支持灵活的数据绑定、验证规则和错误处理机制,满足各种复杂业务场景的需求。同时,通过高度可扩展的接口,允许开发者根据实际需求进行个性化定制。
  • 增强集成性:确保库能够与各种第三方UI组件库和工具无缝集成,提供更大的自由度和兼容性,使开发者能够自由选择和使用他们喜爱的UI组件。
  • 易于维护和扩展:提供清晰的和良好的代码结构,使得表单库不仅易于上手,而且便于后续的维护和扩展,降低开发和维护成本。

核心功能

  1. 简单高效的数据绑定
    react-form-simple 提供了简洁直观的数据绑定机制,通过可观察对象来监控表单模型操作,表单项的受控操作只需通过直接赋值即可实现。

    • 优势:只需几行代码即可完成表单受控操作,无需关心复杂的受控逻辑和过程,只需关注受控结果和如何应用受控状态。
  2. 灵活的错误处理机制
    提供灵活的错误处理机制,支持实时显示错误信息和自定义错误提示。无论是单个字段的错误处理还是整个表单的错误处理,无论是内置的错误异常还是外部手动控制的异常,react-form-simple 都能完美集成。

    • 优势:用户输入错误时即时提示,提高用户体验,支持自定义错误信息,提升表单的友好性。
  3. 高效的UI更新
    高效的UI更新机制,确保表单状态变化时UI能够快速响应。每个表单项之间的渲染自动完全隔离,避免在处理大型动态数据时出现的页面卡顿。

    • 优势:显著提升表单输入后的响应速度,优化性能,确保用户交互的流畅性。
  4. 强大的数据观测功能
    内置数据观测功能,允许对整个表单或单个表单项进行监测。在需要实时获取表单项最新值的场景中,可以进行值的订阅,确保数据同步和渲染的准确性。

    • 优势:实时监控表单数据变化,确保数据同步,提升表单的动态响应能力。
  5. 灵活的使用方式和布局
    支持灵活的使用方式和多种表单布局组合,开发者可以根据实际需求选择最适合的布局方式。

    • 优势:大多数情况下,无需手动布局,大幅提升开发效率和灵活性。
  6. 简约的 API 设计
    采用简洁直观的API设计,简化了表单操作流程。仅需引入两个API,即可构建一个完整的表单应用。

    • 优势:降低学习成本和心智负担,简化开发流程,提高开发效率。
  7. 高度可扩展的接口
    提供高度可扩展的接口,满足复杂需求和定制化场景。开发者可以根据实际需求定制表单的控制逻辑,灵活应对各种业务需求。

    • 优势:支持各种定制需求,适应不同业务场景,提供更大的自由度和灵活性。
  8. 轻松集成第三方UI库
    支持与各种第三方UI库的无缝集成。

    • 优势:提供更大的灵活性和自由度,确保与现有技术栈的兼容性。
  9. 完整的类型推断
    提供完善的类型系统,确保开发过程中的类型安全。

    • 优势:减少类型错误,提升代码质量和开发效率。

设计理念

1.设计原则

react-form-simple 的设计原则是基于简洁性、灵活性和可扩展性,旨在为开发者提供一个高效、易用且强大的表单处理工具。

2.架构设计与技术实现方式

react-form-simple 采用了现代化的架构设计,提供了基于 MVVM 架构设计的解决方案。通过 render 函数作为桥梁,它将视图与模型绑定,实现了数据与 UI 的分离。底层技术实现结合了 Proxy和发布订阅模式来实现简洁的双向数据绑定和高效的UI更新。

1.基于Proxy的实现

react-form-simple 利用Proxy对象来实现数据的拦截和监听。Proxy对象允许我们在对象的基本操作(如属性读取、赋值等)时插入自定义的行为。

  • 数据绑定:通过Proxy对象拦截对表单数据的操作,实现数据和视图的自动绑定和更新。当表单项的数据发生变化时,通过Proxy的set方法自动更新视图。

2. 发布订阅模式
react-form-simple 采用发布订阅模式,通过事件驱动的方式来管理表单状态的变化和UI的更新。每当表单数据发生变化时,自动通知相关订阅者进行相应的处理。

3.React Hook
react-form-simple 使用React Hook来管理表单的状态和生命周期。通过自定义Hook实现表单的状态管理和数据绑定逻辑。

  • useForm:负责初始化表单状态及模型数据,提供表单操作的基本方法。
  • useSubscribe:用于订阅表单模型数据的变化。在表单字段更新后,如果需要将该字段实时渲染在视图中,开发者可以使用此钩子订阅该字段。确保视图能够实时响应数据变化,实现数据和视图的同步更新。通过仅在需要的地方进行订阅,避免了重新设置整个渲染树。
  • useWatch:用于观察表单模型数据变化的钩子。通过 useWatch,开发者可以观测整个表单、单个字段或多个字段的变化。只有当被观察的字段发生改变时才执行回调。无论是对整个表单的状态进行监测,还是针对特定字段的变化进行响应,useWatch 钩子都为开发者提供了一种方便而灵活的方式来处理表单数据的变化。
  • 更多 API 可查阅[](https://easy-form.github.io/react-form-simple/zh-CN)

4.工作流程
react-form-simple 的工作流程可以概括为以下几个步骤:

  1. 初始化表单状态:通过useForm初始化表单的状态和操作方法。
  2. 绑定表单项:使用render函数将渲染视图与表单状态进行绑定。
  3. 表单项更新:当用户在表单中输入数据时,通过内置的函数驱动触发相应的更新模型方法,更新表单模型数据。
  4. Proxy拦截:当开发者手动更改表单模型数据后,触发Proxy的 set 方法。通过发布订阅模式,将字段值的变化通知给所有订阅者,实现数据和视图的双向绑定。

5.核心功能架构基本流程图

无标题-2024-05-23-1420.png

使用指南

  • 安装
npm install react-form-simple -S // or yarn add react-form-simple -S
  
  • 引入并使用表单库

在React组件中使用 react-form-simple 来创建和管理表单。以下是一个基本的使用示例:

import React, { useState } from 'react';
import { useForm } from 'react-form-simple';

export default function App() {
  // 初始化表单模型
  const { render, model } = useForm({name: ''});

  const [modelState, setModelState] = useState('');

  // 渲染一个表单项,绑定到模型中的name字段
  const renderName = render('name')(<input className="input" />);

  // 提交操作
  const renderSubmit = (
    <button onClick={() => setModelState(JSON.stringify(model))}>
      Submit
    </button >
  );

  return (
    <>
      {renderName}
      {modelState}
      {renderSubmit}
    </>
  );
}

基本使用
创建一个受控表单项,只需要两行代码:

  1. 通过 useForm 创建一个表单数据模型。
  2. 使用 render 方法来绑定表单项。调用 render('name') 绑定到模型中的 name 字段,并传入表单元素(如 input) 进行渲染。

开发者无需担心 name 字段与 input 的受控过程,只需将 model 模型数据应用到代码中。在 name 字段与 input 视图受控时,它们之间的变化不会重新触发任何外部重复的渲染。换句话说,表单的渲染是完全相互隔离的。

  • 受控赋值

通过简单的赋值操作来更新表单项的值,并实时地反映在视图中

import React, { useState } from 'react';
import { useForm } from 'react-form-simple';

export default function App() {
  const { render, model } = useForm({ name: 'name' });

  const [modelState, setModelState] = useState('');

  const renderName = render('name')(<input className="input" />);

  const onSubmit = () => setModelState(JSON.stringify(model));
  const renderButton = (
    <button
      onClick={() => {
        model.name = 'xxxx';
      }}
    >
      set
    </button>
  );

  return (
    <>
      {renderName}
      {modelState}
      {renderButton}
      <button onClick={onSubmit}>submit</button>
    </>
  );
}
  • 基于函数的受控

在某些场景下,可能需要更加灵活地处理表单项的受控逻辑,而不是完全依赖于 render 方法的自动受控特性。为了满足这种需求,react-form-simple 提供了基于函数的受控方式,允许开发者手动处理表单项的受控逻辑。

import React, { useState } from 'react';
import { useForm } from 'react-form-simple';

export default function App() {
  const { render, model } = useForm({ name: 'name' });

  const [modelState, setModelState] = useState('');

  //创建受控表单项,并传入自定义配置
  const renderName = render('name', {
    customErrTips: true, // 启用自定义错误提示
    rules: { required: 'Please Input' }, // 验证规则
  })(({ attrs, errorMessage, isError }) => (
    <div>
      <input {...attrs} className="input" />
      {/* 错误提示 */}
      {isError && <div>{errorMessage}</div>}
    </div>
  ));

  const onSubmit = () => setModelState(JSON.stringify(model));

  return (
    <>
      {renderName}
      {modelState}
      <button onClick={onSubmit}>submit</button >
    </>
  );
}

在这段代码中,我们使用 render 方法创建了一个受控的表单项,并传入了自定义配置,如启用自定义错误提示和定义验证规则。通过这种方式,我们可以更灵活地控制表单项的受控逻辑,并根据需要进行定制。

  • 订阅最新值

在表单开发中,经常会遇到一种情况:某个字段 A 的值依赖于另一个字段 B 的值,例如,当字段 B 的数值发生变化时,字段 A 需要进行相应的逻辑处理,并将更新后的值实时渲染在视图中。在 react-form-simple 中,表单项的受控并不能直接触发外部视图的更新。为了解决这个问题,可以使用 useSubscribe 钩子来订阅某个字段或整个表单的变化,从而将其渲染在表单视图之外。

import React from 'react';
import { useForm } from 'react-form-simple';

export default function App() {
  const { render, useSubscribe } = useForm({ name: 'name', age: 'age' });

  const renderName = render('name')(<input className="input" />);
  const renderAge = render('age')(<input className="input" />);

  const subscribemodel = useSubscribe(({ model }) => model);

  const subscribeAge = useSubscribe(({ model }) => model.age);

  return (
    <>
      <div>newAgeValue: {subscribeAge}</div>
      <div>newModelValue: {JSON.stringify(subscribemodel)}</div>
      {renderName}
      {renderAge}
    </>
  );
}

在这段代码中,我们使用 useSubscribe 钩子来订阅了整个模型和特定字段的变化,并将其渲染在表单视图之外。这样,无论是整个表单模型还是特定字段的值发生变化,都能及时地反映在外部视图中,实现了数据的同步更新。

  • watch监听

react-form-simple 提供了强大的数据观测功能,开发者可以通过 useWatch 钩子来观察某个字段或整个表单的变化。在下面的示例中,我们使用 useForm 创建了一个包含 name 和 age 两个字段的表单数据模型,并使用 render 方法来创建表单项。随后,我们使用 useWatch 来订阅了 name 和 age 字段的变化,并在字段值发生变化时执行回调函数。

import React from 'react';
import { useForm } from 'react-form-simple';

export default function App() {
  const { render, useWatch } = useForm({ name: 'name', age: 'age' });

  const renderName = render('name')(<input className="input" />);
  const renderAge = render('age')(<input className="input" />);

  // 使用 useWatch 订阅字段变化并执行回调函数
  useWatch(
    // 订阅监听字段
    ({ model }) => [model.name, model.age],
    // 回调函数,当字段值发生变化时触发
    (value, preValue) => {
      console.log({ value, preValue });
    },
  );

  return (
    <>
      {renderName}
      {renderAge}
    </>
  );
}

通过这种方式,开发者可以方便地监测表单字段的变化,并在需要时执行相应的逻辑,实现了对表单数据的实时监控和处理。

  • 表单校验

通过 useForm 提供的 validate 方法,可以快速对表单模型进行校验。在下面的示例中,我们使用 useForm 创建了一个包含 name 和 age 两个字段的表单数据模型,并使用 render 方法创建了两个表单项。其中,renderName 表单项设置了必填规则和字段标签,而 renderAge 表单项设置了必填规则和自定义校验规则,并展示了如何在校验规则中使用自定义验证函数。

import React from 'react';
import { useForm } from 'react-form-simple';

export default function App() {
  const { render, validate, model } = useForm({ name: '', age: '' });

  const renderName = render('name', {
    rules: { required: 'Please Input' },
    requireIndicator: true,
    label: 'name',
  })(<input className="input" />);

  const renderAge = render('age', {
    label: 'age',
    rules: [
      { required: 'Please Input' },
      {
        validator(value) {
          if (value < 10) {
            return 'Min 10';
          }
          return '';
        },
      },
    ],
  })(<input className="input" />);

  const renderSubmit = (
    <button
      onClick={async () => {
        await validate();
        console.log(model);
      }}
    >
      Submit
    </button>
  );

  return (
    <>
      {renderName}
      {renderAge}
      {renderSubmit}
    </>
  );
}

更多校验方式,查看文档

  • 集成第三方UI

在实际项目中,通常会利用第三方UI库来呈现表单视图。幸运的是,react-form-simple 能够轻松地与各种UI库集成,无论是哪一种UI库。
下面的示例展示了如何集成 antd UI库:

import Button from '@components/Button';
import { Checkbox, Input, Select } from 'antd';
import React from 'react';
import { useForm } from 'react-form-simple';

export default function App() {
  const { render, model, validate } = useForm(
    { name: '', select: 'jack', checkbox: true },
    { labelPosition: 'top' },
  );
  const renderName = render('name', {
    label: 'name',
    rules: { required: 'please Input' },
    requireIndicator: true,
    defineProps(options) {
      return { status: options.isError ? 'error' : '' };
    },
  })(<Input style={{ width: '300px' }} placeholder="Please Input" />);

  const renderSelect = render('select', {
    label: 'age',
    formatChangeValue: (e) => e,
  })(
    <Select
      options={[
        { value: 'jack', label: 'Jack' },
        { value: 'lucy', label: 'Lucy' },
        { value: 'Yiminghe', label: 'yiminghe' },
      ]}
      style={{ width: '300px' }}
    />,
  );

  const renderCheckbox = render('checkbox', {
    label: 'Checkbox',
    labelPosition: 'row',
  })(<Checkbox />);

  const renderSubmit = (
    <Button
      onClick={async () => {
        await validate();
        console.log(model);
      }}
    >
      Submit
    </Button>
  );

  return (
    <>
      {renderName}
      {renderSelect}
      {renderCheckbox}
      <div>{renderSubmit}</div>
    </>
  );
}

上面仅展示集成antd的用法。通过这种方式,您可以将 react-form-simple 与您喜欢的UI库集成,从而实现更灵活和丰富的表单展示效果。

关于更多集成UI用法,可查看文档

  • 动态表单

使用 react-form-simple 创建受控动态表单非常直观,开发者无需关心每个表单项的受控逻辑,也无需担心哪一项的值需要受控。你只需直接操作数组赋值,并调用 forceUpdate 方法手动刷新视图,即可实现动态表单。
下面是一个示例,展示了如何创建一个动态表单,其中包含添加和删除表单项的功能:

import React from 'react';
import { useForm } from 'react-form-simple';
import { getUuid } from 'react-form-simple/utils/util';

export default function App() {
  const { model, render, validate, forceUpdate } = useForm({
    fieldsDymic: [{ value: 0, uid: getUuid() }],
  });
  const { fieldsDymic } = model;

  const renderFields = fieldsDymic.map((field, i) => (
    <div key={field.uid} style={{ display: 'flex', alignItems: 'center' }}>
      {render(`fieldsDymic.${i}.value`, {
        label: `name${i}`,
        labelPosition: 'top',
        rules: { required: 'Please Input' },
      })(<input className="input" />)}
      <button
        style={{ height: '30px', marginLeft: '10px' }}
        onClick={() => {
          model.fieldsDymic.splice(i, 1);
          forceUpdate();
        }}
      >
        Delete
      </button>
    </div>
  ));

  return (
    <>
      {renderFields}
      <button
        onClick={() => {
          const len = model.fieldsDymic.length;
          model.fieldsDymic.push({ value: len, uid: getUuid() });
          forceUpdate();
        }}
      >
        Add
      </button>
      <button
        style={{ marginLeft: '15px' }}
        onClick={() => {
          validate();
          console.log(model);
        }}
      >
        Submit
      </button>
    </>
  );
}

示例说明
1.初始化表单模型:

const { model, render, validate, forceUpdate } = useForm({
  fieldsDymic: [{ value: 0, uid: getUuid() }],
});

使用 useForm 钩子创建一个包含动态字段的表单模型。初始状态下,fieldsDymic 数组中包含一个字段对象,该对象有一个唯一标识符 uid 和一个初始值 value。

2.渲染动态字段:

const renderFields = fieldsDymic.map((field, i) => (
  <div key={field.uid} style={{ display: 'flex', alignItems: 'center' }}>
    {render(`fieldsDymic.${i}.value`, {
      label: `name${i}`,
      labelPosition: 'top',
      rules: { required: 'Please Input' },
    })(<input className="input" />)}
    <button
      style={{ height: '30px', marginLeft: '10px' }}
      onClick={() => {
        model.fieldsDymic.splice(i, 1);
        forceUpdate();
      }}
    >
      Delete
    </button>
  </div>
));

fieldsDymic 数组中的每个字段都通过 render 方法进行渲染。我们将字段绑定到模型中的相应路径,并应用验证规则。每个字段旁边都有一个 "Delete" 按钮,用于从数组中移除该字段,并调用 forceUpdate 方法刷新视图。

3.添加新字段:

<button
  onClick={() => {
    const len = model.fieldsDymic.length;
    model.fieldsDymic.push({ value: len, uid: getUuid() });
    forceUpdate();
  }}
>
  Add
</button>

"Add" 按钮用于向 fieldsDymic 数组中添加新字段。每次点击按钮时,都会生成一个新的字段对象,并调用 forceUpdate 方法刷新视图。

4.提交表单:

<button
  style={{ marginLeft: '15px' }}
  onClick={() => {
    validate();
    console.log(model);
  }}
>
  Submit
</button>

"Submit" 按钮用于验证表单并在控制台中打印模型数据。调用 validate 方法后,会根据定义的规则验证所有字段。

通过这种方式,你可以轻松地管理和渲染动态表单项,而无需深入了解表单项的受控逻辑。尤其适用于复杂的表单场景。

  • 表单性能测试

无论添加多少条数据,react-form-simple 在处理表单项时都能保持流畅,不会出现任何卡顿。

  • 完整的类型推断

提供完整的类型推断。当你使用 useForm 初始化模型后,后续的钩子 或 API 会自动推断并应用完整的类型信息。这确保了在开发过程中,你能够获得更好的类型提示和代码补全,提升开发体验和代码质量。

4b0f4fe2-7f3e-4a3c-aded-e3d33a2ff5ff.gif

  • 组件形式

在实际开发中,一些开发者可能更习惯于使用组件的方式来组织和渲染视图,这样可以更加直观地管理代码结构。为此,react-form-simple 提供了两个非黑盒化的组件:Form 和 FormItem。通过这些组件,开发者可以更灵活地创建和管理表单,尤其在需要定制化表单或处理额外逻辑时,这两个组件将非常有用。
开发者可以基于这些组件封装适合自己使用习惯的 useForm,而不一定使用内置的 useForm,从而实现定制化的表单逻辑。以下是使用 FormItem 的一个示例,更多详细介绍请参阅 FormItem 的相关文档。

import React from 'react';
import { FormItem } from 'react-form-simple';

function App() {
  return (
    <>
      <FormItem
        bindId="name"
        getContent={({ attrs }) => <input className="input" {...attrs} />}
      />
      <FormItem
        bindId="select"
        getContent={({ attrs }) => (
          <select {...attrs}>
            <option value="name">name</option>
            <option value="age">age</option>
            <option value="email">email</option>
          </select>
        )}
      />
      <button onClick={() => console.log()}>submit</button >
    </>
  );
}

export default App;

通过以上示例可以看出,FormItem 提供了一种便捷的方式来绑定表单项和模型数据,使得表单创建和管理更加直观和灵活。在需要更高定制化的场景下,开发者可以自由地扩展和调整表单逻辑,以满足各种复杂的需求。

此外,开发者可以灵活地将 useForm 与 FormItem 结合使用。在渲染表单时,你可以选择使用 render 函数单独渲染表单项,也可以单独使用 FormItem 组件,甚至可以将它们一起包裹在 Form 组件中。这完全取决于你的个人喜好和具体需求。

import React from 'react';
import { Form, FormItem, useForm } from 'react-form-simple';

export default function App() {
  const { render, contextProps, model } = useForm({
    name: 'name',
    age: 'age',
    select: 'age',
  });
  return (
    <div>
      <Form  contextProps={contextProps}>
        <FormItem
          bindId="name"
          getContent={({ attrs }) => <input {...attrs} className="input" />}
          initialValue={model.name}
        />
        <FormItem
          bindId="age"
          getContent={({ attrs }) => <input {...attrs} className="input" />}
          initialValue={model.age}
        />
        {render('select')(
          <select>
            <option value="name">name</option>
            <option value="age">age</option>
            <option value="email">email</option>
          </select>,
        )}
      </Form>
    </div>
  );
}

通过这种灵活的组合方式,你可以根据实际需求选择最适合的表单渲染方式,最大化地提升开发效率和代码可维护性。

从本质意义上来说,内置的useForm 就是对FormItem的无缝集成。

由于篇幅有限,以上只是简单介绍了 react-form-simple 的基本用法。实际上,在实际的表单应用中,业务场景和表单字段往往比示例中复杂得多。作为一个轻量级表单库,react-form-simple 既没有 Formily 的繁琐配置,也没有 antd Form 对 UI 库的高度耦合。只需一行代码即可创建一个表单应用,它所提供的 API 足以覆盖大多数业务场景。

与 Formily 不同,react-form-simple 并没有一整套专门为业务服务的 UI 控件。你可以将 react-form-simple 视为一个底层表单引擎,基于它的 API 和属性,构建属于你自己的表单框架。然而,我们并不需要如此复杂的设置。在繁琐且单调的业务需求中,我们只想快速地构建表单应用。构建表单应用应该是轻松愉快的,而不应被大量需要维护的表单字段所困扰。react-form-simple 正是为此而生。

目前,react-form-simple 已被用于实际生产项目中。在构建大型表单应用时,与之前使用的 react-hook-form 相比,代码量减少了近一半。同时,单元测试覆盖率也接近百分之百。

unit-test01.jpg

unit-test02.jpg

探索 react-form-simple 的优势并开始使用

react-form-simple 是一个革命性的轻量级表单库,它简化了表单开发的复杂性,提升了开发效率,并且保持了卓越的性能。无论你是初学者还是经验丰富的开发者,react-form-simple 都能为你带来无与伦比的开发体验和生产力提升。

为什么选择 react-form-simple

  1. 数据绑定:通过简单的赋值操作即可实现数据与视图的同步更新。
  2. 简洁易用:只需一行代码即可创建一个功能完善的表单应用,无需繁琐的配置和复杂的状态管理。
  3. 高性能:无论表单数据有多复杂,react-form-simple 都能保持流畅的用户体验,不会出现卡顿。
  4. 灵活集成:轻松与各种第三方 UI 库集成,无需担心兼容性问题。
  5. 完善的类型推断:提供全面的类型推断和校验机制,减少代码错误,提高开发效率。
  6. 强大的功能:支持数据绑定、验证规则、错误处理、UI 更新、动态表单等,满足各种业务需求。

如果你正在寻找一个能够简化表单开发、提高效率的工具,react-form-simple 是你的不二选择。它不仅能帮助你快速构建表单应用,还能确保你的代码保持简洁和高效。

开始使用 react-form-simple,让表单开发变得更加高效和愉快。我们期待你的加入!

写在最后

本文简单的介绍了react-form-simple的使用,构建可维护的代码。以及在新技术领域保持学习的动力。通过这些话题,我们不仅仅是在谈论代码本身,更是在谈论一种持续的挑战与成长的过程。

在编码的旅程中,我们常常会面临新的问题,需要找到创新的解决方案。正是通过解决这些挑战,我们才能不断提升自己的技能,并在技术的海洋中航行得更远。每一行代码都是一次思考的结果,每一个问题都是一次成长的机会。

在未来的代码之旅中,愿我们能够保持对技术的热爱,持续学习,不断挑战自己。编码不仅仅是一项技能,更是一场不断演化的冒险。感谢你阅读本文,期待与你在下一篇文章中再次相遇。
Happy coding! 🚀✨

文档链接https://easy-form.github.io/react-form-simple

目录
相关文章
|
1月前
|
移动开发 前端开发 JavaScript
React 表单与事件
10月更文挑战第10天
40 1
|
1月前
|
前端开发 JavaScript 数据安全/隐私保护
深入探索研究React表单
【10月更文挑战第6天】
89 57
|
29天前
|
移动开发 前端开发 JavaScript
React DnD:实现拖拽功能的终极方案?
本文首发于微信公众号“前端徐徐”,介绍了一个强大的 React 拖拽库——React DnD。React DnD 帮助开发者轻松创建复杂的拖拽界面,适用于 Trello 风格的应用、列表重排序、可拖拽的 UI 组件等场景。文章详细介绍了 React DnD 的基本信息、主要特点、使用场景及快速上手指南。
69 3
React DnD:实现拖拽功能的终极方案?
|
20天前
|
前端开发 JavaScript
React 表单处理技巧
【10月更文挑战第24天】本文从初学者角度出发,详细介绍了 React 中表单处理的基本概念、常见问题及解决方案。涵盖受控组件与非受控组件的区别、状态更新、表单验证、多字段管理及高级技巧,通过代码示例帮助读者更好地理解和应用。
51 7
|
2月前
|
资源调度 Kubernetes 前端开发
react-intl——react国际化使用方案
react-intl——react国际化使用方案
|
1月前
|
缓存 前端开发 JavaScript
10 种方案提升你 React 应用的性能
本文首发于微信公众号「前端徐徐」,作者徐徐分享了提升 React 应用性能的方法。文章详细介绍了 `useMemo`、虚拟化长列表、`React.PureComponent`、缓存函数、使用 Reselect、Web Worker、懒加载、`React.memo`、`useCallback` 和 `shouldComponentUpdate` 等技术,通过实际案例和代码示例展示了如何优化 React 应用的性能。这些方法不仅减少了不必要的重新渲染和计算,还提升了应用的响应速度和用户体验。
20 0
|
2月前
|
开发框架 Dart 前端开发
Android 跨平台方案对比之Flutter 和 React Native
本文对比了 Flutter 和 React Native 这两个跨平台移动应用开发框架。Flutter 使用 Dart 语言,提供接近原生的性能和丰富的组件库;React Native 则基于 JavaScript,具备庞大的社区支持和灵活性。两者各有优势,选择时需考虑团队技能和项目需求。
362 8
|
2月前
|
前端开发 JavaScript
react学习(21)受控组件
react学习(21)受控组件
|
1月前
|
移动开发 JSON 数据可视化
精选八款包括可视化CMS,jquery可视化表单,vue可视化拖拉,react可视化源码
精选八款包括可视化CMS,jquery可视化表单,vue可视化拖拉,react可视化源码
50 0
|
2月前
|
前端开发 JavaScript
react学习(20)非受控组件
react学习(20)非受控组件