最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2022年08月28日 14:31:39   作者:公眾號_前端每日技巧  
這篇文章主要介紹了React中DOM事件和狀態(tài)介紹,文章圍繞主題展開詳細的內(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 預言未來元素, 3 防止內(nèi)存外泄)

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

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

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

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

作用域

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

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

ES6開發(fā)中,this默認是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ù)是在組件外部傳遞給組件的,因此在組件外部維護

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

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

無狀態(tài)組件

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

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

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

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

有狀態(tài)組件

如果組件創(chuàng)建完成后,會與用戶產(chǎn)生交互,會發(fā)送異步請求等等,在組件內(nèi)部就會產(chǎn)生數(shù)據(jù),為了維護這部分數(shù)據(jù),我們可以將這部分數(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)部不需要維護數(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)文章

  • vue3中獲取ref元素的幾種方式總結(jié)

    vue3中獲取ref元素的幾種方式總結(jié)

    這篇文章主要介紹了vue3中獲取ref元素的幾種方式總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • React Native 自定義下拉刷新上拉加載的列表的示例

    React Native 自定義下拉刷新上拉加載的列表的示例

    本篇文章主要介紹了React Native 自定義下拉刷新上拉加載的列表的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • 淺談React組件在什么情況下會重新渲染

    淺談React組件在什么情況下會重新渲染

    當我們使用React編寫組件時,組件的重新渲染是一個重要的概念,本文主要介紹了React組件在什么情況下會重新渲染,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • React 數(shù)據(jù)獲取條件競爭原理解析

    React 數(shù)據(jù)獲取條件競爭原理解析

    這篇文章主要為大家介紹了React 數(shù)據(jù)獲取條件競爭原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • react native 文字輪播的實現(xiàn)示例

    react native 文字輪播的實現(xiàn)示例

    這篇文章主要介紹了react native 文字輪播的實現(xiàn)示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • JavaScript中的useRef 和 useState介紹

    JavaScript中的useRef 和 useState介紹

    這篇文章主要給大家分享的是 JavaScript中的useRef 和 useState介紹,下列文章,我們將學習 useRef 和 useState hook是什么,它們的區(qū)別以及何時使用哪個。 這篇文章中的代碼示例將僅涉及功能組件,但是大多數(shù)差異和用途涵蓋了類和功能組件,需要的朋友可以參考一下
    2021-11-11
  • React如何使用sortablejs實現(xiàn)拖拽排序

    React如何使用sortablejs實現(xiàn)拖拽排序

    這篇文章主要介紹了React如何使用sortablejs實現(xiàn)拖拽排序問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 如何使用Redux Toolkit簡化Redux

    如何使用Redux Toolkit簡化Redux

    redux-toolkit是目前redux官方推薦的編寫redux邏輯的方法,針對redux的創(chuàng)建store繁瑣、樣板代碼太多、依賴外部庫等問題進行了優(yōu)化,官方總結(jié)了四個特點是簡易的/有想法的/強勁的/高效的,總結(jié)來看,就是更加的方便簡單了
    2022-12-12
  • 如何去除富文本中的html標簽及vue、react、微信小程序中的過濾器

    如何去除富文本中的html標簽及vue、react、微信小程序中的過濾器

    這篇文章主要介紹了如何去除富文本中的html標簽及vue、react、微信小程序中的過濾器,在vue及react中經(jīng)常會遇到,今天通過實例代碼給大家講解,需要的朋友可以參考下
    2018-11-11
  • 在React中實現(xiàn)分塊導出大量數(shù)據(jù)表格并壓縮成圖片的解決方案

    在React中實現(xiàn)分塊導出大量數(shù)據(jù)表格并壓縮成圖片的解決方案

    在現(xiàn)代Web開發(fā)中,處理和展示大量數(shù)據(jù)是一個常見的挑戰(zhàn),特別是在使用React框架時,我們經(jīng)常需要將這些數(shù)據(jù)以表格的形式展示,并提供導出功能,本文將介紹如何在React中實現(xiàn)一個高效、分塊導出大量數(shù)據(jù)表格,并將其壓縮為圖片的解決方案,需要的朋友可以參考下
    2024-12-12

最新評論

瑞金市| 岗巴县| 邳州市| 灌南县| 东安县| 肇东市| 田东县| 安顺市| 蓬溪县| 河池市| 华阴市| 交城县| 大宁县| 祥云县| 霞浦县| 丹阳市| 高邑县| 土默特右旗| 如皋市| 克什克腾旗| 威宁| 新巴尔虎右旗| 山东省| 九江县| 奈曼旗| 高陵县| 娱乐| 肃宁县| 长阳| 河源市| 宿迁市| 永平县| 如东县| 德格县| 辽阳市| 惠来县| 缙云县| 白银市| 林口县| 旺苍县| 女性|