登录 注册写文章
首页下载APP
组件状态 setState()
纯情小肥羊关注赞赏支持组件状态 setState()
这里指的是class组件,因为function组件无状态
类组件中的状态管
class组件使 state和setState维护状态
setState({})
- setState 新状态 能直接修改
this.state.counter += 1; //错误的
- setState是批量执行的,因此对同一个状态执行多次只起一次作 ,多个状态更新可以放在同一个setState中进 :
componentDidMount() {
// 假如couter初始值为0,执 多次以后其结果是多少?
this.setState({counter: this.state.counter + 1});
this.setState({counter: this.state.counter + 2});
}
setState的执行是合并操作,所以最后一个起作用.
- setState通常是异步的,因此如果要获取到最新状态值有以 下三种 式:
- 传递函数给setState 法,
this.setState(nextState => ({ counter: nextState.counter + 1}));// 1 this.setState(nextState => ({ counter: nextState.counter + 1}));// 2 this.setState(nextState => ({ counter: nextState.counter + 1}));// 3 - 使用定时器:
setTimeout(() => { this.changeValue(); console.log(this.state.counter); }, 0); - 原 事件中修改状态
componentDidMount(){ document.body.addEventListener('click', this.changeValue, false) } changeValue = () => { this.setState({counter: this.state.counter+1}) console.log(this.state.counter) }
- 传递函数给setState 法,
总结: setState只有在合成事件和生命周期函数中是异步的,在原生事件和setTimeout中都是同步的,这里的异步其实是批量更新。
setState()如何输出1 2 3
this.state = {
counter: 0
};
//最后输出多少
this.setState(
{
counter: this.state.counter + 1
},
() => console.log(this.state.counter)// 1
);
this.setState(
{
counter: this.state.counter + 1
},
() => console.log(this.state.counter)// 1
);
this.setState(
{
counter: this.state.counter + 1
},
() => console.log(this.state.counter)// 1
);
解析: 输出三个1, 这个是因为this.setState()的第一个参数是异步执行(批量执行),所以回调函数会在所有的值修改完毕后才执行.
this.setState(
nextState => ({ counter: nextState.counter + 1 }),
() => console.log(this.state.counter)
); // 3
this.setState(
nextState => ({ counter: nextState.counter + 1 }),
() => console.log(this.state.counter)
); // 3
this.setState(
nextState => ({ counter: nextState.counter + 1 }),
() => console.log(this.state.counter)
); // 3
很不幸 这里输出三个3
this.setState(
nextState => {
console.log(nextState.counter); // 0
return { counter: nextState.counter + 1 };
},
() => console.log(this.state.counter) // 3
);
this.setState(
nextState => {
console.log(nextState.counter); // 1
return { counter: nextState.counter + 1 };
},
() => console.log(this.state.counter) // 3
);
this.setState(
nextState => {
console.log(nextState.counter); //2
return { counter: nextState.counter + 1 };
},
() => console.log(this.state.counter) // 3
);
这里输出结果是, 012333 表明修改同一个状态下无论第一个参数是对象还是函数它都是先执行的,并且是批量(异步的),最后才会执行回调函数.
推荐阅读更多精彩内容
- 第二章 设计高质量的React组件 作为一个合格的开发者,不要只满足于编写了可以运行的代码。而要了解代码背后的工作原理;不要只满足于自己的程序... 六个周阅读 3,892评论 0 赞 26
- React 核心API 起步 安装官方脚手架: npm install -g create-react-app 创建项目: create-... Twoold阅读 54评论 0 赞 0
- 深入理解React 组件状态(State) React 的核心思想是组件化的思想,应用由组件搭建而成,而组件中最重要的概念是State(状态),State是一... 艾特老干部阅读 33,510评论 23 赞 58
- 深入理解React 组件状态(State) React 的核心思想是组件化的思想,应用由组件搭建而成,而组件中最重要的概念是State(状态),State是一... sunnyghx阅读 464评论 0 赞 2
- React入门教程(4)React的组件状态及事件处理 React组件的状态state 我们可以通过this.props获取一个组件的属性,另外还可以通过this.sta... IT老马阅读 256评论 0 赞 0