React忽略的小问题操作state
Posted 曹豆芽
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了React忽略的小问题操作state相关的知识,希望对你有一定的参考价值。
昨天有个小伙伴问豆芽一个问题,他用react做了一个静态的留言版的功能,但是一直在报错,但是这个错误提示的地方是对的。让我看看,先贴代码。
import React from 'react'
class App extends React.Component
state =
txt: '',
txtarea: '',
cid: 0,
datalist: [
id: 1, name: "张三", text: "13112ada"
]
HandleChange = e =>
let target = e.target
// 判断表单类型
let value = target.type === 'checkbox' ? target.checked : target.value
let name = target.name
this.setState(
[name]: value
)
console.log(this.state);
// 添加留言
adddata = () =>
this.setState(
cid: this.state.cid + 1
)
let list =
id: this.state.cid + 1,
name: this.state.txt,
text: this.state.txtarea
this.setState(
datalist: this.state.datalist.push(list)
)
console.log(this.state.datalist)
// 渲染评论列表
renderList()
let datalist = this.state
console.log(datalist)
console.log(this.state.datalist)
if (datalist.length === 0)
return <div>暂无评论,快去评论吧</div>
else
return (
<ul>
this.state.datalist.map((item,index) => (
<li key=index>姓名:item.name :item.text</li>
))
</ul>
)
render()
return (
<div className="app">
<input type="text" placeholder="请输入评价人" name="txt" onChange=this.HandleChange />
<textarea onChange=this.HandleChange name="txtarea" >
</textarea><br />
<button onClick=this.adddata>添加</button>
this.renderList()
</div>
)
export default App;
点击之后就会报错
豆芽刚看的时候也是感觉好像是没有什么问题的,但是仔细发现了这个小伙伴存在的问题
他直接讲state的数据进行了改变,直接操作了。
直接修改state会导致state不可预期,不推荐直接修改原始数据。 如果要改变或更改数据,则必须复制数据副本来更改。那么我们复制原始数据进行操作。
adddata = () =>
this.setState(
cid: this.state.cid + 1
)
let list =
id: this.state.cid + 1,
name: this.state.txt,
text: this.state.txtarea
let data = this.state.datalist
data.push(list)
this.setState(
datalist: data
)
当我们复制了state数据,再去修改的时候,就不会出现上面的问题了,欢迎大家一起交流学习。
以上是关于React忽略的小问题操作state的主要内容,如果未能解决你的问题,请参考以下文章