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 setState注意事项

TextInput 忽略 React Native 上的双击(句点)