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

为什么useState的返回值是数组?为什么不能是对象呢?

在搞清楚这个问题之前,首先来看下数组解构和对象解构做一个了解。

数组解构:
    const [a,b,c]=[1,2,3]
复制代码

这里数组通过解构给变量a,b,c分别赋值,这里的变量a,b,c,也可以命名为d,e,f。

对象解构
const obj = {
    name: 'haha',
    age: '1'
}
const { name, age } = obj;
复制代码

上面的例子name和age经过结构被赋值,它们的次序是可以被改变的,写成const { age, name } = obj也是完全没问题的。

不难发现,解构不仅可以用于数组,还可以用于对象,对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定,比如上面的a对应的就是数组的第一项1;而对象的属性没有次序;数组解构时的变量可以是任意名称,不会影响它的取值,而对象解构的变量必须与属性同名,才能取到正确的值。

到这里就很好解释useState的返回值为什么是数组,不是对象了。

const [state, setState] = useState(null);
const [state2, setState2] = useState(null);
复制代码

试想一下,如果useState返回的是对象,代码会变成这样:

const {state, setState} = useState(null);
const {state:state2, setState:setState2} = useState(null);
复制代码

很明显,如果代码块中多次使用useState,对象得重命名才能获取返回值,相比之下数组显得代码更加简洁。

但是数组也有它的不足之处:

  • 返回值必须按顺序取。
  • 返回的参数较多,又不是所有的返回值都需要的情况下,写法会比较奇怪。如只使用setState时const [, setState] = useState(null)

所以在写自定义Hook时,返回值如果很多的情况下,觉得使用对象会更合理一些。**

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享