shouldComponentUpdate 函数 判断是否渲染,forceUpdate 函数 强制渲染

shouldComponentUpdate 函数原型

boolean shouldComponentUpdate(nextProps, nextState)

当 React Native 决定是否重新渲染组件时,会先调用 shouldComponentUpdate 函数,如果返回值为 false 则不会重新渲染组件

如下例

shouldComponentUpdate() {
        if (this.state.inputedNum.length <= 3) {
            console.log("false !!!");
            console.log('length = ', this.state.inputedNum.length);
            return false;
        }
        console.log("true !!!");
        console.log('length = ', this.state.inputedNum.length);
        return true;
    }

如果你够细心,可以发现上例中,添加数字时,this.state.inputedNum.length 比实际小1,删减数字时,this.state.inputedNum.length 比实际大1。但是,在后边 render 函数中 >Text> 您输入的手机号的长度:{this.state.inputedNum.length} >/Text> 调用时,显示的正确。

这里写图片描述

这里写图片描述

按一下删除按钮,删除一个数字

这里写图片描述

这里写图片描述

好家伙 shouldComponentUpdate 里的 length 跑慢了一步

import React, {Component} from 'react';
import {
    Platform,
    StyleSheet,
    View,
    Text,
    TextInput,
    PixelRatio,
} from 'react-native';

const instructions = Platform.select({
    ios: 'Press Cmd+R to reload,\n' +
    'Cmd+D or shake for dev menu',
    android: 'Double tap R on your keyboard to reload,\n' +
    'Shake or press menu button for dev menu',
});

export default class App extends Component {

    constructor(props) {
        super(props);

        this.state = {
            inputedNum: '',//写法1
        };
    }

    updateNum(newText) {//写法1
        this.setState((state) => {
            return {
                inputedNum: newText
            };
        });
    }

    shouldComponentUpdate() {
        if (this.state.inputedNum.length <= 3) {
            console.log("false !!!");
            console.log('length = ', this.state.inputedNum.length);
            return false;
        }
        console.log("true !!!");
        console.log('length = ', this.state.inputedNum.length);
        return true;
    }

    render() {

        return (
            <View style={styles.container}>
                {/*写法1*/}
                <TextInput placeholder={'请输入账号'} onChangeText={(newText) => this.updateNum(newText)}/>
                <Text>您输入的手机号:{this.state.inputedNum}</Text>
                <Text>您输入的手机号的长度:{this.state.inputedNum.length}</Text>
            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
    }
});

forceUpdate 函数原型(开发者应该尽可能避免使用此函数

forceUpdate(callback)

调用 forceUpdate 函数的话,将不会调用 shouldComponentUpdate 来检查是否允许重新渲染

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值