一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術(shù)及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - React - React 三大屬性之state的使用詳解

React 三大屬性之state的使用詳解

2022-03-02 16:26xiaoznz React

這篇文章主要介紹了React 三大屬性之state的使用詳解,幫助大家更好的理解和學習使用React,感興趣的朋友可以了解下

React中很多地方需要用到數(shù)據(jù),這在React中被叫做狀態(tài),我們需要一個專門管理狀態(tài)的方法,于是state相關(guān)的就誕生了。state應該被要求有兩個基本功能,一,能夠存儲一定的值,從而能被react使用,二,能夠再它改變的時候被React監(jiān)聽到并且重新渲染。這里分別介紹一下在類和函數(shù)組件中state的寫法:

類組件

?
1
2
3
4
5
6
7
8
9
10
class ClassComponent extends React.Component{
    constructor(props){
        super(props)
    } //可寫可不寫
    render(){
        return (
            //這里面可以寫jsx語法
        )
    }
}

setState我們一般用來改變狀態(tài),在里面可以直接傳一個要改變的對象,也可以傳一個回調(diào)函數(shù),注意,此時如果傳入的是對象的話,React只是做了一層淺拷貝,而不是深拷貝,所以此時如果對象中有其他對象進行了改變React無法知道進行渲染。這個方法本質(zhì)上是傳入了一個新的值,將原先的值進行了覆蓋,如果這個值跟原先的值一樣,那么React就不會進行渲染。

React為什么要這么麻煩,不能直接修改值?因為在React中,有一個概念叫做可變性。React通過setState中的狀態(tài)的改變知道哪些地方發(fā)生了,于是進行渲染,如果直接改變了state,React無法感知到,所以無法渲染。簡單來說,它沒有像vue一樣雙向數(shù)據(jù)綁定。

類組件中的constructor可寫可不寫,寫上這個構(gòu)造函數(shù)的作用主要有兩個:

  • 為了給this.state賦值對象來初始化內(nèi)部state的值
?
1
2
3
4
5
6
7
8
9
10
11
12
constructor(props){
    super(props)
    this.state = {n:12}
}
 
render(){
    return (
        <div>
                <h1>THE TIME IS {this.state.n}</h1>
        </div>
    )
}

注意這里不能寫setState,以上的方法React也可以在外面設(shè)定,即

?
1
2
3
4
5
6
7
8
9
state = {n:12}
 
render(){
    return (
        <div>
            <h1>THE TIME IS {this.state.n}</h1>
        </div>
    )
}
  • 為事件處理函數(shù)綁定實例
?
1
2
3
4
5
6
7
8
9
10
constructor(props){
    super(props)
    this.addNum = function(){fn()}.bind(this)
}
 
render(){
    return (
        <button onClick={this.addNum}>+1</button>
    )
}

但是這種方法在React中也有新的方法替代了,代碼如下:

?
1
2
3
4
5
6
7
8
9
addNum = ()=>{
    fn()
}
 
render(){
    return (
        <button onClick={this.addNum}>+1</button>
    )
}

所以上述的構(gòu)造函數(shù)繼承父類的方法根本沒有必要寫。

函數(shù)組件

?
1
2
3
4
5
6
7
import {useState} from "react"
function FunctionComponent(){
    const [data,setData] = useState("你要傳入的初始值")
    return (
        <div>SHOW DATA {state}</div>
    )
}

這里的setData的作用跟setState類似,但是它只能用來改變data的狀態(tài),需要改變的時候傳入一個回調(diào)函數(shù)。函數(shù)的參數(shù)是之前的值,返回一個要改變的值。這個方法本質(zhì)是需要傳入一個新的對象,來改變React之前對象的值。 對此還能簡便的直接寫改變的值,默認會對應到當前對象并且改變它的值
以上方法比原先的setState要簡便不少,但是麻煩的是如果有多個數(shù)據(jù),需要多次useState而不能一次性傳入多個值。不過大多數(shù)情況下,數(shù)據(jù)管理的問題都是交給Redux來管理的,所以并不需要React本身來操心

setState的坑

在改變React組件狀態(tài)的時候,經(jīng)常遇到的問題是setState的值合并。看如下問題:

?
1
2
3
4
5
this.addNum = function () {
            this.setState({num:this.state.num+1})
            this.setState({num:this.state.num+1})
            this.setState({num:this.state.num+1})
        }.bind(this)

此時當addNum函數(shù)被觸發(fā)的時候,num只加了1。并沒有像我們想象的加了3。 對此,React本身的解釋是

調(diào)用 setState 其實是異步的 —— 不要指望在調(diào)用 setState 之后,this.state 會立即映射為新的值

對此的解釋是:

  1. 無論調(diào)用多少次setState,都不會立即執(zhí)行更新。而是將要更新的state存入'_pendingStateQuene',將要更新的組件存入'dirtyComponent';
  2. 當根組件didMount后,批處理機制更新為false。此時再取出'_pendingStateQuene'和'dirtyComponent'中的state和組件進行合并更新;

簡單來說,就是React執(zhí)行時,為了提高性能,會把要更新的setState存入一個數(shù)組,當React本身的同步代碼執(zhí)行完畢,更新之前,將數(shù)組中的setState取出,然后進去渲染。上述代碼中,我們因為將同步代碼this.setState({num:this.state.num+1})加入了setState中,所以在批處理取出的時候,會產(chǎn)生合并,將眾多的setState合并為一句話,從而只改變了1。因為這個機制,所以讓setState像異步代碼,但是其實它是同步執(zhí)行的,此時我們?nèi)绻麑⒅暗耐酱a改成異步的,我們就得到了我們想要的結(jié)果

?
1
2
3
4
5
this.addNum = function () {
            setTimeout(()=>{ this.setState({num:this.state.num+1}) },0)
            setTimeout(()=>{ this.setState({num:this.state.num+1}) },0)
            setTimeout(()=>{ this.setState({num:this.state.num+1}) },0)
        }.bind(this)

此時,值直接就加了3,因為異步代碼會在代碼執(zhí)行的時候暫存。在所有同步代碼執(zhí)行完畢的時候再執(zhí)行,此時批處理機制已經(jīng)結(jié)束了,于是三個函數(shù)都被執(zhí)行了,于是加了3 這是目前為止能想到的,如果以后有新的還會增加

以上就是React 三大屬性之state的使用詳解的詳細內(nèi)容,更多關(guān)于React 三大屬性之state的資料請關(guān)注服務器之家其它相關(guān)文章!

原文鏈接:https://juejin.cn/post/6950500180147994660

延伸 · 閱讀

精彩推薦
  • Reactreact項目從新建到部署的實現(xiàn)示例

    react項目從新建到部署的實現(xiàn)示例

    這篇文章主要介紹了react項目從新建到部署的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們...

    juejin9462022-01-21
  • ReactReact獲取input值并提交的2種方法實例

    React獲取input值并提交的2種方法實例

    這篇文章主要給大家介紹了關(guān)于React獲取input值并提交的2種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需...

    GuanJdoJ9522022-03-01
  • ReactReact+Koa實現(xiàn)文件上傳的示例

    React+Koa實現(xiàn)文件上傳的示例

    這篇文章主要介紹了React+Koa實現(xiàn)文件上傳的示例,幫助大家更好的理解和學習使用React,感興趣的朋友可以了解下...

    孤雨隨風zz4232022-02-23
  • React基于react hooks,zarm組件庫配置開發(fā)h5表單頁面的實例代碼

    基于react hooks,zarm組件庫配置開發(fā)h5表單頁面的實例代碼

    這篇文章主要介紹了基于react hooks,zarm組件庫配置開發(fā)h5表單頁面,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,...

    記憶的森林4112022-02-23
  • ReactReactRouter的實現(xiàn)方法

    ReactRouter的實現(xiàn)方法

    這篇文章主要介紹了ReactRouter的實現(xiàn),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下...

    WindrunnerMax6212022-01-06
  • ReactReact.Children的用法詳解

    React.Children的用法詳解

    這篇文章主要介紹了React.Children的用法詳解,幫助大家更好的理解和學習使用React框架,感興趣的朋友可以了解下...

    uuihoo10692022-02-23
  • ReactReact中使用setInterval函數(shù)的實例

    React中使用setInterval函數(shù)的實例

    這篇文章主要介紹了React中使用setInterval函數(shù)的實例,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友...

    哈工大的許政7432022-02-23
  • ReactReact三大屬性之props的使用詳解

    React三大屬性之props的使用詳解

    這篇文章主要介紹了React三大屬性之props的使用詳解,幫助大家更好的理解和學習使用React,感興趣的朋友可以了解下...

    xiaoznz9962022-03-02
主站蜘蛛池模板: 无删减影视免费观看 | 2018高清国产一道国产 | 亚洲ⅴa偷拍在线影院 | 国产亚洲欧美日韩综合综合二区 | 精品91自产拍在线 | 黑帮大佬与我的365天2标清中文 | 亚洲高清免费在线观看 | 亚洲欧美天堂综合久久 | 久草高清在线 | 精品一区二区91 | 韩国一大片a毛片女同 | 18韩国美女vip视频7 | 精品国产成人高清在线 | chinese调教踩踏视频 | 欧美日韩亚洲一区二区三区在线观看 | 国产成人精品日本亚洲网站 | 极品主播的慰在线播放 | 蜜桃视频一区二区 | 无人区1在线观看 | 久久精品一区二区三区资源网 | 波多野结衣在线中文字幕 | 爽好紧别夹宝贝叫大声点护士 | 国产精品igao视频网网址 | 亚洲成人第一页 | 性bbbbwwbbbb| 色男人网 | 邪恶肉肉全彩色无遮琉璃神社 | 美女用手扒开粉嫩的屁股 | 丰满的闺蜜2中文字幕 | 亚洲国产综合久久精品 | 97精品国产自在现线免费观看 | 国产精品suv| 国产精品片 | 国产精品国产三级在线专区 | 久久伊人影视 | 日本午夜vr影院新入口 | 免费一区二区视频 | 亚洲欧美自偷自拍另类小说 | 日本三不卡 | 天天久久影视色香综合网 | 四虎影院久久 |