为什么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