从react-final-form迁移到react-hook-form

我是株式會社H Team Commerce Tech的kazz。

很高兴跟大家分享一下关于从 React 表单库 react-final-form 迁移到 react-hook-form 的开发实践经验。我会结合自己的实际体验轻松地和大家聊一下。

为什么要进行转型?

为了使表单开发更容易,我一直在使用react-final-form进行开发。但在一年半的反复改进中,我注意到了react-final-form中以下的几点问题。

    • 不具合が多く、かつ中々対応されない

 

    • 直近のcommit・リリースが少ない

 

    比較的、ドキュメントが不充実

总的来说,由于维护工作不足,出现了各种不便。因此,在一次大规模改修的契机下,我们决定转向使用 react-hook-form。

挂钩型表单的选择

由于hook-form在系统中满足所需的功能要求,并且在执行性能方面,捆绑大小略有减少,且非受控组件可以轻松地抑制重新渲染,因此也可以预期性能改善。

react-final-form + final-formreact-hook-form(formik)bundled size (minified)25.8kB25.1kB44.3kBcontrol制御コンポーネント非制御コンポーネント制御コンポーネントメンテナンス1年で4commitsたくさんほぼなしドキュメント(主観)見ずらい見やすい見やすい

过渡工作

1. 组件的重建

发现常规化组件和处理对 final-form 有很强的依赖。原本计划逐个修复相关的表单,但现在需要重新构建共通部分。

在这个阶段,我们实施了可以在新目录中使用的 hook-form 组件的实现。同时,我们还在推进表单和UI的解耦。

这个。 (Zhè ge.)

// こんな感じで、外枠から final-form に依存している
import { Field } from 'react-final-form';
...
const InputText = () => {
    return <Field>...</Field>
}

通过将UI和表单分开来实现,使得处理过程更加清晰,同时也使得公共部分和表单之间达到了低耦合。

import { useController } from 'react-hook-form';

// 純粋なUIコンポーネント
const InputText = ({onChange, onBlur, ref, ...}) => {
    return <input onChange={onChange} onBlur={onBlur} ref={ref} />
}

// formに関わる処理をラップしたコンポーネント
const InputTextForHookForm = ({control, registerName, ...rest}: {control: Control, control: string ...}) => {
    const { field } = useController({ control, name: registerName});
    return <InputText {...field} />
}

只要将事件处理程序和引用正确地传递到末端,hook-form库的功能就可以被充分利用,所以从这个角度来看,这种形式和UI的松耦合化是相对容易的。

2. 对form部分进行重新构建

这个没有一致的计划,我们打算每次改修都进行替换。

最初我对非受控组件的处理感到不习惯,但是通过利用像 useWatch 这样的API,我能够在所需部分进行重新渲染的同时减少渲染次数,因此使用起来非常方便。

我認為提前了解控制和非控制組件的區別是必要的。

3. 清理工作

在进行替换的过程中,一旦不再需要,就会删除现有的组件或删除库本身。由于final-form相对较大,因此请不要忘记执行此操作。

最后

由于故障和文件不易阅读的问题,我在开发过程中感到开发体验受到了很大影响,所以我对迁移工作感到非常高兴。

考虑到React和Next.js不断推出新功能的同时,由于维护不足而无法进行功能追踪,我们为了未来的发展着想,决定进行迁移。

如果对整体的流程有兴趣,我概括地解释了一下,但如果有关于各个项目更具体的要求,我想或许可以在另一篇文章中详细介绍一下。

下一次 Advent Calendar 的投稿是 @o93 大人的 “误差、模糊和不确定性”!

广告
将在 10 秒后关闭
bannerAds