这是我简单的react组件。我首先将rooms
的状态设为componentWillReceiveProps
,然后在submit
上也将rooms
的状态设为data
。
在提交时,我还通过从rooms
传递单个对象来进行api调用,当响应到来时,我从数据(但不是来自slice
)中对该对象进行了rooms
直到data
的长度等于 0 。
现在的问题是,当我从slice
开始data
时,它也slices
个rooms
元素。
class EditRoom extends Component {
constructor() {
super()
this.state = {
rooms: [],
data: []
}
}
componentWillMount() {
const { fetchRooms } = this.props
fetchRooms()
}
componentWillReceiveProps(np) {
const { rooms, setNick, setNickName } = np
if (this.props.rooms !== rooms) {
console.log('ppppppppppppp')
this.setState({ rooms })
}
if (setNick) {
const data = this.state.data
data.splice(0, 1)
this.setState({ data }, () => {
if (data.length === 0) {
console.log('pppp542545455453864')
} else {
const room = _.first(this.state.data)
setNickName(room)
}
})
}
}
handleInputChange(e, i) {
const { rooms } = this.state
rooms[i].nickname = e.target.value
this.setState({ rooms })
}
onSaveClick() {
const { setNickName } = this.props
this.setState({ data: this.state.rooms }, () => {
const room = _.first(this.state.data)
setNickName(room)
})
}
render() {
const { rooms } = this.state
return (
<div>
<main id="EditRoom">
{rooms &&
rooms.map((room, i) => {
return (
<div className="barcode-box" key={i} style={{ backgroundColor: this.getRandomColor(i) }}>
<div className="edit-room-name">
<input
type="text"
className="form-control"
style={{ color: '#ffffff' }}
name="cardNumber"
placeholder="Nickname"
value={_.get(room, 'nickname') || ''}
onChange={e => this.handleInputChange(e, i)}
/>
</div>
</div>
)
})}
</main>
</div>
)
}
}
我在这里想念什么?
谢谢!!!
答案 0 :(得分:1)
您 不应 直接修改this.state
,例如使用splice
之类的数组变异方法。取而代之的是,从this.state.data
子数组中复制一个副本,进行修改并将其传递给setState()
。
类似这样的东西:
const data = this.state.data.slice() // make a copy of data
data.splice(0, 1) // modify a copy
this.setState({ data }, ...) // pass to setState
[ 更新 ]解释为什么更改一个状态子数组会影响另一状态:
JS中的数组(作为所有对象)由 引用 传递。因此,如果您进行简单的分配,例如arr2 = arr1
,则splice
方法也将使原始数组发生变化。对于像您这样的嵌套数组(对象)也是如此。 data
子数组与rooms
一起存储在state
中。因此,变异数据也会影响rooms
子数组。