最近在折腾一个 AIGC 相关的后台管理项目,其中最让人头疼的就是"AI 生成参数控制台"。
不知道你有没有写过类似的页面:一个面板上塞满了各种滑块和输入框,比如Temperature(温度)、Top-P、Frequency Penalty(重复惩罚)。最要命的是,这些参数不是独立的,它们之间有着复杂的联动关系。比如,修改了Temperature,可能不仅要更新界面,还要同步到本地缓存(localStorage),甚至触发其他派生状态(比如"创意指数")的重新计算。
如果全用 React 原生的useState和useEffect,用不了多久,代码里就会充斥着各种互相触发的 Effect,不仅性能拉胯,排查 Bug 更是火葬场。
今天我们就来聊聊,如何借助状态管理界的两大神器——Recoil和Jotai,用优雅的原子机制(Atom)把这种复杂的参数面板梳理得服服帖帖。
方案一:Recoil —— 稳扎稳打的"正规军"
Recoil 是 Meta(前 Facebook)推出的状态管理库。它的核心概念非常清晰:Atom(原子)代表状态,Selector(选择器)代表派生状态。
在我们的参数面板场景中,Recoil 的优势在于它对副作用(Effects)和复杂双向绑定的支持非常成熟。
1. 基础原子与副作用
在 Recoil 中,我们可以给 Atom 定义effects。比如,当temperature改变时,我们不仅要更新状态,还要自动把它写入localStorage,同时做一次范围校验。
import{atom,selector}from'recoil';// 定义 Temperature 原子consttemperatureAtom=atom({key:'temperature',default:0.7,effects:[// 1. 持久化:组件卸载或值改变时同步到本地({onSet})=>{onSet(newValue=>{localStorage.setItem('ink-temperature',JSON.stringify(newValue));});},// 2. 校验:如果输入值不合法,给出警告({onSet})=>{onSet(newValue=>{if(newValue<0||newValue>2){console.warn('温度参数应该在 0 到 2 之间哦');}});