<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
react中繫結事件的語法跟html中為元素繫結事件的語法相似,
html中繫結事件:
<div onclick="fn"></div> react中繫結事件 <div onClick={this.fn}></div>
注意:
繫結的是一個未執行的方法
React使用了事件委託模式實現事件的繫結(事件委託模式特點:1 減少事件數量, 2 預言未來元素, 3 防止記憶體外洩)
vue沒有實現事件委託,引數就是源生的事件物件
jquery實現了事件委託模式,引數是jquery封裝後的事件物件
react中的DOM事件是基於事件委託模式實現的,因此引數就是react封裝的事件物件(16版本就一個引數)
因此可以通過事件物件準確的獲取繫結事件的元素,以及觸發事件的元素。
react中的DOM事件回撥函數
ES5開發中,this指向元件範例化物件,並且是不能改變的
ES6開發中,this預設是undefined,我們未來存取元件中的其他資料,我們要繫結作用域
改變作用域由兩種方式:
一旦改變了作用域,我們是可以傳遞自定義引數的
bind方式改變的作用域,傳遞的自定義引數始終在事件物件前面
箭頭函數改變的作用域,傳遞的自定義引數可以在任何位置。
在ES6開發中,事件回撥函數允許我們繫結其他的物件,但是工作中,不建議繫結元件之外的其他物件
舉例:
// 定義類 class Demo extends Component { // 事件回撥函數 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> ) } }
元件有兩類資料,一類是屬性資料,一類就是狀態資料
屬性資料是在元件外部傳遞給元件的,因此在元件外部維護
狀態資料是在元件內部使用的,因此在元件內部維護
根據元件是否有狀態資料,可以將元件分成兩類,一類是無狀態是元件,一類是有狀態元件
如果元件建立完成,元件就是一成不變的,元件不會產生互動,不會傳送請求,這類元件就是無狀態元件
我們目前所學習的元件,都是無狀態元件
無狀態元件還可以簡寫成一個函數
無狀態元件也叫state less component
如果元件建立完成後,會與使用者產生互動,會傳送非同步請求等等,在元件內部就會產生資料,為了維護這部分資料,我們可以將這部分資料放在狀態中,這樣的元件就是有狀態元件。
這裡的資料就是狀態資料
使用狀態資料跟使用屬性資料一樣,也是通過this.state來使用。
我們在元件的建構函式中,初始化狀態資料。
es6中通過constructor定義建構函式,由於我們的元件繼承了Component元件基礎類別,
並且重寫了建構函式constructor,為了在建構函式內實現建構函式繼承,我們要使用super關鍵字
建構函式有props屬性資料引數,為了繼承它,我們要將props引數傳遞給super方法
super(props);
如果不傳遞:在建構函式中,this.props目前是undefined
由於繼承了props,所以在建構函式中props和this.props沒有區別了
初始化狀態
在建構函式中,通過為this.state賦值即可。
注意:由於在建構函式中,我們可以存取屬性資料,因此我們可以用屬性資料為狀態資料賦值,這樣可以實現資料有外部流入內部(工作中常見)
元件提供了一個this.setState的方法,可以在元件內部修改狀態資料
引數是物件
key表示狀態屬性資料名稱
value表示狀態資料值
注意:無論是元件的屬性資料發生改變,還是狀態資料發生改變,元件都會執行render方法。
// 無狀態元件內部不需要維護資料,因此可以簡寫成函數 let Demo = () => <button>按鈕</button> // 定義換一換元件 class Demo extends Component { // 初始化狀態資料 constructor(props) { // 建構函式繼承 super(props); // console.log(this.props, props) // 初始化狀態 this.state = { num: 0 } } // 定義子檢視列表 createChildList(arr) { // 將陣列成員轉成span return arr.map((item, index) => <span key={index}>{item}</span>) } // 建立新聞列表 createList() { // console.log(this) // 獲取資料長度 let len = this.props.data.length; return this.props.data.map((item, index) => { // 遍歷第二維陣列,如果num與index相等,要顯示 return <li key={index} style={{ display: this.state.num % len === index ? '' : 'none' }}>{this.createChildList(item)}</li> }) } // 事件回撥函數 toggle() { // 更新num // var num = this.state.num; // // 下一頁 // num++; // 更新狀態 // 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> ) } }
到此這篇關於React中DOM事件和狀態介紹的文章就介紹到這了,更多相關React事件和狀態內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45