ReactNative從零到完整項(xiàng)目-state使用詳解

項(xiàng)目連接: 93Laer/MyDemo

前言:在安卓中我們可以通過自定義一個(gè)屬性例如一個(gè)Boolean來標(biāo)識(shí)是否刷新數(shù)據(jù)更新視圖,但是在RN中props一經(jīng)指定在生命周期類是不會(huì)再發(fā)生變化的,所以我們要達(dá)到和安卓一樣的效果是不能通過props來做的,RN專門為我們提供了state這個(gè)字段

state: 是RN 專門用來標(biāo)識(shí)是否重新渲染,通過屬性的值來更新數(shù)據(jù),React 內(nèi)部會(huì)監(jiān)聽 state 的變化,一旦發(fā)生變化就會(huì)主動(dòng)觸發(fā)組件的 render() 方法來更新 Dom 結(jié)構(gòu),另外state是組件私有的,是沒有辦法通過其他組件傳遞過來的。

state的使用:

  • 1、構(gòu)造器外面
export default class StateTest extends Component {

//方式一
        state = {
            num: 0
        }


    // 構(gòu)造
    constructor(props) {
        super(props);
        // 每1000毫秒對(duì)num+1
        setInterval(() => {
            this.setState(previousState => {
                return {num: ++this.state.num};
            });
        }, 1000);
    }

    render() {
        var msg = this.state.num
        return (
            <Text size={32} color= {'red'}>{msg}</Text>
        );
    }
}
  • 2、方式二構(gòu)造器內(nèi)(建議這樣)

    // 構(gòu)造
    constructor(props) {
        super(props);

//方式二
        this.state = {
            num: 0
        }

        // 每1000毫秒對(duì)num+1
        setInterval(() => {
            this.setState(previousState => {
                return {num: ++this.state.num};
            });
        }, 1000);
    }

 // 每1000毫秒對(duì)num+1
        setInterval(() => {
            //這種方式修改state是無效的,必須調(diào)用setState()才能起作用
            //this.state= ++this.state.num;

            //this.setState(previousState => {
            //    return {num: ++this.state.num};
            //});
            //也可以這樣寫,這樣寫也就可以直接拿到props,有可能我們的業(yè)務(wù)需要用到props
            this.setState((prevState, props) =>{
                return {num: ++this.state.num};
            } );
        }, 1000);

prevState 是一個(gè)對(duì)之前狀態(tài)(previous state)的引用,我們是不能直接修改這個(gè)參數(shù)的值,要想修改 state 的值,我們應(yīng)該根據(jù) prevState 和 props 參數(shù)來創(chuàng)建一個(gè)新的 JavaScript 對(duì)象,例如:return {num: ++this.state.num};。

既然 我們要?jiǎng)?chuàng)建一個(gè)JavaScript對(duì)象,上面我們是通過一個(gè)函數(shù)來創(chuàng)建的,當(dāng)然我們可以直接傳入一個(gè)對(duì)象,而不是一個(gè)函數(shù),例如:

this.setState({num: 18});

但是我們一般應(yīng)該不會(huì)這樣寫,畢竟我們在改變視圖的時(shí)候肯定會(huì)有一些邏輯需要處理

特別提示:作為一個(gè)安卓開發(fā),我們第一反應(yīng)要改變state,可能是以以下方式來處理的

  // 每1000毫秒對(duì)num+1
        setInterval(() => {
            //這種方式修改state是無效的,必須調(diào)用setState()才能起作用
            this.state= ++this.state.num;

            //this.setState(previousState => {
            //    return {num: ++this.state.num};
            //});
        }, 1000);

說明:setState() 方法會(huì)把對(duì)組件 state 的改變加入到隊(duì)列中,并且告訴 React 這個(gè)組件及其子組件需要重新渲染,React 并不能保證 setState() 一被調(diào)用 state 就能更新。所以,如果在調(diào)用 setState() 之后,馬上就讀取 this.state 的值的話,可能會(huì)出現(xiàn)誤差,所以setState(updater, callback) 方法的第二個(gè)參數(shù) callback 是一個(gè)可選參數(shù),暫時(shí)未找到使用實(shí)例。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容