React拓展1-setState更新状态的2种写法

本文深入解析React中的setState方法,包括对象式和函数式的用法,以及其同步与异步特性。讲解了setState如何触发组件重渲染,并通过diff算法实现高效更新。同时,讨论了在何时使用回调函数来获取更新后的状态。总结了setState的最佳实践,强调了在状态依赖和获取最新状态时的注意事项。
摘要由CSDN通过智能技术生成

1、对象式的setState

setState(stateChange,[callback])

  1. stateChange 为状态改变的对象(该对象可以体现出状态的更改)
  2. callback 是可选的回调函数,它在状态更新完毕后,界面也更新后(render调用后)才被调用
import React, { Component } from 'react'

export default class Demo extends Compontent {
    //初始化状态
	state = { count: 0 }
    //绑定方法
	add = () => {
		// 1.获取count值
		const {count} = this.state
		// 2.更新状态(setState是同步的方法,但是引起更新的状态却是异步的)
		this.setState({count: count+1}, ()=>{
			console.log('render调用后调用:', this.state.count)	// render调用后调用:1
		})
		console.log('输出其实是更新前的值:', this.state.count)	// 输出其实是更新前的值:0
	}
    //渲染组件
	render () {
		return (
			<div>
				<h3>当前值为: {this.state.count}</h3>
				<button onClink={this.add}>+1</button>
			</div>
		)
	}
}

注意:

  1. setState是同步的方法,但是引起更新的状态却是异步的
  2. 如果要查看变化后的状态,可以使用callback函数(可选),是在状态更新完毕、界面也更新后(render调用后)才被调用。

2、函数式的setState

setState(updater,[callback])

  1. updater 为返回 stateChange 对象的函数
  2. updater 可以接受到 stateprops
  3. callback 是可选的回调函数,它在状态更新完毕后,界面也更新后(render调用后)才被调用
import React, { Component } from 'react'

export default class Demo extends Compontent {
	state = { count: 0 }
	add = () => {
		// 函数式
		this.setState(state => ({count: state.count+1}) )
	}
	render () {
		return (
			<div>
				<h3>当前值为: {this.state.count}</h3>
				<button onClink={this.add}>+1</button>
			</div>
		)
	}
}

总结

  1. 对象式setState是函数式setState的简写方式(语法糖)
  2. 使用原则:

(1).如果新状态不依赖与原状态 ===> 使用对象方式
(2).如果新状态依赖与原状态(需要用到state) ===> 使用函数方式
(3).如果需要在 setState() 执行后获取最新的状态数据,要在callback函数中读取

相关面试题:

# 调用setState之后,发生了什么?
  • 代码中调用 setState 函数之后,React 会将传入的参数对象与组件当前的状态合并,然后触发所谓的调和过程(Reconciliation)。
  • 经过调和过程,React 会以相对高效的方式根据新的状态构建 React 元素树并且着手重新渲染整个 UI 界面;
  • 在 React 得到元素树之后,React 会自动计算出新的树与老树的节点差异(用diff算法),然后根据差异对界面进行最小化重渲染;(diff算法使React 能够相对精确地知道哪些位置发生了改变以及应该如何改变,这就保证了按需更新,而不是全部重新渲染。
# React中的setState是同步执行还是异步执行?如果是异步的?怎么拿到执行后的state?
  • setState 并不能保证是同步的,在生命周期函数和合成事件中是异步的,在原生事件和 setTimeout 中是同步的。
# 为什么建议传递给setState函数的参数是回调函数而不是对象?
  • 因为 this.props 和 this.state 的更新可能是异步的,不能依赖它们的值去计算下一个 state。
# 传入setState函数的第二个参数的作用是什么
  • 该函数会在setState函数调用完成并且组件开始重渲染的时候被调用,我们可以用该函数来监听渲染是否完成。
React Native中可以使用第三方库`react-native-scrollable-tab-view`来实现滑动标题栏。以下是一个简单的示例代码: ```tsx import * as React from 'react'; import { StyleSheet, Text, View } from 'react-native'; import ScrollableTabView, { DefaultTabBar } from 'react-native-scrollable-tab-view'; type Props = {}; const FirstTabScreen = () => { return ( <View style={styles.container}> <Text>First Tab</Text> </View> ); }; const SecondTabScreen = () => { return ( <View style={styles.container}> <Text>Second Tab</Text> </View> ); }; const ScrollableTabNavigator = (props: Props) => { return ( <ScrollableTabView renderTabBar={() => <DefaultTabBar />} tabBarUnderlineStyle={styles.tabBarUnderline} tabBarBackgroundColor="#FFFFFF" tabBarActiveTextColor="#000000" tabBarInactiveTextColor="#999999" > <FirstTabScreen tabLabel="Tab 1" /> <SecondTabScreen tabLabel="Tab 2" /> </ScrollableTabView> ); }; export default ScrollableTabNavigator; const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center', }, tabBarUnderline: { backgroundColor: '#000000', height: 2, }, }); ``` 在这个示例中,我们首先导入了`react-native-scrollable-tab-view`库中的`ScrollableTabView`和`DefaultTabBar`组件。然后,我们创建了两个Tab项组件`FirstTabScreen`和`SecondTabScreen`,每个组件中都有一个`tabLabel`属性,用于设置Tab的标签。最后,我们使用`ScrollableTabView`组件来包含Tab项,并设置了一些Tab导航的样式属性,例如`tabBarUnderlineStyle`、`tabBarBackgroundColor`、`tabBarActiveTextColor`和`tabBarInactiveTextColor`。在`renderTabBar`属性中,我们使用了`DefaultTabBar`组件来渲染Tab导航栏。 注意:`react-native-scrollable-tab-view`库已经很久没有更新了,建议使用`react-native-tab-view`等其他替代库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值