網站首頁 編程語言 正文
DOM事件
react中綁定事件的語法跟html中為元素綁定事件的語法相似,
html中綁定事件:
<div onclick="fn"></div>
? ? react中綁定事件
<div onClick={this.fn}></div>
注意:
- 1 事件名稱首字母必須大寫
- 2 事件回調函數定義在組件中,我們通過插值語法引入綁定
- 3 事件回調函數不能執行(后面不能添加參數集合())
綁定的是一個未執行的方法
參數
React使用了事件委托模式實現事件的綁定(事件委托模式特點:1 減少事件數量, 2 預言未來元素, 3 防止內存外泄)
vue沒有實現事件委托,參數就是源生的事件對象
jquery實現了事件委托模式,參數是jquery封裝后的事件對象
react中的DOM事件是基于事件委托模式實現的,因此參數就是react封裝的事件對象(16版本就一個參數)
因此可以通過事件對象準確的獲取綁定事件的元素,以及觸發事件的元素。
作用域
react中的DOM事件回調函數
ES5開發中,this指向組件實例化對象,并且是不能改變的
ES6開發中,this默認是undefined,我們未來訪問組件中的其他數據,我們要綁定作用域
改變作用域由兩種方式:
- 第一種,使用ES5提供的bind方法,改變作用域
- 第二種,使用ES6提供的箭頭函數,是定義時的作用域
一旦改變了作用域,我們是可以傳遞自定義參數的
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>
? ? ? )
? }
}
原文鏈接:https://blog.51cto.com/u_13349380/5607113
相關推薦
- 2022-03-18 .Net使用分表分庫框架ShardingCore實現多字段分片_實用技巧
- 2023-01-05 Qt操作SQLite數據庫的教程詳解_C 語言
- 2022-05-08 一起來練習C++的指針_C 語言
- 2023-04-29 vscode搭建python?Django網站開發環境的示例_python
- 2022-02-16 C語言實現wave波形_C 語言
- 2022-04-16 PyCharm實現本地恢復或查看歷史代碼_python
- 2021-12-06 Android?CameraX?打開攝像頭預覽功能_Android
- 2022-09-22 原型鏈及原型鏈的作用/構造函數,原型對象,實例對象的三角關系
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支