setState的回调

Posted on   猫头唔食鱼  阅读(1133)  评论(0编辑  收藏  举报

setState是异步的

如果想操作dom一定要在setState的回调里

例子:

获得ul里li元素的个数

复制代码
import React, { Component } from 'react';
class Test extends Component {
    constructor(props) {
        super(props);
        this.state = { 
            list:[1,2,3],
            inputValue:''
         }
    }
    handleChange=(e)=>{
         
        this.setState({
            inputValue:e.target.value
        })
    }

    handleAdd =()=>{
        let newList = [...this.state.list]
        this.setState({
            list:[...newList,this.state.inputValue],
            inputValue:''
        },()=>{
            // 获取li的个数
            let ul = document.querySelectorAll('ul')
            let childNodes = [...ul][0].childNodes
            console.log(childNodes.length);
        })
      

        // 获取li的个数 (错误方法,不应该写在这里,而是写在setState的回调里,因为setState是异步的)
        let ul = document.querySelectorAll('ul')
        let childNodes = [...ul][0].childNodes
        console.log(childNodes.length);
        
        
        
        
    }
    render() { 
        return (  
            <div>
                <input  value={this.state.inputValue} onChange={this.handleChange} />
                <button onClick={this.handleAdd}>添加</button>
                <ul ref={ul=>this.ul=ul}>
                  {
                        this.state.list.map((v,i)=>{
                          return   <li key={i}>{v}</li>
                      })
                  }
                </ul>
            </div>
        );
    }
}
 
export default Test;
复制代码

 

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示