window.event與react的SyntheticEvent

風中一匹小羔羊發表於2018-11-16

第一次寫文章有些緊張。。嘿嘿嘿!

通過滑鼠的滾動來實現圖片的放大和縮小,沒錯,像我這樣不思進取的小白,從來不會自己動手擼一遍。第一時間直接上Google。看到一篇部落格 https://blog.csdn.net/tomcat_2014/article/details/49818079 原來是這樣實現的。然後自己在草稿上抄了一遍,雖然他的是jq寫的,不過大同小異。

主要的功能函式:

window.event與react的SyntheticEvent

一開始還挺納悶為什麼沒有傳入event引數也可以在函式中訪問到,想起曾經是要傳入一個event/e的呀,後來百度了一下,事件event是window裡的東西。

然後回到react專案中,首先是要獲取到img的真實的dom元素,使用了ref。

window.event與react的SyntheticEvent

獲取到真實的DOM元素後,然後再將功能函式放上去就可以了;

window.event與react的SyntheticEvent

嘿嘿,任務完成。拜拜!

其實,我應該可以早點下班回去的。

然後,想把這個再寫一遍,放到自己的GitHub上。

就在下班之際,我create-react-app搭建了一個學習用的react。

然後開開心心的將程式碼從專案上覆制過去,然後結果功能函式裡報錯了:

window.event與react的SyntheticEvent

然後就開始一臉矇蔽了,怎麼會就找不到event了,明明使用的都是react框架呀,怎麼就錯了呢,因為專案我是接手的,所以我就猜想是不是裝了什麼外掛,而我的react可是什麼都沒有呀,我的老天鵝。。。百思不得其姐。

報的錯誤是:Unexpected use of 'event' no-restricted-globals;

然後複製貼上百度

window.event與react的SyntheticEvent

結果這一堆東西,好像沒有我想要的答案。

然後又回到了程式碼上,給它傳了一個引數event:

window.event與react的SyntheticEvent

window.event與react的SyntheticEvent

我以為這樣應該是可以了,確實沒有報錯了,但是滾動滑鼠沒有圖片沒有放大縮小。

問題繼續。。。

然後我將兩個的imgDom和event列印出來一看,發現了不同的地方:

window.event與react的SyntheticEvent

window.event與react的SyntheticEvent

失敗的event是Class,成功的event是WheelEvent;

然後我再將失敗的event.wheelDelta給列印出來是undefined

這就使我非常納悶了,怎麼會這樣呢?

然後又是各種百度。。。結果搜不到,也可能是自己百度的功底還有待加強。

一看時間,靠,十點半了,撤。。不然廣州的地鐵就要休息了。

第二天下午我問了問隔壁的同事,他也和我一樣一開始有點矇蔽,誰叫我們都那麼的白呢。

然後,我們倆就開始繼續折騰這個問題。

他叫我點開Class和WheelEvent對比一下,看看有什麼不同,確實它們的大部分屬性都是相同的,然後繼續點開_proto_,然後在Class到Object之間發現了 _proto_:SyntheticEvent;這個東西引起他的注意,於是他叫我百度了一下這個單詞,然後進入了react的文件:合成事件(SyntheticEvent);感覺這篇文件就是答案的關鍵。然後耐下心來看完這篇文件,這個內容還是第一次看。確實文件中還有很多的東西沒有看,自己也就看了主要概念,高階指南也只看了點點。

那麼SyntheticEvent是什麼呢?看看中文文件的概述:

window.event與react的SyntheticEvent

然後通過event.antiveEvent就可以訪問到Class中的WheelEvent,這樣就可以使用滾輪事件了。不過說來也真實蠢,命名Class的log裡type前面就有nativeEvent:WheelEvent;但是自己心瞎就是看不到。然後我將event改成了event.nativeEvent就成功了:

window.event與react的SyntheticEvent

然後我不傳入event了,直接使用window.event:

window.event與react的SyntheticEvent

也成功了。

原來react的合成事件是將事件event合併到了它的事件了,直接訪問是event是

不可以訪問到window下的event事件。

但是有一點還是想不明白,那就是兩個都是react寫的,為什麼一個可以,一個卻不行?

後來看了兩個react的版本號:

一個是16.4.0的:

window.event與react的SyntheticEvent

一個是16.6.3的:

window.event與react的SyntheticEvent

如果不是某些外掛導致的,或許就是版本號的問題了。

第一次寫文章,亂七八糟的。。。哈哈!










相關文章