首頁 > 軟體

React中DOM事件和狀態介紹

2022-08-28 18:00:25

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>
      )
  }
}

到此這篇關於React中DOM事件和狀態介紹的文章就介紹到這了,更多相關React事件和狀態內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com