返回

封装非受控状态:对比 arco-design:useMergeValue 与 ahooks:useControllableValue 实现

前端

在 React 中,受控状态和非受控状态都是常见的状态管理模式。受控状态是指组件通过内部状态来控制表单元素的值,而非受控状态是指组件通过外部属性来控制表单元素的值。

当我们需要在 React 中封装一个非受控状态时,可以使用 arco-design:useMergeValue 和 ahooks:useControllableValue 这两个库。这两个库都提供了简单易用的 API 来实现非受控状态的封装。

useMergeValue

useMergeValue 是 arco-design 提供的一个 Hook,用于封装非受控状态。其基本用法如下:

const [value, setValue] = useMergeValue('');

其中,value 是非受控状态的值,setValue 是设置非受控状态值的函数。

useMergeValue 的优点在于简单易用,并且支持受控和非受控状态的混合使用。

const [value, setValue] = useMergeValue('');

const handleChange = (e) => {
  setValue(e.target.value);
};

return (
  <input value={value} onChange={handleChange} />
);

在这个例子中,当用户输入时,handleChange 函数会调用 setValue 函数来更新非受控状态的值。

useControllableValue

useControllableValue 是 ahooks 提供的一个 Hook,用于封装非受控状态。其基本用法如下:

const [value, setValue, isControlled] = useControllableValue('', props.value);

其中,value 是非受控状态的值,setValue 是设置非受控状态值的函数,isControlled 是一个布尔值,表示状态是否被控制。

useControllableValue 的优点在于可以同时支持受控和非受控状态,并且可以方便地检测状态是否被控制。

const [value, setValue, isControlled] = useControllableValue('', props.value);

const handleChange = (e) => {
  setValue(e.target.value);
};

return (
  <input value={value} onChange={isControlled ? null : handleChange} />
);

在这个例子中,当状态被控制时,handleChange 函数不会被调用,否则handleChange 函数会被调用来更新非受控状态的值。

对比

useMergeValue 和 useControllableValue 都是封装非受控状态的不错选择。它们都具有以下优点:

  • 简单易用
  • 支持受控和非受控状态的混合使用

但是,它们也有一些区别。useMergeValue 的优点在于简单易用,并且可以更方便地处理受控和非受控状态的混合使用。而 useControllableValue 的优点在于可以同时支持受控和非受控状态,并且可以方便地检测状态是否被控制。

总结

useMergeValue 和 useControllableValue 都是封装非受控状态的不错选择。在选择时,我们可以根据自己的需求来选择合适的库。