欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

React中DOM事件和狀態(tài)介紹

 更新時間:2022年08月28日 14:31:39   作者:公眾號_前端每日技巧  
這篇文章主要介紹了React中DOM事件和狀態(tài)介紹,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下

DOM事件

react中綁定事件的語法跟html中為元素綁定事件的語法相似,

html中綁定事件:

<div onclick="fn"></div>
? ? react中綁定事件
<div onClick={this.fn}></div>

注意:

  • 1 事件名稱首字母必須大寫
  • 2 事件回調(diào)函數(shù)定義在組件中,我們通過插值語法引入綁定
  • 3 事件回調(diào)函數(shù)不能執(zhí)行(后面不能添加參數(shù)集合())

綁定的是一個未執(zhí)行的方法

參數(shù)

React使用了事件委托模式實現(xiàn)事件的綁定(事件委托模式特點:1 減少事件數(shù)量, 2 預(yù)言未來元素, 3 防止內(nèi)存外泄)

vue沒有實現(xiàn)事件委托,參數(shù)就是源生的事件對象

jquery實現(xiàn)了事件委托模式,參數(shù)是jquery封裝后的事件對象

react中的DOM事件是基于事件委托模式實現(xiàn)的,因此參數(shù)就是react封裝的事件對象(16版本就一個參數(shù))

因此可以通過事件對象準(zhǔn)確的獲取綁定事件的元素,以及觸發(fā)事件的元素。

作用域

react中的DOM事件回調(diào)函數(shù)

ES5開發(fā)中,this指向組件實例化對象,并且是不能改變的

ES6開發(fā)中,this默認(rèn)是undefined,我們未來訪問組件中的其他數(shù)據(jù),我們要綁定作用域

改變作用域由兩種方式:

  • 第一種,使用ES5提供的bind方法,改變作用域
  • 第二種,使用ES6提供的箭頭函數(shù),是定義時的作用域

一旦改變了作用域,我們是可以傳遞自定義參數(shù)的

bind方式改變的作用域,傳遞的自定義參數(shù)始終在事件對象前面

箭頭函數(shù)改變的作用域,傳遞的自定義參數(shù)可以在任何位置。

在ES6開發(fā)中,事件回調(diào)函數(shù)允許我們綁定其他的對象,但是工作中,不建議綁定組件之外的其他對象

舉例:

// 定義類
?class Demo extends Component {
? // 事件回調(diào)函數(shù)
? clickBtn(e) {
? ? ? console.log(this, arguments)
? ? ? // console.log(e.target, e.currentTarget)
? }
? // 渲染
? render() {
? ? ? return (
? ? ? ? ? <div>
? ? ? ? ? ? ? <button onClick={this.clickBtn}><span>按鈕</span>1</button>
? ? ? ? ? ? ? {/*更改this*/}
? ? ? ? ? ? ? <button onClick={this.clickBtn.bind(this, 100, 'hello', true)}>按鈕2</button>
? ? ? ? ? ? ? <button onClick={e => this.clickBtn(100, e, 'demo', false)}>按鈕3</button>
? ? ? ? ? ? ? {/*工作中,不建議綁定組件之外的其他對象*/}
? ? ? ? ? ? ? <button onClick={this.clickBtn.bind(obj)}>按鈕4</button>
? ? ? ? ? </div>
? ? ? )
? }
}

狀態(tài)

組件有兩類數(shù)據(jù),一類是屬性數(shù)據(jù),一類就是狀態(tài)數(shù)據(jù)

屬性數(shù)據(jù)是在組件外部傳遞給組件的,因此在組件外部維護(hù)

狀態(tài)數(shù)據(jù)是在組件內(nèi)部使用的,因此在組件內(nèi)部維護(hù)

根據(jù)組件是否有狀態(tài)數(shù)據(jù),可以將組件分成兩類,一類是無狀態(tài)是組件,一類是有狀態(tài)組件

無狀態(tài)組件

如果組件創(chuàng)建完成,組件就是一成不變的,組件不會產(chǎn)生交互,不會發(fā)送請求,這類組件就是無狀態(tài)組件

我們目前所學(xué)習(xí)的組件,都是無狀態(tài)組件

無狀態(tài)組件還可以簡寫成一個函數(shù)

無狀態(tài)組件也叫state less component

有狀態(tài)組件

如果組件創(chuàng)建完成后,會與用戶產(chǎn)生交互,會發(fā)送異步請求等等,在組件內(nèi)部就會產(chǎn)生數(shù)據(jù),為了維護(hù)這部分?jǐn)?shù)據(jù),我們可以將這部分?jǐn)?shù)據(jù)放在狀態(tài)中,這樣的組件就是有狀態(tài)組件。

這里的數(shù)據(jù)就是狀態(tài)數(shù)據(jù)

使用狀態(tài)數(shù)據(jù)

使用狀態(tài)數(shù)據(jù)跟使用屬性數(shù)據(jù)一樣,也是通過this.state來使用。

初始化狀態(tài)數(shù)據(jù)

我們在組件的構(gòu)造函數(shù)中,初始化狀態(tài)數(shù)據(jù)。

es6中通過constructor定義構(gòu)造函數(shù),由于我們的組件繼承了Component組件基類,

并且重寫了構(gòu)造函數(shù)constructor,為了在構(gòu)造函數(shù)內(nèi)實現(xiàn)構(gòu)造函數(shù)繼承,我們要使用super關(guān)鍵字

構(gòu)造函數(shù)有props屬性數(shù)據(jù)參數(shù),為了繼承它,我們要將props參數(shù)傳遞給super方法

super(props);

如果不傳遞:在構(gòu)造函數(shù)中,this.props目前是undefined

由于繼承了props,所以在構(gòu)造函數(shù)中props和this.props沒有區(qū)別了

初始化狀態(tài)

在構(gòu)造函數(shù)中,通過為this.state賦值即可。

注意:由于在構(gòu)造函數(shù)中,我們可以訪問屬性數(shù)據(jù),因此我們可以用屬性數(shù)據(jù)為狀態(tài)數(shù)據(jù)賦值,這樣可以實現(xiàn)數(shù)據(jù)有外部流入內(nèi)部(工作中常見)

修改狀態(tài)數(shù)據(jù)

組件提供了一個this.setState的方法,可以在組件內(nèi)部修改狀態(tài)數(shù)據(jù)

參數(shù)是對象

key表示狀態(tài)屬性數(shù)據(jù)名稱

value表示狀態(tài)數(shù)據(jù)值

注意:無論是組件的屬性數(shù)據(jù)發(fā)生改變,還是狀態(tài)數(shù)據(jù)發(fā)生改變,組件都會執(zhí)行render方法。

// 無狀態(tài)組件內(nèi)部不需要維護(hù)數(shù)據(jù),因此可以簡寫成函數(shù)
?let Demo = () => <button>按鈕</button>
?// 定義換一換組件
?class Demo extends Component {
?// 初始化狀態(tài)數(shù)據(jù)
?constructor(props) {
? ? ? // 構(gòu)造函數(shù)繼承
? ? ? super(props);
? ? ? // console.log(this.props, props)
? ? ? // 初始化狀態(tài)
? ? ? this.state = {
? ? ? ? ? num: 0
? ? ? }
? }
?// 定義子視圖列表
?createChildList(arr) {
? ? ? // 將數(shù)組成員轉(zhuǎn)成span
? ? ? return arr.map((item, index) => <span key={index}>{item}</span>)
? }
? // 創(chuàng)建新聞列表
? createList() {
? ? ? // console.log(this)
? ? ? // 獲取數(shù)據(jù)長度
? ? ? let len = this.props.data.length;
? ? ? return this.props.data.map((item, index) => {
? ? ? ? ? // 遍歷第二維數(shù)組,如果num與index相等,要顯示
? ? ? ? ? return <li key={index} style={{
? ? ? ? ? ? ? display: this.state.num % len === index ? '' : 'none'
? ? ? ? ? }}>{this.createChildList(item)}</li>
? ? ? })
? }
? // 事件回調(diào)函數(shù)
? toggle() {
? ? ? // 更新num
? ? ? // var num = this.state.num;
? ? ? // // 下一頁
? ? ? // num++;
? ? ? // 更新狀態(tài)
? ? ? // this.setState({ num })
? ? ? // 簡化成一步
? ? ? this.setState({
? ? ? ? ? // 先加再更新
? ? ? ? ? num: ++this.state.num
? ? ? })
? }
? // 定義渲染方法
? render() {
? ? ? return (
? ? ? ? ? <div>
? ? ? ? ? ? ? {/*<span onClick={this.toggle.bind(this)}>換一換</span>*/}
? ? ? ? ? ? ? <span onClick={e => this.toggle(e)}>換一換</span>
? ? ? ? ? ? ? {/*新聞列表*/}
? ? ? ? ? ? ? <ul>{this.createList()}</ul>
? ? ? ? ? </div>
? ? ? )
? }
}

到此這篇關(guān)于React中DOM事件和狀態(tài)介紹的文章就介紹到這了,更多相關(guān)React事件和狀態(tài)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React全家桶環(huán)境搭建過程詳解

    React全家桶環(huán)境搭建過程詳解

    本篇文章主要介紹了React全家桶環(huán)境搭建過程詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • ahooks控制時機(jī)的hook實現(xiàn)方法

    ahooks控制時機(jī)的hook實現(xiàn)方法

    這篇文章主要為大家介紹了ahooks控制時機(jī)的hook實現(xiàn)方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • React中實現(xiàn)keepalive組件緩存效果的方法詳解

    React中實現(xiàn)keepalive組件緩存效果的方法詳解

    由于react官方并沒有提供緩存組件相關(guān)的api(類似vue中的keepalive),在某些場景,會使得頁面交互性變的很差。所以本文為大家介紹了React中實現(xiàn)keepalive組件緩存效果的方法,希望對大家有所幫助
    2023-01-01
  • React?diff算法超詳細(xì)講解

    React?diff算法超詳細(xì)講解

    渲染真實DOM的開銷很大,有時候我們修改了某個數(shù)據(jù),直接渲染到真實dom上會引起整個dom樹的重繪和重排。我們希望只更新我們修改的那一小塊dom,而不是整個dom,diff算法就幫我們實現(xiàn)了這點。diff算法的本質(zhì)就是:找出兩個對象之間的差異,目的是盡可能做到節(jié)點復(fù)用
    2022-11-11
  • React表單容器的通用解決方案

    React表單容器的通用解決方案

    本文主要介紹了React表單容器的通用解決方案,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • React組件二次包裝的具體實現(xiàn)

    React組件二次包裝的具體實現(xiàn)

    本文主要介紹了React組件二次包裝的具體實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 前端開發(fā)使用Ant Design項目評價

    前端開發(fā)使用Ant Design項目評價

    這篇文章主要為大家介紹了前端開發(fā)使用Ant Design項目評價,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 基于React實現(xiàn)無限滾動表格

    基于React實現(xiàn)無限滾動表格

    以文本為例,為了實現(xiàn)無限循環(huán)的視覺效果,我們需要準(zhǔn)備兩段相同的文本,并讓第二段文本的頭部銜接在第一段文本的尾部,同時,為兩段文本設(shè)置相同的滾動動畫,本文給大家介紹了基于React實現(xiàn)無限滾動表格,需要的朋友可以參考下
    2023-11-11
  • React.js中常用的ES6寫法總結(jié)(推薦)

    React.js中常用的ES6寫法總結(jié)(推薦)

    本篇文章中主要介紹了React.js中常用的ES6寫法總結(jié)(推薦),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • React之Hooks詳解

    React之Hooks詳解

    這篇文章主要介紹了React hooks的優(yōu)缺點詳解,幫助大家更好的理解和學(xué)習(xí)使用React,感興趣的朋友可以了解下, 希望能夠給你帶來幫助
    2021-09-09

最新評論