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

基于 JSX 的動態數據綁定

開發 開發工具
在創建了新的元素對象之后,我們需要對 createElement 函數傳入的后續參數進行處理,也就是為元素設置對應的屬性;基本的屬性包含了樣式類、行內樣式、標簽屬性、事件、子元素以及樸素的 HTML 代碼等。

[[199315]]

基于 JSX 的動態數據綁定歸屬于筆者的 React 與前端工程化實踐中的,本文中設計的引用資料參考 React 學習與實踐資料索引,如果有對 JavaScript 基礎語法尚存疑惑的可以參閱現代 JavaScript 開發:語法基礎與實踐技巧

基于 JSX 的動態數據綁定

筆者在 2016-我的前端之路: 工具化與工程化一文中提及,前端社區用了 15 年的時間來分割 HTML、JavaScript 與 CSS,但是隨著 JSX 的出現仿佛事物一夕回到解放前。在 Angular、Vue.js 等 MVVM 前端框架中都是采用了指令的方式來描述業務邏輯,而 JSX 本質上還是 JavaScript,即用 JavaScript 來描述業務邏輯。雖然 JSX 被有些開發者評論為丑陋的語法,但是筆者還是秉持 JavaScript First 原則,盡可能地用 JavaScript 去編寫業務代碼。在前文 React 初窺:JSX 詳解中我們探討了 JSX 的前世今生與基本用法,而本部分我們著手編寫簡單的面向 DOM 的 JSX 解析與動態數據綁定庫;本部分所涉及的代碼歸納于 Ueact 庫。

JSX 解析與 DOM 元素構建

元素構建

筆者在 JavaScript 語法樹與代碼轉化實踐 一文中介紹過 Babel 的原理與用法,這里我們仍然使用 Babel 作為 JSX 語法解析工具;為了將 JSX 聲明轉化為 createElement 調用,這里需要在項目的 .babelrc 文件中做如下配置:

  1. "plugins": [ 
  2.    "transform-decorators-legacy"
  3.    "async-to-promises"
  4.    [ 
  5.      "transform-react-jsx", { 
  6.        "pragma""createElement" 
  7.      } 
  8.    ] 
  9.  ], 

這里的 createElement 函數聲明如下:

  1. /** 
  2.  * Description 從 JSX 中構建虛擬 DOM 
  3.  * @param tagName 標簽名 
  4.  * @param props 屬性 
  5.  * @param childrenArgs 子元素列表 
  6.  */ 
  7. export function createElement( 
  8.   tagName: string, 
  9.   props: propsType, 
  10.   ...childrenArgs: [any
  11. ) {} 

該函數包含三個參數,分別指定標簽名、屬性對象與子元素列表;實際上經過 Babel 的轉化之后,JSX 文本會成為如下的函數調用(這里還包含了 ES2015 其他的語法轉化):

  1. ... 
  2.   (0, _createElement.createElement)( 
  3.     'section'
  4.     null
  5.     (0, _createElement.createElement)( 
  6.       'section'
  7.       null
  8.       (0, _createElement.createElement)( 
  9.         'button'
  10.         { className: 'link', onClick: handleClick }, 
  11.         'Custom DOM JSX' 
  12.       ), 
  13.       (0, _createElement.createElement)('input', { 
  14.         type: 'text'
  15.         onChange: function onChange(e) { 
  16.           console.log(e); 
  17.         } 
  18.       }) 
  19.     ) 
  20.   ), 
  21. ... 

在獲取到元素標簽之后,我們首先要做的就是創建元素;創建元素 createElementByTag 過程中我們需要注意區分普通元素與 SVG 元素:

  1. export const createElementByTag = (tagName: string) => { 
  2. if (isSVG(tagName)) { 
  3. return document.createElementNS('http://www.w3.org/2000/svg', tagName); 
  4.   } 
  5. return document.createElement(tagName); 
  6. }; 

屬性處理

在創建了新的元素對象之后,我們需要對 createElement 函數傳入的后續參數進行處理,也就是為元素設置對應的屬性;基本的屬性包含了樣式類、行內樣式、標簽屬性、事件、子元素以及樸素的 HTML 代碼等。首先我們需要對子元素進行處理:

  1. // 處理所有子元素,如果子元素為單純的字符串,則直接創建文本節點 
  2. const children = flatten(childrenArgs).map(child => { 
  3.   // 如果子元素同樣為 Element,則創建該子元素的副本 
  4. if (child instanceof HTMLElement) { 
  5. return child; 
  6.   } 
  7.  
  8. if (typeof child === 'boolean' || child === null) { 
  9.     child = ''
  10.   } 
  11.  
  12. return document.createTextNode(child); 
  13. }); 

這里可以看出,對 createElement 函數的執行是自底向上執行的,因此傳入的子元素參數實際上是已經經過渲染的 HTML 元素。接下來我們還需要對其他屬性進行處理:

  1. ... 
  2. // 同時支持 class 與 className 設置 
  3. const className = props.class || props.className; 
  4.  
  5. // 如果存在樣式類,則設置 
  6. if (className) { 
  7.   setAttribute(tagName, el, 'class', classNames(className)); 
  8.  
  9. // 解析行內樣式 
  10. getStyleProps(props).forEach(prop => { 
  11.   el.style.setProperty(prop.name, prop.value); 
  12. }); 
  13.  
  14. // 解析其他 HTML 屬性 
  15. getHTMLProps(props).forEach(prop => { 
  16.   setAttribute(tagName, el, prop.name, prop.value); 
  17. }); 
  18.  
  19. // 設置事件監聽,這里為了解決部分瀏覽器中異步問題因此采用同步寫法 
  20. let events = getEventListeners(props); 
  21.  
  22. for (let event of events) { 
  23.   el[event.name] = event.listener; 
  24. ... 

React 中還允許直接設置元素的內部 HTML 代碼,這里我們也需要判斷是否存在有 dangerouslySetInnerHTML 屬性:

  1. // 如果是手動設置 HTML,則添加 HTML,否則設置顯示子元素 
  2. if (setHTML && setHTML.__html) { 
  3.   el.innerHTML = setHTML.__html; 
  4. else { 
  5.   children.forEach(child => { 
  6.     el.appendChild(child); 
  7.   }); 

到這里我們就完成了針對 JSX 格式的樸素的 DOM 標簽轉化的 createElement 函數,完整的源代碼參考這里

簡單使用

這里我們依舊使用 create-webpack-app 腳手架來搭建示例項目,這里我們以簡單的計數器為例描述其用法。需要注意的是,本部分尚未引入雙向數據綁定,或者說是自動狀態變化更新,還是使用的樸素的 DOM 選擇器查詢更新方式:

  1. // App.js 
  2. import { createElement } from '../../../src/dom/jsx/createElement'
  3.  
  4. // 頁面內狀態 
  5. const state = { 
  6.   count: 0 
  7. }; 
  8.  
  9. /** 
  10.  * Description 點擊事件處理 
  11.  * @param e 
  12.  */ 
  13. const handleClick = e => { 
  14.   state.count++; 
  15.   document.querySelector('#count').innerText = state.count
  16. }; 
  17.  
  18. export default ( 
  19.   <div className="header"
  20.     <section
  21.       <section
  22.         <button className="link" onClick={handleClick}> 
  23.           Custom DOM JSX 
  24.         </button> 
  25.         <input type="text" 
  26.           onChange={(e)=>{ 
  27.             console.log(e); 
  28.           }} 
  29.         /> 
  30.       </section
  31.     </section
  32.     <svg> 
  33.       <circle cx="64" cy="64" r="64" style="fill: #00ccff;" /> 
  34.     </svg> 
  35.     <br /> 
  36.     <span id="count" style={{ color: 'red' }}> 
  37.       {state.count
  38.     </span> 
  39.   </div> 
  40. ); 
  41.  
  42. // client.js 
  43. // @flow 
  44.  
  45. import App from './component/Count'
  46.  
  47. document.querySelector('#root').appendChild(App); 

數據綁定

當我們使用 Webpack 在后端編譯 JSX 時,會將其直接轉化為 JavaScript 中函數調用,因此可以自然地在作用域中聲明變量然后在 JSX 中直接引用;不過筆者在設計 Ueact 時考慮到,為了方便快速上手或者簡單的 H5 頁面開發或者已有的代碼庫的升級,還是需要支持運行時動態編譯的方式;本部分我們即討論如何編寫 JSX 格式的 HTML 模板并且進行數據動態綁定。本部分我們的 HTML 模板即是上文使用的 JSX 代碼,不同的是我們還需要引入 babel-standalone 以及 Ueact 的 umd 模式庫:

然后在本頁面的 script 標簽中,我們可以對模板進行渲染并且綁定數據:

  1. <script> 
  2.   var ele = document.querySelector("#inline-jsx"); 
  3.  
  4.   Ueact.observeDOM( 
  5.     ele, 
  6.     { 
  7. state: { 
  8.         count: 0, 
  9.         delta: 1, 
  10.         items: [1, 2, 3] 
  11.       }, 
  12.       methods: { 
  13.         handleClick: function () { 
  14.           this.state.count+=this.state.delta; 
  15.           this.state.items.push(this.state.count); 
  16.         }, 
  17.         handleChange:function (e) { 
  18.           let value = parseInt(e.target.value); 
  19.           if(!Number.isNaN(value)){ 
  20.             this.state.delta = value; 
  21.           } 
  22.         } 
  23.       }, 
  24.       hooks: { 
  25.         mounted: function () { 
  26.           console.log('mounted'); 
  27.         }, 
  28.         updated:function () { 
  29.           console.log('updated'); 
  30.         } 
  31.       } 
  32.     }, 
  33.     Babel 
  34.   ); 
  35. </script> 

這里我們調用 Ueact.observeDOM 函數對模板進行渲染,該函數會獲取指定元素的 outerHTML 屬性,然后通過 Babel 動態插件進行編譯:

  1. let input = html2JSX(ele.outerHTML); 
  2.  
  3.    let output = Babel.transform(input, { 
  4.      presets: ['es2015'], 
  5.      plugins: [ 
  6.        [ 
  7.          'transform-react-jsx'
  8.          { 
  9.            pragma: 'Ueact.createElement' 
  10.          } 
  11.        ] 
  12.      ] 
  13.    }).code; 

值得一提的是,因為 HTML 語法與 JSX 語法存在一定的差異,我們獲取渲染之后的 DOM 對象之后,還需要對部分元素語法進行修正;主要包括了以下三個場景:

  • 自閉合標簽處理,即 <input > => <input />
  • 去除輸入的 HTML 中的事件監聽的引號,即 onclick="{methods.handleClick}" => onclick={methods.handleClick}
  • 移除 value 值額外的引號,即 value="{state.a}" => value={state.a}

到這里我們得到了經過 Babel 轉化的函數調用代碼,下面我們就需要去執行這部分代碼并且完成數據填充。最簡單的方式就是使用 eval 函數,不過因為該函數直接暴露在了全局作用域下,因此并不被建議使用;我們使用動態構造 Function 的方式來進行調用:

 

  1. /** 
  2.  * Description 從輸入的 JSX 函數字符串中完成構建 
  3.  * @param innerContext 
  4.  */ 
  5. function renderFromStr(innerContext) { 
  6.   let func = new Function
  7.     'innerContext'
  8.     ` 
  9.      let { state, methods, hooks } = innerContext; 
  10.      let ele = ${innerContext.rawJSX} 
  11. return ele; 
  12.     ` 
  13.   ).bind(innerContext); 
  14.  
  15.   // 構建新節點 
  16.   let newEle: Element = func(innerContext); 
  17.  
  18.   // 使用指定元素的父節點替換自身 
  19.   innerContext.root.parentNode.replaceChild(newEle, innerContext.root); 
  20.  
  21.   // 替換完畢之后刪除舊節點的引用,觸發 GC 
  22.   innerContext.root = newEle; 

innerContext 即包含了我們定義的 State 與 Methods 等對象,這里利用 JavaScript 詞法作用域(Lexical Scope)的特性進行變量傳遞;本部分完整的代碼參考這里。

變化監聽與重渲染

筆者在 2015-我的前端之路:數據流驅動的界面中討論了從以 DOM 為核心到數據流驅動的變化,本部分我們即討論如何自動監聽狀態變化并且完成重渲染。這里我們采用監聽 JavaScript 對象屬性的方式進行狀態變化監聽,采用了筆者另一個庫 Observer-X,其基本用發如下:

  1. import { observe } from '../../dist/observer-x'
  2.  
  3. const obj = observe( 
  4.   {}, 
  5.   { 
  6.     recursive: true 
  7.   } 
  8. ); 
  9.  
  10. obj.property = {}; 
  11.  
  12. obj.property.listen(changes => { 
  13.   console.log(changes); 
  14.   console.log('changes in obj'); 
  15. }); 
  16.  
  17. obj.property.name = 1; 
  18.  
  19. obj.property.arr = []; 
  20.  
  21. obj.property.arr.listen(changes => { 
  22.   // console.log('changes in obj.arr'); 
  23. }); 
  24.  
  25. // changes in the single event loop will be print out 
  26.  
  27. setTimeout(() => { 
  28.   obj.property.arr.push(1); 
  29.  
  30.   obj.property.arr.push(2); 
  31.  
  32.   obj.property.arr.splice(0, 0, 3); 
  33. }, 500); 

核心即是當某個對象的屬性發生變化(增刪賦值)時,觸發注冊的回調事件;即:

  1. ... 
  2.   // 將內部狀態轉化為可觀測變量 
  3.   let state = observe(innerContext.state); 
  4.   ... 
  5. state.listen(changes => { 
  6.     renderFromStr(innerContext); 
  7.     innerContext.hooks.updated && innerContext.hooks.updated(); 
  8.   }); 
  9.   ... 

【本文是51CTO專欄作者“張梓雄 ”的原創文章,如需轉載請通過51CTO與作者聯系】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2012-01-09 11:26:15

Java

2016-12-14 14:29:30

Java動態綁定機制

2009-06-18 14:40:44

TreeView動態綁

2021-12-12 20:10:49

域名動態IP

2021-09-01 10:37:25

鴻蒙HarmonyOS應用

2022-02-18 08:28:49

域名公網IP

2021-09-14 18:33:39

React 數據交互

2011-07-27 08:56:32

Oracle數據庫綁定變量軟解析

2014-12-29 10:19:01

Java

2021-09-01 14:36:14

鴻蒙HarmonyOS應用

2011-08-22 09:34:50

Objective-C多態動態類型

2023-10-20 09:51:00

編程開發

2009-07-28 08:24:16

GridView綁定數

2010-07-28 13:40:44

Flex數據綁定

2011-12-05 13:44:34

JavaSpringMVC

2009-06-18 14:13:53

動態化系統OSGi

2010-07-28 13:11:13

Flex數據綁定

2012-05-29 16:22:02

SpringMVC

2010-07-28 13:31:10

Flex數據綁定

2017-07-25 08:54:26

前端JsxVue
點贊
收藏

51CTO技術棧公眾號

国产精品玖玖玖| a级大片在线观看| 男女在线观看视频| 国产 欧美在线| 午夜精品久久久久久久99黑人| 日韩av.com| 国产精品剧情一区二区在线观看| 成人黄色一级视频| 国产精品www网站| 欧美激情 一区| 999精品视频在线观看| 一区二区三区日韩精品| 麻豆一区区三区四区产品精品蜜桃| 青青草视频在线观看免费| 国产精品99视频| 3d动漫精品啪啪1区2区免费| 久久福利一区二区| 亚洲欧洲成人在线| 韩国一区二区在线观看| 久久久久久久久国产| 在线观看福利片| 国产麻豆精品| 日韩欧美a级成人黄色| 亚洲伊人婷婷| 日本加勒比一区| 久久精品噜噜噜成人av农村| 欧美大荫蒂xxx| 日韩视频在线观看免费视频| 中文字幕视频精品一区二区三区| 91激情五月电影| 99久久99久久精品| 青青草免费在线视频| 国产中文字幕精品| 日韩免费在线看| 国产亚洲精品码| 成人在线丰满少妇av| 欧美精品一区二区三区很污很色的| 国内精品视频一区二区三区| 香蕉视频国产在线观看| av成人免费在线| 91人人爽人人爽人人精88v| 99精品在线播放| 国产精品mm| 深夜成人在线观看| 成人性生交大免费看| 中文字幕区一区二区三| 欧美日本在线播放| 国产精品少妇在线视频| 成人av影院在线观看| 中文字幕中文字幕在线一区| 久久五月天婷婷| www.亚洲欧美| 狠狠色伊人亚洲综合成人| 国产91网红主播在线观看| 久久久无码精品亚洲国产| 久久影院一区| 这里只有精品视频| 日本五十肥熟交尾| 在线播放一区二区精品视频| 欧美一区午夜视频在线观看 | 色91精品久久久久久久久| 亚洲一区站长工具| 欧美视频一二三| 国产婷婷一区二区三区| 后进极品白嫩翘臀在线播放| 亚洲精品国产精品乱码不99| 91视频 - 88av| www在线看| 亚洲午夜免费视频| 久久精品无码中文字幕| xxx在线免费观看| 五月天网站亚洲| 国产在线精品91| 人狥杂交一区欧美二区| 狠狠综合久久av一区二区小说| 波多野结衣av一区二区全免费观看| av色综合久久天堂av色综合在| 日韩美女视频19| 欧美交换配乱吟粗大25p| 日韩伦理av| 亚洲成年人网站在线观看| 日本熟妇人妻xxxx| www免费在线观看| 亚洲综合区在线| 中文字幕无码精品亚洲35| 操人在线观看| 婷婷夜色潮精品综合在线| 成年女人18级毛片毛片免费| av资源在线播放| 91福利在线观看| 污污网站在线观看视频| 日韩精品视频中文字幕| 亚洲精品按摩视频| 国产毛片久久久久久久| 91综合视频| 九九久久久久久久久激情| 久久久久性色av无码一区二区| 亚洲精一区二区三区| 日本高清不卡的在线| 久久精品偷拍视频| 国产一本一道久久香蕉| 狠狠色狠狠色综合人人| 国产69久久| 一区二区三区日韩| 亚洲国产精品无码观看久久| 欧美暴力调教| 欧美一级午夜免费电影| 久久久久久无码精品人妻一区二区| 高清一区二区三区av| 亚洲精品久久久久中文字幕二区| 谁有免费的黄色网址| 亚洲激情久久| 91成人天堂久久成人| 在线观看中文字幕av| 99精品久久99久久久久| 日韩最新中文字幕| 超碰一区二区| 日韩一级成人av| 中文字幕免费在线看线人动作大片| 亚洲午夜精品一区 二区 三区| 97精品伊人久久久大香线蕉 | 欧美日韩免费不卡视频一区二区三区| 午夜激情视频网| 农村少妇一区二区三区四区五区| 日韩中文在线中文网三级| 国产在线综合网| 日一区二区三区| 国产精品污www一区二区三区| 成人在线免费观看| 香蕉成人啪国产精品视频综合网| 国产成年人视频网站| 99精品国产一区二区三区2021| 亚洲视频免费一区| 五月天婷婷网站| 狠狠色狠狠色综合系列| 亚洲成人av动漫| 伊人网在线播放| 日韩精品中午字幕| 亚洲欧美综合7777色婷婷| 99亚洲伊人久久精品影院红桃| 91精品久久久久| 精品推荐蜜桃传媒| 懂色aⅴ精品一区二区三区蜜月| 亚洲制服中文字幕| 色一区二区三区四区| 日本伊人精品一区二区三区介绍 | 久久精品电影| 精品婷婷色一区二区三区蜜桃| 色av手机在线| 777亚洲妇女| 正在播放国产对白害羞| 久久综合五月| 欧美人与性禽动交精品| 大黄网站在线观看| 精品少妇一区二区三区日产乱码 | 波多野结衣啪啪| 91一区二区三区在线播放| 一本久道高清无码视频| 色播一区二区| 欧美成人激情在线| 一级欧美一级日韩| 亚洲欧美中日韩| 亚洲精品成人在线播放| 日韩免费视频| 国产精品久久9| melody高清在线观看| 欧美在线综合视频| 久久免费手机视频| 免费观看在线色综合| 一本久久a久久精品vr综合| av成人亚洲| 最新国产精品拍自在线播放 | 日韩在线一区二区三区| 欧美精品一区二区三区久久久| 人妻互换一区二区激情偷拍| 日韩中文字幕一区二区三区| 欧美精品一区二区三区久久| 欧美成人ⅴideosxxxxx| 亚洲欧美日韩在线一区| 黄色片视频免费| 91免费版在线| 国产av人人夜夜澡人人爽| 日本成人小视频| 成人国产精品一区二区| 成人免费观看视频大全| 欧美一区二区视频在线观看2022| 疯狂试爱三2浴室激情视频| 精品一区二区三区欧美| 久久观看最新视频| 九色丨蝌蚪丨成人| 欧美亚洲在线观看| 亚洲成a人v欧美综合天堂麻豆| 欧美精品一二三| 日本中文字幕免费在线观看| 国产成人精品三级| 欧美a级免费视频| 久久影视三级福利片| 国产福利精品av综合导导航| 欧美尤物美女在线| 精品伦理精品一区| 亚洲婷婷综合网| 国产精品久久久久一区二区三区| 中文字幕第六页| 国产精品99一区二区| 欧美一区2区三区4区公司二百| 欧洲精品久久久久毛片完整版| 欧美精品一区二区免费| 深夜福利在线观看直播| 欧美久久久久久久久久| 国产中文av在线| 不卡影院免费观看| 三年中国国语在线播放免费| 97人人精品| 精品国产一区二区三区四区vr| 精品无人乱码一区二区三区| 欧美黑人性生活视频| 成a人片在线观看www视频| 日韩精品一区二区三区中文不卡 | 国产欧美va欧美va香蕉在| 国产超级va在线视频| 日韩精品中文字幕在线观看| 国产精品一级视频| 天天做天天摸天天爽国产一区| 免费成人深夜蜜桃视频| 91亚洲永久精品| 三级网站免费看| 日本午夜精品视频在线观看| 国产福利片一区二区| 神马影视一区二区| 91在线在线观看| 国产经典一区| 欧美最猛性xxxxx(亚洲精品)| 日韩欧美中文字幕公布| 欧美一区免费观看| 国产午夜亚洲精品不卡| 成人精品在线观看视频| 成人av在线资源网站| 久久出品必属精品| 久草这里只有精品视频| 91女神在线观看| 蜜臀av性久久久久蜜臀aⅴ四虎| 久久精品网站视频| 每日更新成人在线视频| 男人和女人啪啪网站| 亚洲黄色影院| 怡红院av亚洲一区二区三区h| 在线视频观看日韩| 色欲色香天天天综合网www| 国产精品草草| 免费无码毛片一区二三区| 亚洲国产一区二区三区a毛片| 精品少妇在线视频| 亚洲国产免费| 欧美日韩在线中文| 日本美女一区二区| 四季av一区二区三区| 韩国三级在线一区| 一二三区视频在线观看| 成人精品gif动图一区| 精品无码人妻少妇久久久久久| 成a人片亚洲日本久久| 水蜜桃av无码| 国产亚洲精品免费| 黄色精品视频在线观看| 亚洲精品乱码久久久久久 | 51精产品一区一区三区| 麻豆视频传媒入口| 精品91久久久久| 欧美 日韩精品| 日韩成人午夜电影| 亚洲欧美日韩一二三区| 成人高清伦理免费影院在线观看| 国产人妻人伦精品1国产丝袜| 久久久久亚洲蜜桃| 国产白丝一区二区三区| 一区二区三区在线观看网站| 国产网址在线观看| 在线欧美日韩国产| 97超碰中文字幕| 精品播放一区二区| 噜噜噜噜噜在线视频| 久久久精品视频成人| 久久99亚洲网美利坚合众国| 欧美最猛黑人xxxx黑人猛叫黄| 日韩一区二区三区四区五区| 成人免费视频视频在| 国产欧美日韩视频在线| 亚洲国产精品影视| 亚洲精品色图| 中文字幕66页| 91在线码无精品| 日韩免费av一区| 午夜精品久久久久久久久久久| 91在线视频免费播放| 日韩一区二区免费在线电影| 美女毛片在线看| 欧美高清在线观看| 97人人做人人爽香蕉精品| 国产精品伊人日日| 欧美电影免费| 久久久久久久久久久视频| 国产最新精品免费| 色欲av无码一区二区三区| 亚洲精品一卡二卡| 性高潮视频在线观看| 亚洲成色999久久网站| 日本三级在线视频| 日韩美女视频中文字幕| 亚洲国产欧美国产第一区| 日本一区二区不卡高清更新| 欧美日韩网址| www.午夜av| 国产色产综合色产在线视频| 一级aaa毛片| 欧美一级片免费看| youjizz在线播放| 日本精品视频网站| 激情小说亚洲色图| 中文字幕人妻熟女人妻洋洋| 激情伊人五月天久久综合| 中字幕一区二区三区乱码| 欧美日韩午夜激情| 囯产精品一品二区三区| 欧美老少配视频| 国产麻豆精品| 久久免费看毛片| 日韩av在线免费观看不卡| 大地资源二中文在线影视观看| 夜夜亚洲天天久久| 成人1区2区3区| 欧美成人午夜激情| 欧美中文高清| 麻豆传媒网站在线观看| 国产在线观看一区二区| 蜜桃av免费在线观看| 欧美性感一区二区三区| 国产露出视频在线观看| 日韩男女性生活视频| 国产精品一区2区3区| 日韩在线第三页| 97se亚洲国产综合自在线观| 日本一级黄色录像| 亚洲国产精品99久久| 成入视频在线观看| 久草精品电影| 久久久久久9| 色婷婷国产精品免| 欧美片网站yy| 免费人成在线观看播放视频| 国产专区精品视频| 欧美 日韩 国产 一区| 自拍视频第一页| 性做久久久久久久免费看| 日韩一区二区三区在线观看视频| 久久久久亚洲精品| 日韩欧美美女在线观看| 黄色一级视频片| 国产色婷婷亚洲99精品小说| 中文字幕乱码人妻无码久久| 久久精品91久久久久久再现| 精品国产亚洲一区二区三区在线 | 久久久久久久久久久久久9999| 香蕉成人久久| 极品蜜桃臀肥臀-x88av| 欧美人妇做爰xxxⅹ性高电影| 国产激情小视频在线| 粉嫩高清一区二区三区精品视频 | 国产精品999999| 欧美韩国日本在线观看| 国产老头和老头xxxx×| 亚洲va天堂va国产va久| 精品美女视频在线观看免费软件 | 国产成人av免费| 欧美成人激情在线| 日本一道高清一区二区三区| 久久九九国产视频| 亚洲激情校园春色| 亚洲av毛片成人精品| 国产精品丝袜高跟| 欧美三区在线| 中文字幕av久久爽一区| 欧美一级一区二区| 中文在线免费二区三区| 一区二区冒白浆视频| 国产69精品久久777的优势| 久久精品一二区| 久久九九热免费视频| 青草久久视频| 想看黄色一级片| 欧美视频中文在线看| gogo在线高清视频| 免费成人看片网址| 大美女一区二区三区| 波多野结衣mp4| 欧美精品久久久久久久久| 欧美性感美女一区二区| 永久免费未满蜜桃| 9191成人精品久久| 欧亚一区二区| 国产美女主播在线|