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的主要内容,如果未能解决你的问题,请参考以下文章

React忽略的小问题操作state

React忽略的小问题操作state

React之小知识点总结

React快速调试的小技巧:直接在组件上输出props/state

忽略导航()调用

极智开发 | 讲解 React 组件三大属性之一:state