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

手把手教你實現省市區鎮—四級地址選擇彈窗組件

系統 OpenHarmony
本文詳細介紹了關于在華為鴻蒙系統 去實現一個自定義彈窗的詳細教程,主要是提供一些思路,了解組件之間通信的技巧,以及如何實現一個地址級聯選中的詳細過程。

想了解更多關于開源的內容,請訪問:

51CTO 鴻蒙開發者社區

https://ost.51cto.com

前言

hello 大家好,我是無言,因為地址級聯選擇功能其實還是非常常見的,而且官方有TextPicker文本選擇組件也可以實現地址級聯選擇,但是我發現超過3級之后,文字就太多了,會很難看,不好操作等相關問題。所以有必要自己來實現一個好看的省市區鎮-四級地址級聯選擇組件。

目的

通過本篇文章小伙伴們能學到什么?我簡單的總結了一下大概有以下幾點。

  • 了解到鴻蒙Next 自定義彈窗 的核心用法。
  • 了解到 實現級聯選擇的實現思路和過程,不僅限于鴻蒙,也適用于其他框架和場景。
  • 了解到鴻蒙Next中如何封裝自己的自定義組件。
  • 了解到鴻蒙Next中組件之間是如何通信的,以及如何實現自己想要的功能。

效果提前看一看:

實現過程

一、準備工作

  • 安裝好最新DevEco Studio 開發工具,創建一個新的空項目。
  • 新增目錄結構 ets/components/cascade/ ,在下面添加文件 addressObj.ts 用于存放地址Obj對象,index.ets 用來初始化彈窗容器,CustomAddress.ets用來存放具體的級聯選擇業務代碼,Cascade.d.ts TS 聲明文件。

二、實現自定義彈窗

  • 將官網自定義彈窗的示例3復制過來,放入到ets/components/cascade/index.ets中后稍微修改一下,修改的地方我都添加注釋了。 主要是 去掉 @Entry 頁面的入口組件裝飾,修改組件命名并用 export暴露組件供外部使用。
// xxx.ets
@CustomDialog
struct CustomDialogExample {
  controller?: CustomDialogController
  cancel: () => void = () => {
  }
  confirm: () => void = () => {
  }
  build() {
    Column() {
      Text('這是自定義彈窗')
        .fontSize(30)
        .height(100)
      Button('點我關閉彈窗')
        .onClick(() => {
          if (this.controller != undefined) {
            this.controller.close()
          }
        })
        .margin(20)
    }
  }
}
// @Entry  去掉入口頁面標志
@Component
export  struct CustomDialogCascade { //修改命名 注意前面加了 export 需要暴露組件
  dialogController: CustomDialogController | null = new CustomDialogController({
    builder: CustomDialogExample({
      cancel: ()=> { this.onCancel() },
      confirm: ()=> { this.onAccept() }
    }),
    cancel: this.existApp,
    autoCancel: true,
    onWillDismiss:(dismissDialogAction: DismissDialogAction)=> {
      console.info("reason=" + JSON.stringify(dismissDialogAction.reason))
      console.log("dialog onWillDismiss")
      if (dismissDialogAction.reason == DismissReason.PRESS_BACK) {
        dismissDialogAction.dismiss()
      }
      if (dismissDialogAction.reason == DismissReason.TOUCH_OUTSIDE) {
        dismissDialogAction.dismiss()
      }
    },
    alignment: DialogAlignment.Center,
    offset: { dx: 0, dy: -20 },
    customStyle: false,
    cornerRadius: 20,
    width: 300,
    height: 200,
    borderWidth: 1,
    borderStyle: BorderStyle.Dashed,//使用borderStyle屬性,需要和borderWidth屬性一起使用
    borderColor: Color.Blue,//使用borderColor屬性,需要和borderWidth屬性一起使用
    backgroundColor: Color.White,
    shadow: ({ radius: 20, color: Color.Grey, offsetX: 50, offsetY: 0}),
  })
  // 在自定義組件即將析構銷毀時將dialogController置空
  aboutToDisappear() {
    this.dialogController = null // 將dialogController置空
  }

  onCancel() {
    console.info('Callback when the first button is clicked')
  }

  onAccept() {
    console.info('Callback when the second button is clicked')
  }

  existApp() {
    console.info('Click the callback in the blank area')
  }

  build() {
    Column() {
      Button('click me')
        .onClick(() => {
          if (this.dialogController != null) {
            this.dialogController.open()
          }
        }).backgroundColor(0x317aff)
    }.width('100%').margin({ top: 5 })
  }
}
  • 修改ets/pages/index.ets 去掉無關的代碼,在頁面中引入我們的組件。
import {CustomDialogCascade} from "../components/cascade/index"

@Entry
@Component
struct Index {
  build() {
    RelativeContainer() {
      CustomDialogCascade()
    }
    .height('100%')
    .width('100%')
  }
}

預覽一下看看效果。

三、實現父子組件的通信

在講后續功能前,這里有必要講一下鴻蒙開發組件狀態。

  • @State用于裝飾當前組件的狀態變量而且必須初始化,@State裝飾的變量在發生變化時,會驅動當前組件的視圖刷新。
  • @Prop用于裝飾子組件的狀態變量而且不允許本地初始化,@Prop裝飾的變量會同步父組件的狀態,但只能單向同步。
  • @Link用于裝飾子組件的狀態變量而且不允許本地初始化,@Prop變量同樣會同步父組件狀態,但是能夠雙向同步。
  • @Provide和@Consume用于跨層級傳遞狀態信息,其中@Provide用于裝飾祖先組件的狀態變量,@Consume用于裝飾后代組件的狀態變量。@Provide裝飾變量必須本地初始化,而@Consume裝飾的變量不允許本地初始化,
    而且他們能夠雙向同步。
  • @Props與@Link聲明接收的屬性,必須是@State的屬性,而不能是@State屬性對象中嵌套的屬性解決辦法將嵌套對象的類型用class定義, 并使用@Observed來裝飾,子組件中定義的嵌套對象的屬性, 使用@ObjectLink來裝飾。
  • @Watch用來監視狀態數據的變化,包括:@State、@Prop、@Link、@Provide、@Consume
    一旦狀態數據變化,監視的回調就會調用,這里我有必要加一個示例。
@State @Watch('onCountChange') count: number = 0

/**
 * 一旦count變化,此回調函數就會自動調用
 * @param count  被監視的狀態屬性名
 */
onCountChange (count) {
  // 可以在此做特定處理
}

四、完善邏輯

好了回到我們的主題,前面我們的示例中,只是子組件自己調用彈窗了,我們要實現以下幾個功能。

  • 父組件調用子組件方法喚醒子組件彈窗。
  • 父組件傳參控制選擇地址的層級數量。
  • 子組件選好數據之后回調方法傳給父組件。

修改 /ets/components/cascade/index.ets,實現父組件傳參給子組件,子組件回調方法傳值給父組件。然后還修改了彈窗的樣式以及位置,詳細請看下面代碼。

// xxx.ets
@CustomDialog
struct CustomDialogExample {
  controller?: CustomDialogController
  @Prop level: number;
  cancel: () => void = () => {
  }
  confirm: (data:string) => void = () => {
  }
  build() {
    Column() {
      Text('這是自定義彈窗')
        .fontSize(30)
        .height(100)
      Text('層級'+this.level)
      Button('點我關閉彈窗')
        .onClick(() => {
          if (this.controller != undefined) {
            this.controller.close()
          }
          this.confirm('aaa') //回傳信息
        })
        .margin(20)
    }
  }
}
// @Entry  去掉入口頁面標志
@Component
export  struct CustomDialogCascade { //修改命名 注意前面加了 export 需要暴露組件
  @Link CustomDialogController: CustomDialogController | null ;
  @Prop level: number;
  cancel?: () => void
  confirm?: (data:string) => void = () => {
  }
  aboutToAppear(): void {
    this.CustomDialogController=  new CustomDialogController({
      builder: CustomDialogExample({
        cancel: this.cancel,
        confirm: this.confirm,
        level:this.level,
      }),
      autoCancel: true,
      onWillDismiss:(dismissDialogAction: DismissDialogAction)=> {
        if (dismissDialogAction.reason == DismissReason.PRESS_BACK) {
          dismissDialogAction.dismiss()
        }
        if (dismissDialogAction.reason == DismissReason.TOUCH_OUTSIDE) {
          dismissDialogAction.dismiss()
        }
      },
      alignment: DialogAlignment.Bottom,
      offset: { dx: 0, dy:  0},
      customStyle: false,
      cornerRadius: 0,
      width: '100%',
      backgroundColor: Color.White,
    })
  }
  aboutToDisappear() {
    this.CustomDialogController = null // 將dialogController置空
  }


  build() { //因為用的 自定義彈窗功能,所以這下面可以為空

  }
}

修改/ets/pages/index.ets 文件實現功能主要是父元素調用子組件方法,以及子組件的回調方法調用。

import {CustomDialogCascade} from "../components/cascade/index"

@Entry
@Component
struct Index {

  @State CustomDialogController :CustomDialogController|null = null;
  build() {
    Column() {
      Button('打開彈窗')
        .onClick(()=>{
          this.CustomDialogController?.open()
        })
      CustomDialogCascade(
        {
          level:3,//層級 最大4  最小1
          CustomDialogController:this.CustomDialogController, //彈窗實體類 主要控制彈窗顯示隱藏等
          confirm:(data)=>{
            console.log('data',(data))
          }
        },
      )
    }
    .height('100%')
    .width('100%')
  }
}

運行效果如下,點擊 點我關閉彈窗 按鈕可以發現 子組件的回調信息 aaa 在父組件中成功打印。

五、完善地址級聯邏輯

  • 因為對象取值性能最好,速度也快,所以我這里采用的是對象信息結構,在 addressObj.ts 文件中存放我們的所有城市信息,因為內容過多,我就只舉例展示部分,我將完整的城市信息,放在了本文末尾,有需要的小伙伴可以自己下載下來嘗試一下。
export const regionDict = {
  "86": {
    "110000": "北京市",
    "120000": "天津市",
    "130000": "河北省",
    ...
  },
  "110000": {
    "110100": "北京市"
  },
  "110100": {
    "110101": "東城區",
    "110102": "西城區",
    "110105": "朝陽區",
    "110106": "豐臺區",
    "110107": "石景山區",
    "110108": "海淀區",
    "110109": "門頭溝區",
    "110111": "房山區",
    "110112": "通州區",
    "110113": "順義區",
    "110114": "昌平區",
    "110115": "大興區",
    "110116": "懷柔區",
    "110117": "平谷區",
    "110118": "密云區",
    "110119": "延慶區"
  },
  "110101": {
    "110101001": "東華門街道",
    "110101002": "景山街道"
  },
  ...
};
  • 聲明文件 Cascade.d.ts 添加類型。
export  interface RegionType{
  code?:string;
  pcode?:string;
  name?:string
}

export  type levelNumber = 1 | 2 | 3 | 4;
  • 修改 CustomAddress.ets 完成我們主要的核心業務代碼,內容比較多,該添加注釋的地方我都添加了,具體功能代碼請看下面內容。
import { regionDict } from "./addressObj"
import {RegionType,levelNumber} from './Cascade'

@CustomDialog
export  struct CustomAddress {
  controller?: CustomDialogController
  @State region:RegionType[]=[]; //存放選中的結果
  @State data: RegionType[] = [];// 提供選中的列表
  @State step:number = 0;//存放步數
  @State active:number = 0;//當前高亮步驟
  level:levelNumber=4; //層級 默認 為 4級 可以選鎮街道一級
  cancel: () => void = () => {
    console.log('關閉')
  }
  confirm: (region:RegionType[]) => void = () => {
  }
  // 頁面加載執行
  aboutToAppear(): void {
    this.loadRegionData('86')
  }
  /**
   * 根據父元素code生成列表數據
   * @param pcode
   */
  loadRegionData(pcode = '86') {
    this.data.length=0
    Object.keys(regionDict).forEach((code)=>{
      if(code==pcode){
        Object.keys(regionDict[code]).forEach((key)=>{
          this.data.push({
            name:regionDict[code][key],
            code:key,
            pcode:pcode
          })
        })
      }
    })
    if(this.data.length == 0) {
      this.controller?.close() //關閉彈窗
    }
  }
  // 上面步驟選中
  onStepClickSelect(index:number,item:RegionType){
    this.active=index;
    this.loadRegionData(item.pcode)
  }
  // 數據選中
  onRowClickSelect(item:RegionType){
    if(this.active==3 || this.active>=(this.level-1)){ //如果是到了最后一步選擇街道 則直接結束
      this.region.push(item)
      this.confirm(this.region)
      this.controller?.close()//關閉彈窗
      return
    }
    if(this.active==this.step){
      this.step++;
      this.active++;
    }else{
      this.region= this.region.slice(0,this.active) //數組截取
      this.active++; //從選中的地方重新開始
      this.step=this.active //步驟也是一樣重新開始
    }
    this.region.push(item)
    this.loadRegionData(item.code)

  }
  // 獲取名稱
  getLableName(){
    let name =`請選擇`
    switch (this.step){
      case 0:
        name=`請選擇省份/地區`
        break;
      case 1:
        name=`請選擇城市`
        break;
      case 2:
        name=`請選擇區縣`
        break;
      case 3:
        name=`請選擇街道`
        break;
    }
    return name
  }

  build() {
    Column() {
      // 存儲已選擇信息
      Column(){
        ForEach(this.region, (item: RegionType,index:number) => {
          Flex({alignItems:ItemAlign.Center}){
            Row(){
              Text()
                .backgroundColor(this.active>=index?'#396ec1':'#ff737070')
                .width(6)
                .height(6)
                .borderRadius(10)
              // 頂部線條
              if (index>0){
                Text()
                  .width(1)
                  .height(13)
                  .position({left:2,top:0})
                  .backgroundColor(this.active>index?'#396ec1':'#ff737070')
              }
              // 底部線條
              if(this.step>=index){
                Text()
                  .width(1)
                  .height(13)
                  .position({left:2,top:'50%'})
                  .backgroundColor(this.active>index?'#396ec1':'#ff737070')
              }
            }.height(25)
            .width(20)
            .align(Alignment.Center)
            Row(){
              Text(item.name).fontSize(14).fontColor('#333333')
            }
            .flexGrow(1)
            .height(25)
            .border({
              width: { bottom:1 },
              color: 0xf5f5f5,
              style: {
                left:null,
                right: null,
                top: null,
                bottom: BorderStyle.Solid
              }
            })
            .onClick(()=>{
              this.onStepClickSelect(index,item)
            })
          }.width('100%')
          .padding({left:10})
        })
        // 提示信息
        Flex({alignItems:ItemAlign.Center}){
          Row(){
            Text()
              .backgroundColor(this.active==this.step?'#396ec1':'#ff737070')
              .width(6)
              .height(6)
              .borderRadius(10)
            // 頂部線條
            if(this.step){
              Text()
                .width(1)
                .height(13)
                .position({left:2,top:0})
                .backgroundColor(this.active==this.step?'#396ec1':'#ff737070')
            }
          }.height(25)
          .width(20)
          .align(Alignment.Center)
          Row(){
            Text(this.getLableName()).fontSize(14).fontColor(this.active==this.step?'#396ec1':'#333')
          }
          .flexGrow(1)
          .height(25)
        }.width('100%')
        .padding({left:10})
      }.padding({top:10,bottom:10})
      // 分割線
      Column(){

      }.height(10)
      .backgroundColor(0xf5f5f5)
      .width('100%')
      // 下方列表
      Column(){
        List({ space: 5, initialIndex: 0 }) {
          ForEach(this.data, (item: RegionType) => {
            ListItem() {
              Text('' + item.name)
                .width('100%')
                .fontSize(14)
                .fontColor('#333333')
                .textAlign(TextAlign.Start)
            }
            .padding({left:10})
            .height(25)
            .onClick(()=>{
              this.onRowClickSelect(item)
            })
          })
        }
        .listDirection(Axis.Vertical) // 排列方向
        .scrollBar(BarState.Off)
        .friction(0.6)
        .contentStartOffset(10) //列表滾動到起始位置時,列表內容與列表顯示區域邊界保留指定距離
        .contentEndOffset(10) //列表內容與列表顯示區域邊界保留指定距離
        .divider({ strokeWidth:1, color: 0xf5f5f5, startMargin: 5, endMargin: 5 }) // 每行之間的分界線
        .edgeEffect(EdgeEffect.Spring) // 邊緣效果設置為Spring
        .width('100%')
        .height('100%')
      }.height(200)

    }
  }
}
  • 修改/ets/components/cascade/index.ets 文件。
import  {CustomAddress }from  "./CustomAddress"
import {RegionType,levelNumber} from './Cascade'
export  {RegionType }from './Cascade' //重新暴露聲明文件類型
// @Entry  去掉入口頁面標志
@Component
export  struct CustomDialogCascade { //修改命名 注意前面加了 export 需要暴露組件
  @Link CustomDialogController: CustomDialogController | null ;
  @Prop level: levelNumber;
  cancel?: () => void
  confirm?: (data:RegionType[]) => void = () => {
  }
  aboutToAppear(): void {
    this.CustomDialogController=  new CustomDialogController({
      builder: CustomAddress({
        cancel: this.cancel,
        confirm: this.confirm,
        level:this.level,
      }),
      autoCancel: true,
      onWillDismiss:(dismissDialogAction: DismissDialogAction)=> {
        if (dismissDialogAction.reason == DismissReason.PRESS_BACK) {
          dismissDialogAction.dismiss()
        }
        if (dismissDialogAction.reason == DismissReason.TOUCH_OUTSIDE) {
          dismissDialogAction.dismiss()
        }
      },
      alignment: DialogAlignment.Bottom,
      offset: { dx: 0, dy:  0},
      customStyle: false,
      cornerRadius: 0,
      width: '100%',
      backgroundColor: Color.White,
    })
  }
  aboutToDisappear() {
    this.CustomDialogController = null // 將dialogController置空
  }


  build() {

  }
}

重新運行一下,當街道選好之后,即可發現彈窗自動關閉,而且選好地址信息成功拿到。

總結

本文詳細介紹了關于在華為鴻蒙系統去實現一個自定義彈窗的詳細教程,主要是提供一些思路,了解組件之間通信的技巧,以及如何實現一個地址級聯選中的詳細過程。

想了解更多關于開源的內容,請訪問:

51CTO 鴻蒙開發者社區

https://ost.51cto.com

責任編輯:jianghua 來源: 51CTO 鴻蒙開發者社區
相關推薦

2023-04-26 12:46:43

DockerSpringKubernetes

2009-11-09 14:57:37

WCF上傳文件

2011-01-06 10:39:25

.NET程序打包

2021-07-14 09:00:00

JavaFX開發應用

2011-05-03 15:59:00

黑盒打印機

2011-01-10 14:41:26

2025-05-07 00:31:30

2011-04-21 10:32:44

MySQL雙機同步

2021-03-12 10:01:24

JavaScript 前端表單驗證

2020-05-15 08:07:33

JWT登錄單點

2022-09-22 12:38:46

antd form組件代碼

2022-12-07 08:42:35

2022-03-14 14:47:21

HarmonyOS操作系統鴻蒙

2022-07-27 08:16:22

搜索引擎Lucene

2022-01-08 20:04:20

攔截系統調用

2011-02-22 13:46:27

微軟SQL.NET

2021-12-28 08:38:26

Linux 中斷喚醒系統Linux 系統

2021-02-26 11:54:38

MyBatis 插件接口

2022-02-23 20:53:54

數據清洗模型

2011-02-22 14:36:40

ASP.NETmsdnC#
點贊
收藏

51CTO技術棧公眾號

7777精品伊人久久久大香线蕉超级流畅| 91综合精品国产丝袜长腿久久| 国产免费成人| 亚洲美女精品成人在线视频| 久久久国产欧美| 四虎久久免费| 国产不卡在线播放| 国产成人精品一区二区| 国产精品九九九九九九| 一区二区三区四区在线看| 911精品国产一区二区在线| 日韩精品视频在线观看视频| jzzjzzjzz亚洲成熟少妇| 国产精品一区二区在线观看不卡 | 欧美日韩影视| 久久精品久久久精品美女| 久久久之久亚州精品露出| 91视频免费看片| 日韩激情毛片| 日韩欧美久久久| 色噜噜狠狠一区二区| 韩国精品一区| 亚洲欧美日韩电影| 视频一区视频二区视频三区高| 波多野结衣 久久| 永久亚洲成a人片777777| 亚洲性视频网站| 少妇被狂c下部羞羞漫画| 99精品美女视频在线观看热舞 | 日韩视频在线播放| 囯产精品久久久久久| 全部av―极品视觉盛宴亚洲| 91极品视频在线| 欧美日韩激情在线观看| 99精品综合| 中文字幕久久久av一区| 99久久久无码国产精品性| 国产精品对白| 欧美大片一区二区三区| 免费网站在线观看黄| 91精品美女| 欧美视频在线一区二区三区| 久章草在线视频| 欧美日韩在线观看首页| 亚洲九九爱视频| 亚洲最新在线| 午夜激情视频在线| 国产精品全国免费观看高清| 日韩免费三级| 国产高清视频在线| 国产欧美日韩在线看| 日本不卡二区| 91se在线| 一区在线播放视频| 男人j进女人j| 色噜噜狠狠狠综合欧洲色8| 亚洲免费视频中文字幕| 日本老太婆做爰视频| 操你啦在线视频| 亚洲曰韩产成在线| 免费高清一区二区三区| 99色在线观看| 欧美丝袜第一区| 茄子视频成人免费观看| 欧美黄色三级| 欧美日韩精品欧美日韩精品| www.成年人| 亚洲精选av| 日韩av在线播放资源| 精品人妻一区二区三区视频| 国产a久久精品一区二区三区 | 阿v免费在线观看| 中文字幕乱码日本亚洲一区二区| 亚洲精品欧美日韩专区| av av片在线看| www.99精品| 欧美一区二区福利| 欧美jizzhd欧美| 亚洲乱码国产乱码精品精98午夜| 日本一区二区三区精品视频| 在线观看黄av| 一区二区三区精品久久久| 日韩中字在线观看| 欧美国产大片| 6080亚洲精品一区二区| 熟妇高潮一区二区| 精品福利久久久| 欧美xxxx18国产| 九九九在线观看| 精品一区二区在线观看| 国产欧美欧洲| 91伦理视频在线观看| 亚洲最大色网站| 亚洲色精品三区二区一区| 91精品国产一区二区在线观看 | 国产在线小视频| 国产精品成人在线观看| 亚洲人成无码网站久久99热国产 | 日韩一区日韩二区| 成人在线视频一区二区三区| 肉色欧美久久久久久久免费看| 亚洲专区一二三| 韩国中文字幕av| 亚洲国产欧美国产第一区| 亚洲美女av电影| 免费无遮挡无码永久在线观看视频| 99久久.com| 亚洲91精品在线| 国产一区二区自拍视频| 久久综合中文字幕| 黄色三级中文字幕| 国产精品麻豆成人av电影艾秋| 色94色欧美sute亚洲13| 在线播放av中文字幕| 亚洲人和日本人hd| 欧美激情欧美狂野欧美精品 | 超碰免费公开在线| 日本韩国欧美国产| 欧美熟妇精品一区二区| av资源久久| 51精品在线观看| 亚洲精品中文字幕成人片| 国产精品国产三级国产普通话99| 在线国产精品网| 范冰冰一级做a爰片久久毛片| 91福利视频久久久久| 欧美成人精品一区二区综合免费| 99热这里只有精品首页| 精品激情国产视频| 在线视频 91| 国产三级三级三级精品8ⅰ区| 亚洲欧美久久久久一区二区三区| 在线观看麻豆| 在线影院国内精品| 国产精品成人在线| 日本二区在线观看| 亚洲第一区色| 亚洲iv一区二区三区| 成人免费在线电影| 狠狠躁夜夜躁人人爽天天天天97| 欧美成人三级在线视频| 国产日本亚洲| 精品国内亚洲在观看18黄| a片在线免费观看| 久久久久久久久岛国免费| 男人添女人下部高潮视频在观看| 国产亚av手机在线观看| 91精品国产色综合久久久蜜香臀| 91视频免费入口| 图片小说视频色综合| 国产女人18毛片水18精品| 北条麻妃在线| 欧美日本在线播放| 丁香花五月婷婷| 欧美aaa在线| 日韩精品一区二区三区外面| 无人区在线高清完整免费版 一区二| 欧美日本乱大交xxxxx| 国产伦理片在线观看| 日日夜夜精品视频天天综合网| 国产精品美腿一区在线看| 国产三级在线观看| 欧美日韩国产在线播放网站| 午夜精品一区二区三级视频| 国产专区欧美精品| www.亚洲视频.com| 夜夜躁狠狠躁日日躁2021日韩| 久久好看免费视频| av一区二区三| 亚洲电影一区二区三区| 给我看免费高清在线观看| 日日嗨av一区二区三区四区| 亚洲欧洲国产日韩精品| 欧美日韩黄色| 91爱视频在线| 91大神xh98hx在线播放| 欧美成人三级在线| 在线精品免费视| 亚洲欧美一区二区在线观看| 黑森林av导航| 日韩高清欧美激情| 最新不卡av| 国产精品xxxav免费视频| 国产成人精品一区| 色老头在线观看| 亚洲美女精品成人在线视频| 一区二区国产欧美| 亚洲福利一区二区| 国产视频不卡在线| 成人一区二区三区在线观看| 人妻丰满熟妇av无码区app| 外国成人免费视频| 欧美午夜视频在线| 国产一区 二区| 久久av一区| 国产麻豆乱码精品一区二区三区| 北条麻妃在线| 日韩一区二区在线观看视频| 伊人手机在线视频| 亚洲男帅同性gay1069| av网页在线观看| 久久国产欧美日韩精品| 国产极品粉嫩福利姬萌白酱| 91九色精品| 免费在线国产精品| 1313精品午夜理伦电影| 国产精品日韩一区| 亚洲电影观看| 欧美老女人性视频| 在线观看a视频| 日韩成人在线播放| 99在线观看精品视频| 在线观看亚洲精品视频| 日韩视频免费观看高清| 亚洲人吸女人奶水| 久久久视频6r| 91免费观看在线| 极品白嫩少妇无套内谢| 久久精品国内一区二区三区| a√天堂在线观看| 午夜精品亚洲| 9l视频自拍9l视频自拍| 精品久久久久久久久久久下田| 国产91精品在线播放| 国产羞羞视频在线播放| 自拍亚洲一区欧美另类| 黄色av网站在线免费观看| 亚洲电影免费观看高清完整版在线观看| 日韩久久精品视频| 一区二区三区四区高清精品免费观看 | 91成人国产精品| 精品成人久久久| 亚洲国产中文字幕| 青青草成人免费| 亚洲免费成人av| 99热这里只有精品4| 国产精品视频一二| 中文字幕在线观看免费高清| 久久一二三国产| 欧美做受喷浆在线观看| 99久久国产综合精品女不卡| 丰满人妻一区二区三区免费视频棣| 日韩午夜高潮| 很污的网站在线观看| 韩国亚洲精品| 妺妺窝人体色777777| 激情文学一区| 欧美黑人在线观看| 精品白丝av| 国产精品12345| 亚洲一级在线| www.欧美日本| 久久成人av少妇免费| av在线网站免费观看| 丁香桃色午夜亚洲一区二区三区| 欧美日韩亚洲一二三| 美日韩精品视频| www.色就是色| 精品一区二区在线免费观看| 韩国三级丰满少妇高潮| 大白屁股一区二区视频| 91黄色免费视频| 久久久99久久| 一级性生活免费视频| 亚洲美女视频一区| 国产一级一级片| 欧美午夜无遮挡| 在线观看中文字幕2021| 91精品婷婷国产综合久久| 国产不卡精品视频| 亚洲国产一区自拍| 国产高清视频在线观看| 久久夜色精品国产亚洲aⅴ| 羞羞视频在线观看不卡| 97不卡在线视频| 老司机精品视频网| 97免费资源站| 你微笑时很美电视剧整集高清不卡 | 日韩在线观看高清| 色屁屁www国产馆在线观看| 热草久综合在线| 黄色成人在线视频| av日韩免费电影| 亚洲色图美女| 韩国黄色一级大片| 亚洲免费网址| 久久久久久国产精品日本| 99久久精品国产观看| 免费一级suv好看的国产网站| 久久欧美一区二区| 日韩三级久久久| 亚瑟在线精品视频| 亚洲字幕av一区二区三区四区| 91福利精品第一导航| 国产精品人妻一区二区三区| 精品久久久久久久一区二区蜜臀| av免费在线不卡| 亚洲欧美日韩精品久久亚洲区| 污污网站在线免费观看| 丝袜美腿亚洲一区二区| 精品捆绑调教一区二区三区| 国产精品视频网址| 国产精品x8x8一区二区| 中文字幕中文字幕在线中心一区 | 中文字幕久热精品在线视频| 牛牛精品在线| 成人久久久久久| 国产一区不卡| 亚洲人精品午夜射精日韩| 精品午夜一区二区三区在线观看 | 久久女人天堂| 久久国产精品高清| 黄色成人在线网址| 久久6免费视频| 国产欧美日韩卡一| 一区二区三区视频免费看| 日韩一区二区三免费高清| 国产黄色片在线播放| 国内精品久久久久久中文字幕| 一个人www视频在线免费观看| 欧美一级电影久久| 国语一区二区三区| 最新黄色av网站| 久久精品国产免费| 欧美大波大乳巨大乳| 欧美日韩色婷婷| 天堂网av在线播放| 欧美极品少妇xxxxⅹ喷水 | 成人福利视频在线观看| 日韩精品丝袜美腿| 国产真人做爰毛片视频直播| 国产一区激情在线| 日韩在线一卡二卡| 欧美日韩激情一区| 欧美成人性生活视频| 国产精品日韩在线观看| 国内成人精品| 欧美精品无码一区二区三区| 久久久久久9999| 69亚洲精品久久久蜜桃小说| 亚洲免费视频网站| 欧美性猛交xxx高清大费中文| 国产精品露脸自拍| 国产成人福利av| 男女猛烈激情xx00免费视频| 成人精品免费网站| a v视频在线观看| 国产午夜精品久久久| 黄色亚洲网站| 婷婷久久青草热一区二区| 免费在线观看视频一区| 992在线观看| 7777精品久久久大香线蕉| bt在线麻豆视频| 成人区精品一区二区| 亚洲人人精品| 插吧插吧综合网| 精品视频在线看| caopen在线视频| 国内精品一区二区| 视频一区二区国产| 九色91国产| 亚洲一区久久| 黄色三级生活片| 欧美酷刑日本凌虐凌虐| 91精选在线| 国产一区二区三区黄| 久久成人在线| 三上悠亚在线观看视频| 日韩欧美一级在线播放| 国产福利电影在线播放| 日韩中文字幕一区| 国产老肥熟一区二区三区| 国产大片中文字幕| 亚洲欧美激情一区| 成人av在线播放| 国产精品无码一区二区在线| 久久精品网站免费观看| 国产乱码久久久久| 97激碰免费视频| 日韩欧美一区二区三区免费看| 国产av麻豆mag剧集| 久久久99精品免费观看| 国产精品久久久久久免费免熟 | 欧美精品1区2区3区| 色呦呦在线播放| 日韩精品在在线一区二区中文| 亚洲视频1区| 影音先锋男人资源在线观看| 精品国产一区二区三区四区四 | 日本韩国一区二区三区| 蜜桃视频在线观看www社区 | 欧美一级三级| 欧美特级aaa| 亚洲大片免费看| 免费在线观看av网站| 黄色小网站91| 激情综合五月婷婷| 在线免费观看国产精品| 欧美激情欧美激情在线五月|