精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

大佬,怎么辦?升級React17,Toast組件不能用了

開發 前端
今天,我們來追查一個棘手的React bug,知名組件庫material-ui就受其影響。

[[405755]]

大家好,我是卡頌,人稱卡爾摩斯。

今天,我們來追查一個棘手的React bug,知名組件庫material-ui就受其影響。

這個bug的產生涉及多方因素,包括:

  • useEffect執行時機(很可能與你想的不一樣)
  • 合成事件原理
  • v17源碼中對合成事件的改動
  • Portal原理

這篇文章很長很長,有非常多源碼細節。

你可以用如下Demo和我一起debug源碼,更有破案的感覺

在線Demo地址

相信整篇文章過完,你能對如上知識點有更深的理解。

接下來,讓我們復現案發現場吧。

只在v17下復現的bug

假設,我們有個ToastButton組件,代碼如下:

  1. function ToastButton() { 
  2.   const [show, setShow] = useState(false); 
  3.  
  4.   useEffect(() => { 
  5.     if (!show) return
  6.  
  7.     function clickHandler(e) { 
  8.       setShow(false); 
  9.     } 
  10.  
  11.     document.addEventListener("click", clickHandler); 
  12.     return () => { 
  13.       document.removeEventListener("click", clickHandler); 
  14.     }; 
  15.   }, [show]); 
  16.  
  17.   return ( 
  18.     <div> 
  19.       <button type="button" onClick={() => setShow(true)}>Show Toast</button> 
  20.       {show && <div className="toast">Hey, Ka Song~</div>} 
  21.     </div> 
  22.   ); 

 點擊button后,show狀態變為true,展示toast。

同時在useEffect回調中,在document上注冊「點擊事件」。

觸發點擊事件會讓show狀態置為false,達到「點擊頁面任意區域關閉toast」的效果。

入口函數如下:

  1. function App() { 
  2.   return ( 
  3.     <ToastButton /> 
  4.   ); 
  5.  
  6. ReactDOM.render(<App />, document.getElementById("root")); 

效果如下:

圖片

接下來,我們再增加一個渲染Portal的組件PortalRenderer,代碼如下:

  1. function PortalRenderer() { 
  2.   const [show, setShow] = useState(false); 
  3.  
  4.   return ( 
  5.     <React.Fragment> 
  6.       <button type="button" onClick={() => setShow(true)}> 
  7.         Render portal 
  8.       </button> 
  9.  
  10.       {show && 
  11.         ReactDOM.createPortal( 
  12.           <div>who is handsome?</div>, 
  13.           document.body 
  14.         )} 
  15.     </React.Fragment> 
  16.   ); 

 點擊button后會將show狀態置為true。

會使用ReactDOM.createPortal在document.body上掛載一個div,內容為who is handsome?。

我們將兩個組件一起放在App中:

  1. function App() { 
  2.   return ( 
  3.     <div> 
  4.       <PortalRenderer /> 
  5.       <ToastButton /> 
  6.     </div> 
  7.   ); 

 點擊PortalRenderer效果如下:

圖片

現在問題來了:

  • 如果先點擊PortalRenderer的button,再點擊ToastButton會怎么樣?

理所當然的答案是:

  • 先顯示「who is handsome?」
  • 再顯示「Hey, Ka Song~」

然而,在React v17效果如下:

圖片

先點擊PortalRenderer的button后,再點擊ToastButton,不會看見toast的內容。

但是,只要不點擊PortalRenderer的button就不會有問題:

圖片

這只是一個可復現該bug的極簡Demo。

事實上,在一個大型項目中,如果從v16升級到v17,

在使用了如上所示的「在document掛載原生click事件」方式實現toast的同時,

再使用Portal在document.body掛載DOM都會觸發該bug。

一旦先渲染了Portal,你的toast就不能用了。意不意外?驚不驚喜?

接下來,讓我們一步步揭開這個bug的廬山真面目。

div去哪了?

首先,我們要明確,點擊Show Toast沒反應,是因為沒渲染toast,還是因為渲染了toast又立刻刪除了。

審查元素后發現,每當點擊Show Toast,ToastButton渲染的div都會閃一下。

這代表該div下發生了DOM變化。

而我們并沒有看到DOM的插入,那么這就表示:

這里先發生了DOM插入,緊接著發生了DOM移除

而這個DOM就是toast對應DOM:

<div className="toast">Hey, Ka Song!</div>

我們知道,該DOM顯示與否受ToastButton組件的show狀態影響,

于是,接下來的線索有三條:

  1. 為什么一次點擊,ToastButton組件的show狀態先變為true,后變為false?
  2. 為什么只有在掛載了Portal的情況下bug能復現?
  3. 為什么該bug只在v17復現?

該從哪條線索下手呢?

v17有哪些變化?

相比第一、二條,第三條線索能更好控制影響范圍。

看看v17的更新log,一條特性變化引起了卡爾摩斯的注意:

在v17之前,整個應用的事件會冒泡到同一個根節點(html DOM節點)。

而在v17,每個應用的事件都會冒泡到該應用自己的根節點(ReactDOM.render掛載的節點,在Demo中是div#root)。

這個改動是為了讓一個應用下可以存在多個不同模式的子應用(兼容legacy mode與concurrent mode同時存在于一個應用)。

會不會是這個原因呢?

于是,卡爾摩斯將目光鎖定在源碼中注冊事件的方法:addTrappedEventListener

在應用初始化時(調用ReactDOM.render首屏渲染時),React會遍歷所有「原生事件名」,依次在根節點調用該方法注冊事件回調。

在應用運行過程中,所有原生事件都會由根節點(Demo中的div#root)代理。

以一個React組件的onClick事件舉例,當點擊發生后,會依次執行:

  1. 「原生點擊事件」向上冒泡
  2. 「原生點擊事件」冒泡到根節點,觸發addTrappedEventListener注冊的事件處理函數
  3. 「合成事件」會在React組件樹中從底向上冒泡
  4. 當「合成事件」冒泡到觸發點擊的組件時,調用onClick方法

這就是React合成事件的原理。

那么,為什么只有在掛載了Portal的情況下bug能復現?

難道Portal與合成事件有關?

果然,當我們點擊PortalRenderer的button后,又進入了addTrappedEventListener的斷點。

與初始化時(執行ReactDOM.render時)事件掛載的目標節點(div#root)不同,

由于Portal掛載在document.body上,見如下節選代碼:

  1. // 節選自PortalRenderer 
  2. {show && 
  3.   ReactDOM.createPortal( 
  4.     <div>who is handsome?</div>, 
  5.     document.body 
  6. )} 

 所以會在document.body再執行一遍所有原生事件的代理邏輯。

可以看到此時事件會在body上注冊:

這就意味著,原生事件冒泡到根節點(div#root)后,繼續向上冒泡,在document.body又會觸發一遍事件處理函數。

以一個React組件的onClick事件舉例,當點擊發生后,會依次執行:

  1. 「原生點擊事件」向上冒泡
  2. 「原生事件」冒泡到根節點(div#root),觸發addTrappedEventListener注冊的事件處理函數
  3. 「合成事件」會在React組件樹中從底向上冒泡
  4. 當「合成事件」冒泡到觸發點擊的組件時,調用onClick方法
  5. 「原生點擊事件」繼續向上冒泡到document.body
  6. 重復觸發步驟3

難道bug的原因是onClick被重復執行兩次?

如果是這么明顯的bug大家開發過程中肯定很容易復現。

我們可以在onClick中打印日志,可以看到:一次點擊只會打印一條日志。

圖片

那么問題出在哪呢?

useEffect的執行時機

讓我們回到第一條線索:

  • 為什么一次點擊,ToastButton組件的show狀態先變為true,后變為false?

我們可以從useEffect回調中找找線索。

  1. // 節選自ToastButton 
  2.  useEffect(() => { 
  3.   if (!show) return
  4.  
  5.   function clickHandler(e) { 
  6.     setShow(false); 
  7.   } 
  8.  
  9.   document.addEventListener("click", clickHandler); 
  10.   return () => { 
  11.     document.removeEventListener("click", clickHandler); 
  12.   }; 
  13. }, [show]); 

可以看到,state變為false是由于clickHandler調用。

而clickHandler調用是由于document被點擊。

所以show狀態連續變化的原因很可能是:

  1. 點擊ToastButton,「原生點擊事件」冒泡到應用掛載的根節點
  2. 進入「合成事件」的冒泡邏輯,冒泡到ToastButton時觸發onClick
  3. onClick中setShow(true),state變為true,渲染toast DOM
  4. useEffect回調執行,為document綁定click事件
  5. 「原生點擊事件」繼續冒泡,當冒泡到document時,觸發其綁定的click事件
  6. 調用clickHandler將state變為false,移除toast DOM

正當我為這精妙的推理沾沾自喜時,突然意識到一個問題:

要滿足如上邏輯,步驟4和步驟5之間必須是同步執行。

因為一旦步驟4是異步執行,則當步驟5「原生點擊事件」冒泡到document時,步驟4document的click事件還未綁定。

步驟4在useEffect回調函數中,而useEffect的回調是在執行完DOM操作后異步執行的。

  • 如果useEffect回調在DOM變化后同步執行,會阻塞DOM重排、重繪,所以被設計為異步執行。如果一定要在DOM變化后同步執行副作用,可以使用useLayoutEffect

所以,「正常情況下」,步驟4和步驟5是在不同的兩個瀏覽器task執行。

然而,總有意外。

useEffect的邊界case

在React中,一個常見的操作鏈路是:

  • 用戶觸發事件 -> 改變state -> 依賴該state的useEffect回調執行

去掉中間環節,就是這樣:

  • 用戶觸發事件 -> ... -> useEffect回調執行

而我們剛才說,useEffect回調是異步執行的。

那么設想以下場景:

用戶快速點擊鼠標觸發onClick事件,如何保證每次點擊產生的useEffect回調按順序執行呢?

為了解決這個問題,React將不同原生事件分類。

其中click、keydown等這種不連續觸發的事件被稱為「離散事件」(與之對應的就是scroll這種能連續觸發的事件)。

  • 源碼中所有離散事件的定義見這里

為了保證如下鏈路中的useEffect回調都能按順序執行

  • 離散事件 -> ... -> useEffect回調執行

每當處理離散事件前,都會執行flushPassiveEffects方法。

該方法會將還未執行的useEffect回調執行。

這樣就能保證下一次useEffect回調執行前上一次的useEffect回調已經執行。

所以,當不點擊PortalRenderer的button掛載Portal時,點擊ToastButton的完整流程如下:

  1. 點擊ToastButton,「原生點擊事件」冒泡到應用掛載的根節點
  2. 進入「合成事件」的冒泡邏輯,冒泡到ToastButton時觸發onClick
  3. onClick中setShow(true),state變為true,渲染toast DOM
  4. useEffect回調「異步執行」,為document綁定click事件
  5. 「原生點擊事件」繼續冒泡到document,此時document還未綁定click事件

UI表現為:點擊ToastButton,展示toast。

當點擊PortalRenderer的button掛載Portal后,再點擊ToastButton的完整流程如下:

  1. 點擊PortalRenderer的button,在document.body掛載Portal對應DOM
  2. 在document.body執行綁定事件代理邏輯
  3. 點擊ToastButton,「原生點擊事件」冒泡到應用掛載的根節點
  4. 進入「合成事件」的冒泡邏輯,冒泡到ToastButton時觸發onClick
  5. onClick中setShow(true),state變為true,渲染toast DOM
  6. useEffect回調「異步執行」,為document綁定click事件
  7. 「原生點擊事件」繼續冒泡到document.body,由于body綁定了事件代理邏輯,所以會處理離散事件
  8. 處理的第一步是將還未執行的步驟6同步執行,此時document綁定click事件
  9. 「原生點擊事件」繼續冒泡到document,觸發步驟6綁定的click事件
  10. 調用clickHandler將state變為false,移除toast DOM

UI表現為:點擊ToastButton,無反應(實際是先展示toast,再在同一個瀏覽器task移除toast)

bug解決

可以看到,這是React源碼運行流程的幾個feature綜合起來造成的bug。

如何修復呢?在現有v17架構下無法很好修復。

在v18,伴隨Concurrent Mode的「啟發式更新算法」,會修復該bug。

bug修復見Flush discrete passive effects before paint #21150

修復的方式很簡單:如果一個useEffect回調是由離散事件造成的,則該useEffect回調不會異步執行,而是會在本輪DOM更新完成后同步執行。

至于為什么v16及之前版本不會復現這個bug?

因為之前的版本所有「原生事件」都注冊在html DOM上。

就不存在「原生事件」在冒泡過程中觸發多個事件代理的情況。

[[405756]]

當bug來臨,沒有一片feature是無辜的。

現在,終于有點能體會為啥React團隊開發Concurrent Mode相關功能花了2年多時間。

真是,牽一發動全身啊~

參考資料

[1]material-ui:

https://github.com/mui-org/material-ui/issues/23215

[2]在線Demo地址:

https://codesandbox.io/s/react-playground-forked-v42kn

[3]離散事件:

https://github.com/facebook/react/blob/a8a4742f1c54493df00da648a3f9d26e3db9c8b5/packages/react-dom/src/events/ReactDOMEventListener.js#L294-L350

 

責任編輯:姜華 來源: 魔術師卡頌
相關推薦

2021-08-27 12:59:59

React前端命令

2025-09-02 08:15:47

2022-06-16 08:30:03

React 17null

2022-06-28 07:41:38

useMountReactahooks

2012-11-22 10:39:37

漏洞PDF文件

2021-05-21 09:34:40

React React 17前端

2022-03-24 12:28:03

React 17React 18React

2022-01-13 23:14:12

Windows 11Windows微軟

2022-10-10 08:28:57

接口內網服務AOP

2022-03-02 14:00:46

Nest.jsExpress端口

2024-10-17 10:25:34

2023-07-11 08:55:26

系統白名單AO

2009-11-27 11:26:02

VS2003.NET不

2024-07-08 11:30:35

2022-12-19 11:31:57

緩存失效數據庫

2017-02-21 13:11:43

SDN網絡體系SDN架構

2024-04-22 08:17:23

MySQL誤刪數據

2022-05-19 08:01:49

PostgreSQL數據庫

2009-11-03 08:56:02

linux死機操作系統

2019-10-12 09:50:46

Redis內存數據庫
點贊
收藏

51CTO技術棧公眾號

国产在线一卡二卡| 污污网站在线观看视频| 久久久久久久久亚洲精品| 日韩高清国产一区在线| 插插插亚洲综合网| 色综合久久五月| 九九九精品视频| 一区二区三区四区在线免费观看 | 亚洲综合资源| 亚洲一二三四久久| 日韩三级电影免费观看| 亚洲成熟女性毛茸茸| 玖玖视频精品| 久久男人资源视频| 色哟哟一一国产精品| 天堂在线精品| 日韩欧美一级二级三级久久久| 春日野结衣av| 免费毛片在线看片免费丝瓜视频| 久久免费国产精品| 国产经典一区二区三区| 中文字幕制服诱惑| 久久久久久穴| 国自产精品手机在线观看视频| 亚洲一级片在线播放| 欧美美女黄色| 日韩欧美国产三级| 国产乱女淫av麻豆国产| 欧美成人a交片免费看| 亚洲一区二区三区影院| 国产精品h视频| 国产福利小视频在线| 26uuu国产一区二区三区 | 亚洲成aⅴ人片久久青草影院| 91精品免费观看| 亚洲欧美国产中文| 欧美成a人片在线观看久| 婷婷综合另类小说色区| 国产成人精品免费看在线播放| 精品欧美不卡一区二区在线观看 | 亚洲激情女人| 久久天堂电影网| 制服丨自拍丨欧美丨动漫丨| 欧洲毛片在线视频免费观看| 亚洲欧美国产va在线影院| 亚洲久久久久久| 一区二区三区在线免费看| 欧美一级生活片| 人妻巨大乳一二三区| 国产精选久久| 日韩欧美一区二区三区在线| 一级日本黄色片| 精品久久亚洲| 日韩亚洲欧美一区| 交换做爰国语对白| 久久久国产精品入口麻豆| 欧美一区欧美二区| 亚洲国产欧美91| av不卡一区二区| 精品国产乱码久久久久久牛牛 | 亚洲婷婷影院| 亚洲男人天堂古典| 欧美性猛交xxxx乱| 日韩中文欧美| 久久久国产一区二区三区| 国产男女猛烈无遮挡在线喷水| 性欧美欧美巨大69| 欧美日韩国产成人在线| 久久久久久久久久久97| 亚洲青涩在线| 国产成人久久久| 中文字幕 自拍偷拍| 麻豆国产精品一区二区三区| 91久久精品国产91性色| 亚洲精品久久久久久久久久| 99精品国产99久久久久久白柏| 蜜桃导航-精品导航| 成人av毛片| 亚洲免费高清视频在线| 国产亚洲黄色片| 日韩精品三区| 91精品国产综合久久久久| 色综合久久久无码中文字幕波多| 日韩美女毛片| 日韩在线观看免费全集电视剧网站| 成人高潮免费视频| 在线不卡欧美| 国产精品久久久久9999| 国产成人精品毛片| 91丨九色porny丨蝌蚪| 一区不卡视频| 草草在线观看| 在线播放国产精品二区一二区四区| 国产精品久久久久久在线观看| 国语产色综合| 欧美国产第一页| 伊人成年综合网| 国产成人精品亚洲日本在线桃色| 欧美国产视频在线观看| 成人毛片av在线| 色噜噜狠狠色综合欧洲selulu| 国产精品中文久久久久久| 亚州av日韩av| 免费91麻豆精品国产自产在线观看| 超碰中文字幕在线| 国产伦精品一区二区三区免费| 久久本道综合色狠狠五月| 久久77777| 91激情在线视频| 日韩综合第一页| 91精品亚洲| 国产成人涩涩涩视频在线观看 | 人人精品久久| 亚洲欧美日韩精品| 国产亚洲欧美久久久久| 精品影视av免费| 日本一区视频在线播放| 僵尸再翻生在线观看| 欧美一二区视频| 国产农村妇女精品一区| 亚洲一区二区网站| 国产成人精品免费视频大全最热 | 久久理论片午夜琪琪电影网| 中文字幕在线一| 久久伊人中文字幕| 男女猛烈激情xx00免费视频| 日本在线一区二区| 在线观看亚洲区| 五月婷婷激情视频| 高清在线观看日韩| 潘金莲一级淫片aaaaaa播放1| 亚洲电影有码| 亚洲男人天堂古典| 69成人免费视频| www.亚洲色图.com| 国产精品一色哟哟| 大奶在线精品| 久久免费视频网站| 蜜桃在线一区二区| 亚洲韩国精品一区| 成人做爰www看视频软件| 欧美在线高清| 2014亚洲精品| 污片视频在线免费观看| 欧美一区二区三区的| 欧美精品久久久久久久久46p| 久久99精品久久久久久动态图| 先锋在线资源一区二区三区| а√天堂资源国产精品| 伊人伊人伊人久久| 中文字幕av网站| 国产精品乱码人人做人人爱| www.久久91| 国产精品99一区二区三区| 成人欧美一区二区三区黑人孕妇| 欧美69xxxx| 91麻豆精品国产综合久久久久久| 91香蕉一区二区三区在线观看| 经典一区二区三区| 日韩一级片一区二区| 成人午夜三级| 77777亚洲午夜久久多人| 色哟哟在线观看| 欧美综合一区二区三区| 手机在线中文字幕| 成人性生交大片免费| 青青草精品视频在线| 视频一区在线观看| 成人欧美一区二区三区黑人| 日本在线视频中文有码| 国产视频久久久久久久| 中文字幕免费视频观看| 一区在线中文字幕| 丰满少妇xbxb毛片日本| 久久精品网址| 一区中文字幕在线观看| 中文久久电影小说| 国产成人综合久久| 成人免费在线| 日韩精品亚洲精品| 国产精品国产一区二区三区四区 | 欧美福利在线播放网址导航| 情事1991在线| 国产素人视频在线观看| 亚洲激情第一页| 久久久久久久亚洲| 樱桃国产成人精品视频| 一起草在线视频| 男人的j进女人的j一区| 国产高清www| 成人羞羞网站入口| 国产精品中出一区二区三区| 日本一区免费网站| 欧美精品久久久久久久久久| 九九热视频在线观看| 日韩欧美国产wwwww| 91黑人精品一区二区三区| 亚洲精品成人天堂一二三| 泷泽萝拉在线播放| 国产二区国产一区在线观看| 天堂av在线网站| 亚洲激情另类| 亚洲黄色网址在线观看| 国产一区二区欧美| 国产伦精品一区二区三区视频黑人| 欧美aaaaaaaa| 欧美亚洲在线播放| 免费影视亚洲| 精品国产一区二区三区四区在线观看| 深爱五月激情五月| 日韩色视频在线观看| 中文在线资源天堂| 色婷婷久久99综合精品jk白丝| 国产一区二区播放| 国产精品亲子乱子伦xxxx裸| 亚洲第一黄色网址| 国产成人av电影在线观看| xx欧美撒尿嘘撒尿xx| 午夜亚洲视频| 免费看一级大黄情大片| 亚洲午夜久久久久久尤物| 亚洲一区二区免费视频软件合集| 亚洲免费毛片| 久久日韩精品| 欧美精品中文| 精品国产一区二区三区日日嗨| 婷婷综合国产| 91九色露脸| www.久久久.com| 91美女片黄在线观| 久久99久久久精品欧美| 国产精品久久激情| 亚洲四虎影院| 国产精品久久久久91| 欧美xxxx做受欧美护士| 国产精品久久久久久久久久久新郎| 欧美gv在线| 日本一区二区三区在线播放 | 国产又爽又黄的激情精品视频| 日韩天堂在线| 日本国产欧美一区二区三区| 亚洲精品动漫| 4388成人网| 美脚恋feet久草欧美| 欧美主播福利视频| 美女100%一区| 国产精品电影网站| 成人国产精品| 91日韩在线播放| 国产日韩一区二区三免费高清| 91最新国产视频| 天堂精品在线视频| 国内一区二区三区在线视频| 日韩欧美国产大片| 日韩欧美精品在线不卡 | 久久久久99精品成人片| 亚洲精品美女91| 欧美精品色婷婷五月综合| 狂野欧美一区| 国产成人在线综合| 国产盗摄女厕一区二区三区| 日本一区二区免费视频| 91女神在线视频| 亚洲国产日韩一区无码精品久久久| 中文字幕的久久| 青草影院在线观看| 午夜久久久影院| 日韩免费av网站| 欧美蜜桃一区二区三区| 亚洲成a人片77777精品| 日韩精品视频在线播放| melody高清在线观看| 欧美成人小视频| 国产在线天堂www网在线观看| 国产精品扒开腿做爽爽爽视频 | 7799精品视频| 免费观看国产视频| 国产一区二区三区直播精品电影| 国产在线高清视频| 97精品国产97久久久久久春色| 国产精品扒开腿做爽爽爽视频软件| 成人激情春色网| 偷拍视屏一区| 伊人久久大香线蕉av一区| 亚洲片区在线| 欧美日韩一区二区三区69堂| 国产成人99久久亚洲综合精品| 精品无码人妻一区| 亚洲男人的天堂在线aⅴ视频| 好看的av在线| 91精品国产丝袜白色高跟鞋| 欧洲成人av| 欧美乱人伦中文字幕在线| 悠悠资源网亚洲青| 亚洲一区二区三区在线免费观看| 日韩欧美美女在线观看| 综合网五月天| 久久人人超碰| 精品久久久久久无码人妻| 国产亚洲va综合人人澡精品 | 午夜精品电影| 亚洲色图38p| 成人精品高清在线| 性生交大片免费全黄| 欧美日韩裸体免费视频| 精品黑人一区二区三区在线观看| 国产一区二区三区高清在线观看| 99爱在线视频| 51国偷自产一区二区三区的来源| 国产最新精品| 亚洲中文字幕无码专区| 丰满少妇久久久久久久| 亚洲欧美精品久久| 在线观看亚洲成人| 色综合视频在线| 欧美日韩爱爱视频| 国产一区二区视频在线看| 亚洲成色最大综合在线| 久久久人人人| 一本色道综合久久欧美日韩精品| 有码一区二区三区| 国产毛片毛片毛片毛片毛片| 中文字幕不卡av| 欧美日韩亚洲国产| 欧美日本亚洲| 亚洲综合激情| 丰满大乳奶做爰ⅹxx视频 | 欧美一级欧美一级| 国产精品主播直播| 国产又粗又硬又长又爽| 欧美另类高清zo欧美| 日本中文字幕伦在线观看| 国产精品欧美风情| 成人影院天天5g天天爽无毒影院| www.com毛片| 99久久精品情趣| 国产无遮挡又黄又爽又色| 精品99久久久久久| 成人超碰在线| 国产午夜精品在线| 亚洲在线黄色| 亚洲天堂视频一区| 在线观看网站黄不卡| 电影av一区| 国产精品视频永久免费播放| 欧美日韩在线观看视频小说| 国产精品乱码久久久久| 欧美国产丝袜视频| 中国a一片一级一片| 久久精品中文字幕免费mv| 动漫一区二区三区| 狠狠精品干练久久久无码中文字幕 | 成人性视频欧美一区二区三区| 国产网红主播福利一区二区| 久久久精品毛片| 中文字幕亚洲欧美| 国产精品免费精品自在线观看| 第九区2中文字幕| 99re免费视频精品全部| 黄色污污网站在线观看| 爽爽爽爽爽爽爽成人免费观看| 国产麻豆一区二区三区| 国产精彩视频一区二区| 久久久精品欧美丰满| 中国一级片黄色一级片黄| 久久精品视频免费播放| 超碰cao国产精品一区二区| av日韩一区二区三区| 国产亚洲va综合人人澡精品| 91精品中文字幕| 高清视频欧美一级| 国产aⅴ精品一区二区三区久久| 无尽裸体动漫2d在线观看| 一区二区欧美在线观看| 色视频精品视频在线观看| 国产日韩在线观看av| 亚洲午夜伦理| 日本人亚洲人jjzzjjz| 日韩欧美一区在线| 都市激情亚洲一区| 精品一区二区成人免费视频| 97精品久久久午夜一区二区三区| 国产偷人爽久久久久久老妇app | 成人在线免费av| 国产精品日韩三级| 国产网站一区二区| 亚洲精品人妻无码| 国产精品久久久久久久久久| 欧美福利在线| jizz中文字幕| 亚洲国产99精品国自产| 久久青草免费| 成熟了的熟妇毛茸茸| 亚洲色图.com| 精品乱码一区二区三四区视频| 亚洲v.com| 国产91亚洲精品一区二区三区| 老司机精品视频网站| 久草网视频在线观看| 中文国产亚洲喷潮|