0

没看过源码,网上说state应该是一个plain object.
可以把state设为一个数组吗 即this.state=[]

如果可以,那么setstate如何做.我尝试过[0]:
结果返回state是一个object
求解

Liuyl 46
7月12日提问

查看全部 2 个回答

1

已采纳

state本身一般会初始为一个object,而且setState时也是对象浅拷贝

对于setState之后,原本的Array类型变成了对象类型,则需要你理解setState是怎么运行的。setState的原理可以简化(注意是简化后的)为:

function Component(props) {
  this.props = props
}
Component.prototype.setState = function(partialState) {
  this.state = Object.assign({}, this.state, partialState)
}

也就说setState最终就是使用Object.assign浅拷贝生成一个新的‘对象’。所以不管最开始是Array和还是Map类型,都会被改为object类型:

> Object.assign({}, [], {a: '1'})
{ a: '1' }
> Object.assign({}, new Map(), {a: '1'})
{ a: '1' }

再回到题目上,题主将state作为Map或Array使用是一种错误的用法。React设计State的初衷是想你把它当成一个哈希表来用,这样的好处就是可以随时扩展出新的状态。比如现在你的组件要新增一个a属性,如果你现有的state是Array类型,那么组件的结构都要重新修改了

React Hooks出来后,推荐你使用useState,这个更接近于‘变量赋值’。

如果你想简单了解React的基本原理,可以看这篇文章

1

答案已更新

荒山 · 7月13日

展开评论

推广链接