摘要:前言在的開發(fā)中,我們經(jīng)常需要在上注冊一些事件,比如按下關(guān)閉彈窗,按上下鍵選中列表內(nèi)容等等。比較常見的操作是在組件的時候去上監(jiān)聽一個事件,在組件的時候停止監(jiān)聽事件。
前言
在React的開發(fā)中,我們經(jīng)常需要在 window 上注冊一些事件, 比如按下 Esc 關(guān)閉彈窗, 按上下鍵選中列表內(nèi)容等等。比較常見的操作是在組件 mount 的時候去 window 上監(jiān)聽一個事件, 在組件 unmount 的時候停止監(jiān)聽事件。下面給大家介紹幾個騷操作。
WindowEventHandler我們創(chuàng)建一個 WindowEventHandler 組件, 內(nèi)容如下
import PropTypes from "prop-types"; import { Component, PureComponent } from "react"; export default class WindowEventHandler extends (PureComponent || Component) { static propTypes = { eventName: PropTypes.string.isRequired, callback: PropTypes.func.isRequired, useCapture: PropTypes.bool, }; static defaultProps = { useCapture: false, }; componentDidMount() { const { eventName, callback, useCapture } = this.props; window.addEventListener(eventName, callback, useCapture); } componentWillUnmount() { const { eventName, callback, useCapture } = this.props; window.removeEventListener(eventName, callback, useCapture); } render() { return null; } }
現(xiàn)在比如我們想在組件A中監(jiān)聽 window 的 resize 事件,我們在 A 組件中可以這么寫
export default class A extends (PureComponent || Component) { handleResize = () => { // dosomething... } render() { return (我是組件A); } }
這樣我們在多個組件中就不需要每次都要寫 mount 和 unmount 的鉤子函數(shù)了,省了很多事情。
使用裝飾器我們可以給組件寫一個統(tǒng)一的裝飾器,和之前一樣傳入事件名和方法名就可以監(jiān)聽,等到組件卸載的時候就停止監(jiān)聽,代碼如下
export default function windowEventDecorator(eventName, fn) { return function decorator(Component) { return (...args) => { const inst = new Component(...args); const instComponentDidMount = inst.componentDidMount ? inst.componentDidMount.bind(inst) : undefined; const instComponentWillUnmount = inst.instComponentWillUnmount ? inst.componentWillUnmount.bind(inst) : undefined; const callback = (e) => { typeof inst[fn] === "function" && inst[fn](); }; inst.componentDidMount = () => { instComponentDidMount && instComponentDidMount(); document.body.addEventListener(eventName, callback, true); }; inst.componentWillUnmount = () => { instComponentWillUnmount && instComponentWillUnmount(); document.body.removeEventListener(eventName, callback, true); }; return inst; }; }; }
類似這樣的裝飾器,同理我們想在 A 中監(jiān)聽 window 的 resize 事件,可以這么寫
@windowEventDecorator("resize", "handleResize"); export default class A extends (PureComponent || Component) { handleResize = () => { // dosomething... } render() { return (總結(jié)我是組件A); } }
這種小技巧提高了開發(fā)效率,少寫了很多代碼,可以在項目代碼中嘗試。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/99953.html
摘要:或許你當前的項目還沒有到應(yīng)用的程度,但提前了解一下也沒有壞處首先我們會用到哪些框架和工具呢框架狀態(tài)管理工具,與沒有任何關(guān)系,其他框架也可以使用插件,作用方便在項目中使用中間件,作用支持異步目錄組件目錄 或許你當前的項目還沒有到應(yīng)用Redux的程度,但提前了解一下也沒有壞處 首先我們會用到哪些框架和工具呢?ReactUI框架Redux狀態(tài)管理工具,與React沒有任何關(guān)系,其他UI框架也...
摘要:或許你當前的項目還沒有到應(yīng)用的程度,但提前了解一下也沒有壞處首先我們會用到哪些框架和工具呢框架狀態(tài)管理工具,與沒有任何關(guān)系,其他框架也可以使用插件,作用方便在項目中使用中間件,作用支持異步目錄組件目錄 或許你當前的項目還沒有到應(yīng)用Redux的程度,但提前了解一下也沒有壞處 首先我們會用到哪些框架和工具呢?ReactUI框架Redux狀態(tài)管理工具,與React沒有任何關(guān)系,其他UI框架也...
摘要:注冊事件的回調(diào)函數(shù)由來統(tǒng)一管理,根據(jù)事件的類型和組件標識為唯一標識事件并進行存儲。利用中注入的例如會將原生的事件轉(zhuǎn)化成合成的事件,然后批量執(zhí)行存儲的回調(diào)函,回調(diào)函數(shù)的執(zhí)行分為兩步,第一步是將所有的合成事件放到事件隊列里面,第二步是逐個執(zhí)行。 最近在閱讀《深入React技術(shù)?!芬粫校l(fā)現(xiàn)了之前使用React中并沒有注意到的React事件與瀏覽器原生事件之間的區(qū)別,鑒于好久已經(jīng)沒有寫...
摘要:合理的優(yōu)化長列表,可以提升用戶體驗。這樣保證了無論如何滾動,真實渲染出的節(jié)點只有可視區(qū)內(nèi)的列表元素。具體效果如下圖所示對于比無優(yōu)化的情況,優(yōu)化后的虛擬列表渲染速度提升很明顯。是基于來實現(xiàn)的,但是是一個維的列表,而不是網(wǎng)狀。 ??對于較長的列表,比如1000個數(shù)組的數(shù)據(jù)結(jié)構(gòu),如果想要同時渲染這1000個數(shù)據(jù),生成相應(yīng)的1000個原生dom,我們知道原生的dom元素是很復(fù)雜的,如果長列表...
閱讀 2978·2021-10-14 09:42
閱讀 1334·2021-09-24 10:32
閱讀 3071·2021-09-23 11:21
閱讀 2921·2021-08-27 13:10
閱讀 3401·2019-08-29 18:41
閱讀 2269·2019-08-29 15:16
閱讀 1304·2019-08-29 13:17
閱讀 970·2019-08-29 11:22