<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
        當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

        淺析Angular19 自定義表單控件

        來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:20:22
        文檔

        淺析Angular19 自定義表單控件

        淺析Angular19 自定義表單控件:1 需求 當(dāng)開(kāi)發(fā)者需要一個(gè)特定的表單控件時(shí)就需要自己開(kāi)發(fā)一個(gè)和默認(rèn)提供的表單控件用法相似的控件來(lái)作為表單控件;自定義的表單控件必須考慮模型和視圖之間的數(shù)據(jù)怎么進(jìn)行交互 2 官方文檔 -> 點(diǎn)擊前往 Angular為開(kāi)發(fā)者提供了ControlValueAcce
        推薦度:
        導(dǎo)讀淺析Angular19 自定義表單控件:1 需求 當(dāng)開(kāi)發(fā)者需要一個(gè)特定的表單控件時(shí)就需要自己開(kāi)發(fā)一個(gè)和默認(rèn)提供的表單控件用法相似的控件來(lái)作為表單控件;自定義的表單控件必須考慮模型和視圖之間的數(shù)據(jù)怎么進(jìn)行交互 2 官方文檔 -> 點(diǎn)擊前往 Angular為開(kāi)發(fā)者提供了ControlValueAcce

        1 需求

        當(dāng)開(kāi)發(fā)者需要一個(gè)特定的表單控件時(shí)就需要自己開(kāi)發(fā)一個(gè)和默認(rèn)提供的表單控件用法相似的控件來(lái)作為表單控件;自定義的表單控件必須考慮模型和視圖之間的數(shù)據(jù)怎么進(jìn)行交互

        2 官方文檔 -> 點(diǎn)擊前往

        Angular為開(kāi)發(fā)者提供了ControlValueAccessor接口來(lái)輔助開(kāi)發(fā)者構(gòu)建自定義的表單控件,開(kāi)發(fā)者只需要在自定義表單控件類中實(shí)現(xiàn)ControlValueAccessor接口中的方法就可以實(shí)現(xiàn)模型和視圖之間的數(shù)據(jù)交互

        interface ControlValueAccessor { 
         writeValue(obj: any): void
         registerOnChange(fn: any): void
         registerOnTouched(fn: any): void
         setDisabledState(isDisabled: boolean)?: void
        }

        2.1 writeValue

        writeValue(obj: any): void

        該方法用于將值寫(xiě)入到自定義表單控件中的元素;

        這個(gè)參數(shù)值(obj)是使用這個(gè)自定義表單控件的組件通過(guò)模板表單或者響應(yīng)式表單的數(shù)據(jù)綁定傳過(guò)來(lái)的;

        在自定義表單控件的類中只需要將這個(gè)值(obj)賦值給一個(gè)成員變量即可,自定義表單控件的視圖就會(huì)通過(guò)屬性綁定顯示出來(lái)這個(gè)值

        2.2 registerOnChange

        registerOnChange(fn: any): void

        自定義表單控件的數(shù)據(jù)發(fā)生變化時(shí)會(huì)觸發(fā)registerOnChange方法,該方用于如何處理自定義表單控件數(shù)據(jù)的變化;

        registerOnChange方法接收的參數(shù)(fn)其實(shí)是一個(gè)方法,該方法負(fù)責(zé)處理變化的數(shù)據(jù)

        當(dāng)自定義控件數(shù)據(jù)變化時(shí)就會(huì)自動(dòng)調(diào)用fn執(zhí)行的方法,但是通常的做法是自定義一個(gè)方法 propagateChange 讓自定義的方法指向fn,這樣當(dāng)數(shù)據(jù)變化時(shí)只需要調(diào)用 propagateChange 就可以對(duì)變化的數(shù)據(jù)進(jìn)行處理

        2.3 registerOnTouched

        registerOnTouched(fn: any): void

        表單控件被觸摸時(shí)會(huì)觸發(fā)registerOnTouched方法,具體細(xì)節(jié)待更新......2018-1-31 11:18:33

        2.4 setDisabledState

        setDisabledState(isDisabled: boolean)?: void

        待更新......2018-1-31 11:19:30

        3 編程步驟

        3.1 創(chuàng)建自定義表單控件組件

        <div>
         <h4>當(dāng)前計(jì)數(shù)為:{{countNumber}}</h4>
         <br />
         <div>
         <button md-icon-button (click)="onIncrease()">
         <span>增加</span>
         <md-icon>add</md-icon>
         </button>
         <span style="margin-left: 30px;"></span>
         <button md-icon-button (click)="onDecrease()">
         <span>減少</span>
         <md-icon>remove</md-icon>
         </button>
         </div>
        </div>

        HTML

        import { Component, OnInit } from '@angular/core';
        import { ControlValueAccessor } from '@angular/forms';
        @Component({
         selector: 'app-counter',
         templateUrl: './counter.component.html',
         styleUrls: ['./counter.component.scss']
        })
        export class CounterComponent implements OnInit {
         countNumber: number = 0;
         constructor() { }
         ngOnInit() {
         }
         onIncrease() {
         this.countNumber++;
         }
         onDecrease() {
         this.countNumber--;
         }
        }

        3.1.1 功能描述

        點(diǎn)擊增加按鈕時(shí)當(dāng)前計(jì)數(shù)會(huì)增加1,點(diǎn)擊減少按鈕時(shí)當(dāng)前計(jì)數(shù)會(huì)剪1

         

        3.1.2 直接在其他組件中使用時(shí)會(huì)報(bào)錯(cuò)

         

        報(bào)錯(cuò)信息如下:

         

        錯(cuò)誤信息是說(shuō)我們我們使用的組件<app-counter>還不是一個(gè)表單控件

        3.2 如何讓<app-counter>組件變成一個(gè)表單控件組件

        3.2.1 實(shí)現(xiàn) ControlValueAccessor 接口

         

        export class CounterComponent implements OnInit, ControlValueAccessor {
         countNumber: number = 0;
         constructor() { }
         ngOnInit() {
         }
         onIncrease() {
         this.countNumber++;
         }
         onDecrease() {
         this.countNumber--;
         }
         /**將數(shù)據(jù)從模型傳輸?shù)揭晥D */
         writeValue(obj: any): void {
         }
         /**將數(shù)據(jù)從視圖傳播到模型 */
         registerOnChange(fn: any): void {
         }
         registerOnTouched(fn: any): void {
         }
         setDisabledState?(isDisabled: boolean): void {
         }
        }

        3.2.2 指定依賴信息providers

         

        import { Component, OnInit, forwardRef } from '@angular/core';
        import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
        @Component({
         selector: 'app-counter',
         templateUrl: './counter.component.html',
         styleUrls: ['./counter.component.scss'],
         providers: [
         {
         provide: NG_VALUE_ACCESSOR,
         useExisting: forwardRef(() => CounterComponent),
         multi: true
         }
         ]
        })
        export class CounterComponent implements OnInit, ControlValueAccessor {
         countNumber: number = 0;
         constructor() { }
         ngOnInit() {
         }
         onIncrease() {
         this.countNumber++;
         }
         onDecrease() {
         this.countNumber--;
         }
         /**將數(shù)據(jù)從模型傳輸?shù)揭晥D */
         writeValue(obj: any): void {
         }
         /**將數(shù)據(jù)從視圖傳播到模型 */
         registerOnChange(fn: any): void {
         }
         registerOnTouched(fn: any): void {
         }
         setDisabledState?(isDisabled: boolean): void {
         }
        }

        3.2.3 待修復(fù)bug

        雖然可以正常運(yùn)行,但是表單控件中的元素接受不到使用表單控件那個(gè)組件中表單模型傳過(guò)來(lái)的數(shù)據(jù),表單控件變化的數(shù)據(jù)也無(wú)法回傳到使用表單控件那個(gè)組件中的表單模型中去;簡(jiǎn)而言之,就是模型和視圖之間無(wú)法進(jìn)行數(shù)據(jù)交互

        3.3 實(shí)習(xí)那模型和試圖的數(shù)據(jù)交互

        3.3.1 模型到視圖

        重構(gòu)自定義表單控件類中的 writeValue 方法

        技巧01:writeValue 方法中的參數(shù)是使用自定義表單控件的那個(gè)組件通過(guò)表單的數(shù)據(jù)綁定傳進(jìn)來(lái)的

         

        3.3.2 視圖到模型

        》自定義一個(gè)方法來(lái)處理自定義表單控件中的變化數(shù)據(jù)

        propagateChange = (_: any) => {};

        》重構(gòu)自定義表單控件類中的 registerOnChange 方法

         /**將數(shù)據(jù)從視圖傳播到模型 */
         registerOnChange(fn: any): void {
         this.propagateChange = fn;
         }

        》在數(shù)據(jù)變化的地方調(diào)用那個(gè)自定義的方法

         

        3.4 自定義表單控件組件代碼匯總

        <div>
         <h4>當(dāng)前計(jì)數(shù)為:{{countNumber}}</h4>
         <br />
         <div>
         <button md-icon-button (click)="onIncrease()">
         <span>增加</span>
         <md-icon>add</md-icon>
         </button>
         <span style="margin-left: 30px;"></span>
         <button md-icon-button (click)="onDecrease()">
         <span>減少</span>
         <md-icon>remove</md-icon>
         </button>
         </div>
        </div>

        HTML

        import { Component, OnInit, forwardRef } from '@angular/core';
        import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
        @Component({
         selector: 'app-counter',
         templateUrl: './counter.component.html',
         styleUrls: ['./counter.component.scss'],
         providers: [
         {
         provide: NG_VALUE_ACCESSOR,
         useExisting: forwardRef(() => CounterComponent),
         multi: true
         }
         ]
        })
        export class CounterComponent implements OnInit, ControlValueAccessor {
         countNumber: number = 0;
         propagateChange = (_: any) => {};
         constructor() { }
         ngOnInit() {
         }
         onIncrease() {
         this.countNumber++;
         this.propagateChange(this.countNumber);
         }
         onDecrease() {
         this.countNumber--;
         this.propagateChange(this.countNumber);
         }
         /**將數(shù)據(jù)從模型傳輸?shù)揭晥D */
         writeValue(obj: any): void {
         this.countNumber = obj;
         }
         /**將數(shù)據(jù)從視圖傳播到模型 */
         registerOnChange(fn: any): void {
         /**fn其實(shí)是一個(gè)函數(shù),當(dāng)視圖中的數(shù)據(jù)改變時(shí)就會(huì)調(diào)用fn指向的這個(gè)函數(shù),從而達(dá)到將數(shù)據(jù)傳播到模型的目的 */
         this.propagateChange = fn; // 將fn的指向賦值給this.propagateChange,在需要將改變的數(shù)據(jù)傳到模型時(shí)只需要調(diào)用this.propagateChange方法即可
         }
         registerOnTouched(fn: any): void {
         }
         setDisabledState?(isDisabled: boolean): void {
         }
        }

        3.5 使用自定義表單控件的那個(gè)組件的代碼匯總

        技巧01:如果自定義表單控件和使用自定義表單控件的組件都在不在同一個(gè)模塊時(shí)需要對(duì)自定義表單控件對(duì)應(yīng)組件進(jìn)行導(dǎo)出和導(dǎo)入操作

         

        <div class="panel panel-primary">
         <div class="panel-heading">面板模板</div>
         <div class="panel-body">
         <h3>面板測(cè)試內(nèi)容</h3>
         </div>
         <div class="panel-footer">2018-1-22 10:22:20</div>
        </div>
        
        <div class="panel-primary">
         <div class="panel-heading">自定義提取表單控件</div>
         <div class="panel-body">
         <form #myForm=ngForm>
         <app-counter name="counter" [(ngModel)]="countNumber">
         </app-counter>
         </form>
         <h6>綠線上是自定義提取的表單控件顯示的內(nèi)容</h6>
         <hr style="border: solid green 2px" />
         <h6>綠線下是使用自定義表單控件時(shí)表單的實(shí)時(shí)數(shù)據(jù)</h6>
         <h3>表單控件的值為:{{myForm.value | json}}</h3>
         </div>
         <div class="panel-footer">2018-1-31 10:09:17</div>
        </div>
        
        <div class="panel-primary">
         <div class="panel-heading">提取表單控件</div>
         <div class="panel-body">
         <form #form="ngForm">
         <p>outerCounterValue value: {{outerCounterValue}}</p>
         <app-exe-counter name="counter" [(ngModel)]="outerCounterValue"></app-exe-counter>
         <br />
         <button md-raised-button type="submit">Submit</button>
         <br />
         <div>
         {{form.value | json}}
         </div>
         </form>
         </div>
         <div class="panel-footer">2018-1-27 21:51:45</div>
        </div>
        
        <div class="panel panel-primary">
         <div class="panel-heading">ngIf指令測(cè)試</div>
         <div class="panel-body">
         <button md-rasied-button (click)="onChangeNgifValue()">改變ngif變量</button>
         <br />
         <div *ngIf="ngif; else ngifTrue" >
         <h4 style="background-color: red; color: white" >ngif變量的值為true</h4>
         </div>
         <ng-template #ngifTrue>
         <h4 style="background-color: black; color: white">ngif變量的值為false</h4>
         </ng-template>
         </div>
         <div class="panel-footer">2018-1-27 16:58:17</div>
        </div>
        
        <div class="panel panel-primary">
         <div class="panel-heading">RXJS使用</div>
         <div class="panel-body">
         <h4>測(cè)試內(nèi)容</h4>
         </div>
         <div class="panel-footer">2018-1-23 21:14:49</div>
        </div>
        
        <div class="panel panel-primary">
         <div class="panel-heading">自定義驗(yàn)證器</div>
         <div class="panel-body">
         <form (ngSubmit)="onTestLogin()" [formGroup]="loginForm">
         <md-input-container>
         <input mdInput placeholder="請(qǐng)輸入登錄名" formControlName="username" />
         </md-input-container>
         <br />
         <md-input-container>
         <input mdInput placeholder="請(qǐng)輸入密碼" formControlName="userpwd" />
         </md-input-container>
         <br />
         <button type="submit" md-raised-button>登陸</button>
         </form>
         </div>
         <div class="panel-footer">2018-1-23 11:06:01</div>
        </div>
        
        <div class="panel panel-primary">
         <div class="panel-heading">響應(yīng)式表單</div>
         <div class="panel-body">
         <form [formGroup]="testForm">
         <md-input-container>
         <input mdInput type="text" placeholder="請(qǐng)輸入郵箱" formControlName="email" />
         <span mdSuffix>@163.com</span> 
         </md-input-container>
         <br />
         <md-input-container>
         <input mdInput type="password" placeholder="請(qǐng)輸入密碼" formControlName="password" />
         </md-input-container>
         </form>
         <hr />
         <div>
         <h2>表單整體信息如下:</h2>
         <h4>表單數(shù)據(jù)有效性:{{testForm.valid}}</h4>
         <h4>表單數(shù)據(jù)為:{{testForm.value | json}}</h4>
         <h4>獲取單個(gè)或多個(gè)FormControl:{{testForm.controls['email'] }}</h4>
         <hr />
         <h2>email輸入框的信息如下:</h2>
         <h4>有效性:{{testForm.get('email').valid}}</h4>
         <h4>email輸入框的錯(cuò)誤信息為:{{testForm.get('email').errors | json}}</h4>
         <h4>required驗(yàn)證結(jié)果:{{testForm.hasError('required', 'email') | json}}</h4>
         <h4>minLength驗(yàn)證結(jié)果:{{ testForm.hasError('minLength', 'email') | json }}</h4>
         <h4>hello:{{ testForm.controls['email'].errors | json }}</h4>
         <hr />
         <h2>password輸入框啊的信息如下:</h2>
         <h4>有效性:{{testForm.get('password').valid}}</h4>
         <h4>password輸入框的錯(cuò)誤信息為:{{testForm.get('password').errors | json }}</h4>
         <h4>required驗(yàn)證結(jié)果:{{testForm.hasError('required', 'password') | json}}</h4>
         </div>
         <div>
         <button nd-rasied-button (click)="onTestClick()">獲取數(shù)據(jù)</button>
         <h4>data變量:{{data}}</h4>
         </div>
         </div>
         <div class="panel-footer">2018-1-22 15:58:43</div>
        </div>
        
        <div class="panel panel-primary">
         <div class="panel-heading">利用響應(yīng)式編程實(shí)現(xiàn)表單元素雙向綁定</div>
         <div class="panel-body">
         <md-input-container>
         <input mdInput placeholder="請(qǐng)輸入姓名(響應(yīng)式雙向綁定):" [formControl]="name"/>
         </md-input-container>
         <div>
         姓名為:{{name.value}}
         </div>
         </div>
         <div class="panel-footer">2018-1-22 11:12:35</div>
        </div> -->
        
        <div class="panel panel-primary">
         <div class="panel-heading">模板表單</div>
         <div class="panel-body">
         <md-input-container>
         <input mdInput placeholder="隨便輸入點(diǎn)內(nèi)容" #a="ngModel" [(ngModel)]="desc" name="desc" />
         <button type="button" md-icon-button mdSuffix (click)="onTestNgModelClick()">
         <md-icon>done</md-icon>
         </button>
         </md-input-container>
         <div>
         <h3>名為desc的表單控件的值為:{{ a.value }}</h3>
         </div>
         </div>
         <div class="panel-footer">2018-1-22 10:19:31</div>
        </div>
        
        <div class="panel panel-primary">
         <div class="panel-heading">md-chekbox的使用</div>
         <div calss="panel-body">
         <div>
         <md-checkbox #testCheckbox color="primary" checked="true">測(cè)試</md-checkbox>
         </div>
         <div *ngIf="testCheckbox.checked">
         <h2>測(cè)試checkbox被選中啦</h2>
         </div>
         </div>
         <div class="panel-footer">2018-1-18 14:02:20</div>
        </div> 
        
        <div class="panel panel-primary">
         <div class="panel-heading">md-tooltip的使用</div>
         <div class="panel-body">
         <span md-tooltip="重慶火鍋">鼠標(biāo)放上去</span>
         </div>
         <div class="panel-footer">2018-1-18 14:26:58</div>
        </div>
        
        
        <div class="panel panel-primary">
         <div class="panel-heading">md-select的使用</div>
         <div class="panel-body">
         <md-select placeholder="請(qǐng)選擇目標(biāo)列表" class="fill-width" style="height: 40px;">
         <md-option *ngFor="let taskList of taskLists" [value]="taskList.name">{{taskList.name}}</md-option>
         </md-select>
         </div>
         <div class="panel-footer">2018-1-18 14:26:58</div>
        </div> 
        
        <div class="panel panel-primary">
         <div class="panel-heading">ngNonBindable指令的使用</div>
         <div class="panel-body">
         <h3>描述</h3>
         <p>使用了ngNonBindable的標(biāo)簽,會(huì)將該標(biāo)簽里面的元素內(nèi)容全部都看做時(shí)純文本</p>
         <h3>例子</h3>
         <p>
         <span>{{taskLists | json }}</span>
         <span ngNonBindable>← 這是{{taskLists | json }}渲染的內(nèi)容</span>
         </p>
         </div>
         <div class="panel-footer">2018-1-19 09:34:26</div>
        </div>

        HTML

         

        import { Component, OnInit, HostListener, Inject} from '@angular/core';
        import { FormControl, FormGroup, FormBuilder, Validators } from '@angular/forms';
        import { Http } from '@angular/http';
        import { QuoteService } from '../../service/quote.service';
        @Component({
         selector: 'app-test01',
         templateUrl: './test01.component.html',
         styleUrls: ['./test01.component.scss']
        })
        export class Test01Component implements OnInit {
         countNumber: number = 9;
         outerCounterValue: number = 5; 
         ngif = true;
         loginForm: FormGroup;
         testForm: FormGroup;
         data: any;
         name: FormControl = new FormControl();
         desc: string = 'hello boy';
         taskLists = [
         {label: 1, name: '進(jìn)行中'},
         {label: 2, name: '已完成'}
         ];
         constructor(
         private formBuilder: FormBuilder,
         private http: Http,
         @Inject('BASE_CONFIG') private baseConfig,
         private quoteService: QuoteService
         ) {}
         ngOnInit() {
         this.testForm = new FormGroup({
         email: new FormControl('', [Validators.required, Validators.minLength(4)], []),
         password: new FormControl('', [Validators.required], [])
         });
         this.name.valueChanges
         .debounceTime(500)
         .subscribe(value => alert(value));
         this.loginForm = this.formBuilder.group({
         username: ['', [Validators.required, Validators.minLength(4), this.myValidator], []],
         userpwd: ['', [Validators.required, Validators.minLength(6)], []]
         });
         this.quoteService.test()
         .subscribe(resp => console.log(resp));
         }
         onChangeNgifValue() {
         if (this.ngif == false) {
         this.ngif = true;
         } else {
         this.ngif = false;
         }
         }
         @HostListener('keyup.enter')
         onTestNgModelClick() {
         alert('提交');
         }
         onTestClick() {
         // this.data = this.testForm.get('email').value;
         // console.log(this.testForm.getError);
         console.log(this.testForm.controls['email']);
         }
         onTestLogin() {
         console.log(this.loginForm.value);
         if (this.loginForm.valid) {
         console.log('登陸數(shù)據(jù)合法');
         } else {
         console.log('登陸數(shù)據(jù)不合法');
         console.log(this.loginForm.controls['username'].errors);
         console.log(this.loginForm.get('userpwd').errors);
         }
         }
         myValidator(fc: FormControl): {[key: string]: any} {
         const valid = fc.value === 'admin';
         return valid ? null : {myValidator: {requiredUsername: 'admin', actualUsername: fc.value}};
         }
        }

        3.6 初始化效果展示

         

        聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        淺析Angular19 自定義表單控件

        淺析Angular19 自定義表單控件:1 需求 當(dāng)開(kāi)發(fā)者需要一個(gè)特定的表單控件時(shí)就需要自己開(kāi)發(fā)一個(gè)和默認(rèn)提供的表單控件用法相似的控件來(lái)作為表單控件;自定義的表單控件必須考慮模型和視圖之間的數(shù)據(jù)怎么進(jìn)行交互 2 官方文檔 -> 點(diǎn)擊前往 Angular為開(kāi)發(fā)者提供了ControlValueAcce
        推薦度:
        標(biāo)簽: 自定義 19 表單
        • 熱門(mén)焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門(mén)推薦

        專題
        Top
        主站蜘蛛池模板: 毛片免费vip会员在线看| 中文字幕成人免费高清在线视频 | AAA日本高清在线播放免费观看| 免费看香港一级毛片 | a级日本高清免费看| 亚洲综合av永久无码精品一区二区| 国产亚洲精彩视频| 国产不卡免费视频| 日亚毛片免费乱码不卡一区| 天堂亚洲免费视频| 免费看一级高潮毛片| 亚洲午夜福利精品久久| 中文字幕av无码不卡免费| 亚洲乱码在线播放| 精品久久久久久久免费人妻| 国产免费伦精品一区二区三区 | 亚洲视频在线观看免费视频| 亚洲精品视频免费看| 99久久婷婷国产综合亚洲| 天天摸天天操免费播放小视频 | 亚洲色偷偷综合亚洲AV伊人蜜桃| 美女被免费视频网站a国产| 精品国产污污免费网站| 亚洲激情电影在线| 日韩黄色免费观看| caoporn国产精品免费| 久久精品国产亚洲AV麻豆不卡| 四虎在线成人免费网站| 亚洲爆乳大丰满无码专区| 亚洲精品无码av天堂| 精品国产一区二区三区免费| 国产精品亚洲а∨无码播放不卡| 亚洲人成网网址在线看| 亚洲AV无码一区东京热久久| 国产三级免费观看| 免费看片A级毛片免费看| 91免费国产在线观看| 四虎影视久久久免费观看| 亚洲国产精品一区二区三区在线观看| 四虎影院永久免费观看| 114一级毛片免费|