pureComponent导致的setState数据变化后不更新

以下是一个racct-native代码示例,展示 PureComponent 的检查导致的数据更新后,一直不触发render的现象

  • 首先,我们都知道,PureComponent 其实就是帮我们做了shouldComponentUpdate生命周期里的逻辑-->【浅比较】
  • 其次,PureComponent 重写的SCU(shouldComponentUpdate)其实就是shallow equal 两类:(1)state和nextState(2)prop和nextProps。
  • 再者,一旦shouldComponentUpdate返回false,那就一定不会触发render()
  • 原因,shouldComponentUpdate是执行于render之前的
/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 *
 * @format
 * @flow
 */

import React, { Component, PureComponent } from 'react'
import { Text, View} from 'react-native'

type Props = {}
export default class App extends PureComponent<Props> {
	constructor(props) {
		super(props)
		this.togglePic = this.togglePic.bind(this)
		this.stopToggle = this.stopToggle.bind(this)
		this.timer
		this.state = {
			index: 0,
		}
	}
	componentDidMount() {
		this.togglePic()
	}
	componentWillUnMount() {
		this.stopToggle()
	}
	// shouldComponentUpdate(nextProps, nextState) {
	// 	console.log('nextProps, nextState', nextProps, nextState)
	// 	return false
	// }
	togglePic() {
		this.timer = setInterval(() => {
			console.log(111)
			this.setState((preState, currentProps) => {
                // 下面这条指令会导致preState的值被改变,相当于先赋值给了preState再赋值给                    nextIndex
				let nextIndex = ++preState.index
                // 正确做法
                // let nextIndex = preState.index + 1 
				return { index: nextIndex }
			})
			// this.setState({ index: this.state.index + 1 })
		}, 1000)
	}
	stopToggle() {
		clearInterval(this.timer)
	}

	render() {
		console.log(222)
		return (
			<View>
				<Text>{this.state.index}</Text>
			</View>
		)
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hzxOnlineOk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值