React事件處理和原生JS事件處理


1.原生JS

事件觸發調用有三種方式:

1. on[event]事件屬性,手動觸發  ❗️on[event]事件是Window對象上的方法。

2. on[event]事件屬性,通過htmlElement.click()模擬觸發

3. addEventListener監聽事件,手動觸發

this指向

  1. 如果onevent事件屬性定義的時候將this作為參數,在函數中獲取到該參數是DOM對象。用該方法可以獲取當前DOM。
  2. 在方法中直接訪問this, this指向當前函數所在的作用域。或者說調用函數的對象。
<body>
    <input type="checkbox" id="root" onmouseover="toclick(this,event)" onclick="add()" />
    <button onclick="a.test(this)">Test</button>
    <script>
        function toclick(argThis,e) {
            console.log(e); // event對象;必須手動傳參
            console.log(argThis); // 傳遞過來的this指向DOM元素,可以通過這個方法調用自身  
            const rootEle = argThis; // 等於document.getElementById('root');
            rootEle.click(); // 里面沒有參數,只是觸發
        }
        function add(arg) {
            console.log(arg);// undefined 說明事件想要獲取event等參數必須要傳參
            console.log(this); // window  不管是mouseover里面通過rootEle觸發還是直接單擊觸發,相當於直接運行add()
        }
        const a = {
            test(argThis) {
                console.log(argThis); // dom元素
                console.log(this); // this指向對象a
            }
        }
        const rootEle = document.getElementById("root");
        rootEle.addEventListener('click', function() {
            console.log('listen===',this); // DOM元素;指向調用監聽器的對象
        })
     </script>
</body>

 2. ReactJS

事件觸發調用方式:

1. 事件屬性。on[Event]觸發,注意ReactJS中使用小駝峰命名,這點和原生JS不同。

2. click()模擬觸發。注意模擬觸發和事件監聽都要求DOM加載完畢。

3. 監聽事件觸發。addEventListener

this指向:

React中this指向一般都期望指向當前組件,如果不綁定this,this一般等於undefined。

綁定this的方法有三種:

  1. 箭頭函數;本質上是在構造函數中進行了綁定;
  2. 在事件屬性定義的時候使用.bind(this, ...params)(不推薦,因為每次運行,會生成一個新函數)
  3. 在構造函數中手動綁定,只需要綁定一次。 

3. 事件對象

原生js中事件對象是原生事件對象,它存在瀏覽器兼容性,需要用戶自己處理各瀏覽器兼容問題。

ReactJS中的事件對象是React將原生事件對象(event)進行了跨瀏覽器包裝過的合成事件(SyntheticEvent)。

合成事件對象的特點:

1)在事件處理函數中,可以正常訪問事件屬性。

2)為了性能考慮,執行完后,合成事件的事件屬性將不能再訪問。

     異步處理函數中,訪問不到合成事件的屬性。

     因為執行異步函數的時候,事件處理函數的上下文消失。

示例:

handleClick = (event) => {
    console.log(event); // => nullified object
    console.log(event.type); // => "click"
    const eventType = event.type; // => "click"
  
    setTimeout(function() {// 異步函數中復用
      console.log(event.type); // => null
      console.log(eventType); // => "click"
    }, 0);
  
    // 不起作用,this.state.clickEvent 的值將會只包含 null
    this.setState({clickEvent: event});
  
    // 你仍然可以導出事件屬性
    this.setState({eventType: event.type});
  }

想要在異步函數中繼續使event屬性可訪問,需要使用event.persist();

 handleClick = (event) => {
    event.persist();
    console.log(event); // => nullified object
    console.log(event.type); // => "click"
    const eventType = event.type; // => "click"
  
    setTimeout(function() {// 異步函數中復用
      console.log(event.type); // => "click"
      console.log(eventType); // => "click"
    }, 0);
  
    this.setState({clickEvent: event});
  
    this.setState({eventType: event.type});
  }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM