为什么useState返回的是数组而不是对象?

简介: 为什么useState返回的是数组而不是对象?

useState 的用法:

const [count, setCount] = useState(0)

可以看到 useState 返回的是一个数组,那么为什么是返回数组而不是返回对象呢?

要回答这个问题得弄明白 ES6 的解构赋值(destructring assignment)语法

下面有2 个简单的示例:

  • 数组的解构赋值:
const foo = ['one', 'two', 'three'];
const [red, yellow, green] = foo;
console.log(red); // "one"
console.log(yellow); // "two"
console.log(green); // "three"
  • 对象的解构赋值:
const user = {
    id: 42,
    is_verified: true
};
const { id, is_verified } = user;
console.log(id); // 42
console.log(is_verified); // true 

搞清楚了解构赋值,那上面的问题就比较好解释了

如果 useState 返回数组,那么可以顺便对数组中的变量命名,代码看起来也比较干净

而如果是对象的话返回的值必须和 useState 内部实现返回的对象同名,

这样只能在 function component 中使用一次,想要多次使用 useState 必须得重命名返回值。

// 第一次使用
const { state, setState } = useState(false)
// 第二次使用
const { state: counter, setState: setCounter} = useState(0)

当然事情总是有两面性的,使用 array 也存在一些问题:

  • 返回值强顺序,灵活性比较低。array[0] 为值,array[1] 为改变值的方法。
  • 返回的值基本都得使用,对于有些返回值不想使用的话代码看起来有些怪,比如只想用 setState,就得这么写:const [, setState] = useState(false)
  • 返回的参数不能太多,否则处理上面 2 个场景会很麻烦。

如果在自定义的Hook中遇到了以上几个问题,不妨试试返回 object。

简单总结一下,在自定义 hook 的时候可以遵循一个简单原则:

当参数大于 2 个的时候返回值的类型返回 object, 否则返回数组。

相关文章
lodash判断对象的属性是否存在
lodash判断对象的属性是否存在
594 0
|
5月前
|
JavaScript 前端开发 索引
JS遍历数组里数组下的对象,根据数组中对象的某些值,组合成新的数组对象
这篇文章介绍了如何在JavaScript中遍历数组里数组下的对象,并根据对象的某些属性值组合成一个新的数组对象。主要内容包括使用ES6的`for...of`循环来遍历数组对象,然后根据需要提取对象中的属性值,并将它们放入新的对象中,最终形成一个新的对象数组以供使用。
|
6月前
|
JavaScript
js 数组移除指定元素【函数封装】(含对象数组移除指定元素)
js 数组移除指定元素【函数封装】(含对象数组移除指定元素)
49 0
|
8月前
|
JSON 前端开发 Java
如何优雅的将对象数组返回给前端?
如何优雅的将对象数组返回给前端?
|
8月前
|
前端开发
useEffect 的第二个参数, 传空数组和传依赖数组有什么区别?
在 React 的 useEffect 钩子函数中,第二个参数用于指定依赖项数组。这个参数可以影响 useEffect 的触发时机和频率。在 React 的 useEffect 钩子函数中,第二个参数用于指定依赖项数组。这个参数可以影响 useEffect 的触发时机和频率。
218 0
|
JSON JavaScript 数据处理
vue+element 返回数组或json数据自定义某列显示的处理--两种方法
本文是作者开发一个业务需求时,将返回数据列表的其中一个数据长度很长的字段处理成数组,并将其作为子表显示的过程,具体样式如下(数据做了马赛克处理) ![请在此添加图片描述](https://developer-private-1258344699.cos.ap-guangzhou.myqcloud.com/column/article/5877188/20231030-902560ce.png?x-cos-security-token=v61lCvRHgTvmeijokvUBGGxbT01lDU8ac78083fc31c5e3a734833edd862768549WL7GvROHQNGkc9F
157 0
vue+element 返回数组或json数据自定义某列显示的处理--两种方法
|
JavaScript 前端开发
js获取两个数组及数组对象中相同和不相同的值
js获取两个数组及数组对象中相同和不相同的值
|
JavaScript 前端开发
js判断一个对象是否在一个对象数组中
js判断一个对象是否在一个对象数组中
js判断一个对象是否在一个对象数组中
|
JavaScript
js判断数组中对象是否存在某个值
js判断数组中对象是否存在某个值
165 0