久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

Vue新搭檔TypeScript快速入門實踐記錄

瀏覽:126日期:2022-09-28 16:58:24
目錄1. 使用官方腳手架構建2. 項目目錄解析3. TypeScript極速入門 3.1 基本類型和擴展類型3.2 泛型:Generics3.3 自定義類型:Interface vs Type alias3.4 實現與繼承:implements vs extends3.5 聲明文件與命名空間:declare 和 namespace3.6 訪問修飾符:private、public、protected3.7 可選參數 ( ?: )和非空斷言操作符(!.)4. Vue組件的Ts寫法4.1 vue-class-component4.2 添加全局工具4.3 Axios 使用與封裝

Vue官方從2.6.X版本開始就部分使用Ts重寫了。

我個人對更嚴格類型限制沒有積極的看法,畢竟各類轉類型的騷寫法寫習慣了。

最近的一個項目中,是TypeScript+ Vue,毛計喇,學之...…真香!

注意此篇標題的“前”,本文旨在講Ts混入框架的使用,不講Class API

1. 使用官方腳手架構建

npm install -g @vue/cli# ORyarn global add @vue/cli

新的Vue CLI工具允許開發者 使用 TypeScript 集成環境 創建新項目。

只需運行vue create my-app。

然后,命令行會要求選擇預設。使用箭頭鍵選擇Manually select features。

接下來,只需確保選擇了TypeScript和Babel選項,如下圖:

Vue新搭檔TypeScript快速入門實踐記錄

完成此操作后,它會詢問你是否要使用class-style component syntax。

然后配置其余設置,使其看起來如下圖所示。

Vue新搭檔TypeScript快速入門實踐記錄

Vue CLI工具現在將安裝所有依賴項并設置項目。

Vue新搭檔TypeScript快速入門實踐記錄

接下來就跑項目

Vue新搭檔TypeScript快速入門實踐記錄

2. 項目目錄解析

通過tree指令查看目錄結構后可發現其結構和正常構建的大有不同。

Vue新搭檔TypeScript快速入門實踐記錄

這里主要關注shims-tsx.d.ts和 shims-vue.d.ts兩個文件

兩句話概括:

shims-tsx.d.ts,允許你以.tsx結尾的文件,在Vue項目中編寫jsx代碼 shims-vue.d.ts 主要用于 TypeScript 識別.vue 文件,Ts默認并不支持導入 vue 文件,這個文件告訴ts 導入.vue 文件都按VueConstructor<Vue>處理。

此時我們打開親切的src/components/HelloWorld.vue,將會發現寫法已大有不同

<template> <div class='hello'> <h1>{{ msg }}</h1> <!-- 省略 --> </div></template> <script lang='ts'>import { Component, Prop, Vue } from ’vue-property-decorator’; @Componentexport default class HelloWorld extends Vue { @Prop() private msg!: string;}</script> <!-- Add 'scoped' attribute to limit CSS to this component only --><style scoped></style>

至此,準備開啟新的篇章 TypeScript極速入門 和 vue-property-decorator

3. TypeScript極速入門 3.1 基本類型和擴展類型

Typescript與Javascript共享相同的基本類型,但有一些額外的類型。

元組 Tuple 枚舉 enum Any 與Void

1. 基本類型合集

// 數字,二、八、十六進制都支持let decLiteral: number = 6;let hexLiteral: number = 0xf00d; // 字符串,單雙引都行let name: string = 'bob';let sentence: string = `Hello, my name is ${ name }. // 數組,第二種方式是使用數組泛型,Array<元素類型>:let list: number[] = [1, 2, 3];let list: Array<number> = [1, 2, 3]; let u: undefined = undefined;let n: null = null;

2. 特殊類型

1. 元組 Tuple

想象 元組 作為有組織的數組,你需要以正確的順序預定義數據類型。

const messyArray = [’ something’, 2, true, undefined, null];const tuple: [number, string, string] = [24, 'Indrek' , 'Lasn']

如果不遵循 為元組 預設排序的索引規則,那么Typescript會警告。

Vue新搭檔TypeScript快速入門實踐記錄

​ (tuple第一項應為number類型)

2. 枚舉 enum

enum類型是對JavaScript標準數據類型的一個補充。 像C#等其它語言一樣,使用枚舉類型可以為一組數值賦予友好的名字。

// 默認情況從0開始為元素編號,也可手動為1開始enum Color {Red = 1, Green = 2, Blue = 4}let c: Color = Color.Green; let colorName: string = Color[2];console.log(colorName); // 輸出’Green’因為上面代碼里它的值是2

另一個很好的例子是使用枚舉來存儲應用程序狀態。

Vue新搭檔TypeScript快速入門實踐記錄

3. Void

在Typescript中,你必須在函數中定義返回類型。像這樣:

Vue新搭檔TypeScript快速入門實踐記錄

若沒有返回值,則會報錯:

Vue新搭檔TypeScript快速入門實踐記錄

我們可以將其返回值定義為void:

Vue新搭檔TypeScript快速入門實踐記錄

此時將無法 return

4. Any

emmm...就是什么類型都行,當你無法確認在處理什么類型時可以用這個。

但要慎重使用,用多了就失去使用Ts的意義。

let person: any = '前端勸退師'person = 25person = true

主要應用場景有:

接入第三方庫 Ts菜逼前期都用

5. Never

用很粗淺的話來描述就是:'Never是你永遠得不到的爸爸。'

具體的行為是:

throw new Error(message) return error('Something failed') while (true) {} // 存在無法達到的終點

Vue新搭檔TypeScript快速入門實踐記錄

3. 類型斷言

簡略的定義是:可以用來手動指定一個值的類型。

有兩種寫法,尖括號和as:

let someValue: any = 'this is a string'; let strLength: number = (<string>someValue).length;let strLength: number = (someValue as string).length;

使用例子有:

當 TypeScript 不確定一個聯合類型的變量到底是哪個類型的時候,我們只能訪問此聯合類型的所有類型里共有的屬性或方法:

function getLength(something: string | number): number { return something.length;} // index.ts(2,22): error TS2339: Property ’length’ does not exist on type ’string | number’.// Property ’length’ does not exist on type ’number’.

如果你訪問長度將會報錯,而有時候,我們確實需要在還不確定類型的時候就訪問其中一個類型的屬性或方法,此時需要斷言才不會報錯:

function getLength(something: string | number): number { if ((<string>something).length) {return (<string>something).length; } else {return something.toString().length; }}3.2 泛型:Generics

軟件工程的一個主要部分就是構建組件,構建的組件不僅需要具有明確的定義和統一的接口,同時也需要組件可復用。支持現有的數據類型和將來添加的數據類型的組件為大型軟件系統的開發過程提供很好的靈活性。

在C#和Java中,可以使用'泛型'來創建可復用的組件,并且組件可支持多種數據類型。這樣便可以讓用戶根據自己的數據類型來使用組件。

1. 泛型方法

在TypeScript里,聲明泛型方法有以下兩種方式:

function gen_func1<T>(arg: T): T { return arg;}// 或者let gen_func2: <T>(arg: T) => T = function (arg) { return arg;}

調用方式也有兩種:

gen_func1<string>(’Hello world’);gen_func2(’Hello world’); // 第二種調用方式可省略類型參數,因為編譯器會根據傳入參數來自動識別對應的類型。

2. 泛型與Any

Ts 的特殊類型 Any 在具體使用時,可以代替任意類型,咋一看兩者好像沒啥區別,其實不然:

// 方法一:帶有any參數的方法function any_func(arg: any): any { console.log(arg.length);return arg;} // 方法二:Array泛型方法function array_func<T>(arg: Array<T>): Array<T> { console.log(arg.length);return arg;}方法一,打印了arg參數的length屬性。因為any可以代替任意類型,所以該方法在傳入參數不是數組或者帶有length屬性對象時,會拋出異常。 方法二,定義了參數類型是Array的泛型類型,肯定會有length屬性,所以不會拋出異常。

3. 泛型類型

泛型接口:

interface Generics_interface<T> { (arg: T): T;} function func_demo<T>(arg: T): T { return arg;} let func1: Generics_interface<number> = func_demo;func1(123); // 正確類型的實際參數func1(’123’); // 錯誤類型的實際參數3.3 自定義類型:Interface vs Type alias

Interface,國內翻譯成接口。

Type alias,類型別名。

1. 相同點

都可以用來描述一個對象或函數:

interface User { name: string age: number} type User = { name: string age: number}; interface SetUser { (name: string, age: number): void;}type SetUser = (name: string, age: number): void;

都允許拓展(extends):

interface 和 type 都可以拓展,并且兩者并不是相互獨立的,也就是說interface可以 extends type, type 也可以 extends interface 。 雖然效果差不多,但是兩者語法不同

interface extends interface

interface Name { name: string; }interface User extends Name { age: number; }

type extends type

type Name = { name: string; }type User = Name & { age: number };

interface extends type

type Name = { name: string; }interface User extends Name { age: number; }

type extends interface

interface Name { name: string; }type User = Name & { age: number; }

2. 不同點

type 可以而 interface 不行

type 可以聲明基本類型別名,聯合類型,元組等類型

// 基本類型別名type Name = string // 聯合類型interface Dog { wong();}interface Cat { miao();} type Pet = Dog | Cat // 具體定義數組每個位置的類型type PetList = [Dog, Pet]

type 語句中還可以使用 typeof獲取實例的 類型進行賦值

// 當你想獲取一個變量的類型時,使用 typeoflet div = document.createElement(’div’);type B = typeof div

其他騷操作

type StringOrNumber = string | number; type Text = string | { text: string }; type NameLookup = Dictionary<string, Person>; type Callback<T> = (data: T) => void; type Pair<T> = [T, T]; type Coordinates = Pair<number>; type Tree<T> = T | { left: Tree<T>, right: Tree<T> };

interface可以而 type不行

interface 能夠聲明合并

interface User { name: string age: number} interface User { sex: string} /*User 接口為 { name: string age: number sex: string }*/

interface 有可選屬性和只讀屬性

可選屬性

接口里的屬性不全都是必需的。 有些是只在某些條件下存在,或者根本不存在。 例如給函數傳入的參數對象中只有部分屬性賦值了。帶有可選屬性的接口與普通的接口定義差不多,只是在可選屬性名字定義的后面加一個?符號。如下所示

interface Person { name: string; age?: number; gender?: number;}

只讀屬性

顧名思義就是這個屬性是不可寫的,對象屬性只能在對象剛剛創建的時候修改其值。 你可以在屬性名前用 readonly來指定只讀屬性,如下所示:

interface User { readonly loginName: string; password: string;}

上面的例子說明,當完成User對象的初始化后loginName就不可以修改了。

3.4 實現與繼承:implements vs extends

extends很明顯就是ES6里面的類繼承,那么implement又是做什么的呢?它和extends有什么不同?

implement,實現。與C#或Java里接口的基本作用一樣,TypeScript也能夠用它來明確的強制一個類去符合某種契約

implement基本用法

interface IDeveloper { name: string; age?: number;}// OKclass dev implements IDeveloper { name = ’Alex’; age = 20;}// OKclass dev2 implements IDeveloper { name = ’Alex’;}// Errorclass dev3 implements IDeveloper { name = ’Alex’; age = ’9’;}

而extends是繼承父類,兩者其實可以混著用:

class A extends B implements C,D,E

搭配 interface和type的用法有:

Vue新搭檔TypeScript快速入門實踐記錄

3.5 聲明文件與命名空間:declare 和 namespace

前面我們講到Vue項目中的shims-tsx.d.ts和shims-vue.d.ts,其初始內容是這樣的:

// shims-tsx.d.tsimport Vue, { VNode } from ’vue’; declare global { namespace JSX { // tslint:disable no-empty-interface interface Element extends VNode {} // tslint:disable no-empty-interface interface ElementClass extends Vue {} interface IntrinsicElements { [elem: string]: any; } }} // shims-vue.d.tsdeclare module ’*.vue’ { import Vue from ’vue’; export default Vue;}

declare:當使用第三方庫時,我們需要引用它的聲明文件,才能獲得對應的代碼補全、接口提示等功能。

這里列舉出幾個常用的:

declare var 聲明全局變量declare function 聲明全局方法declare class 聲明全局類declare enum 聲明全局枚舉類型declare global 擴展全局變量declare module 擴展模塊

namespace:“內部模塊”現在稱做“命名空間”

module X { 相當于現在推薦的寫法 namespace X {)

跟其他 JS 庫協同

類似模塊,同樣也可以通過為其他 JS 庫使用了命名空間的庫創建 .d.ts 文件的聲明文件,如為 D3 JS 庫,可以創建這樣的聲明文件:

declare namespace D3{ export interface Selectors { ... }}declare var d3: D3.Base;

所以上述兩個文件:

shims-tsx.d.ts, 在全局變量 global中批量命名了數個內部模塊。 shims-vue.d.ts,意思是告訴 TypeScript *.vue 后綴的文件可以交給 vue 模塊來處理。3.6 訪問修飾符:private、public、protected

其實很好理解:

默認為public 當成員被標記為private時,它就不能在聲明它的類的外部訪問,比如:

class Animal { private name: string; constructor(theName: string) {this.name = theName; }} let a = new Animal(’Cat’).name; //錯誤,‘name’是私有的

protected和private類似,但是,protected成員在派生類中可以訪問

class Animal { protected name: string; constructor(theName: string) {this.name = theName; }} class Rhino extends Animal { constructor() {super(’Rhino’); } getName() { console.log(this.name) //此處的name就是Animal類中的name }}3.7 可選參數 ( ?: )和非空斷言操作符(!.)

可選參數

function buildName(firstName: string, lastName?: string) { return firstName + ’ ’ + lastName} // 錯誤演示buildName('firstName', 'lastName', 'lastName')// 正確演示buildName('firstName')// 正確演示buildName('firstName', 'lastName')

非空斷言操作符:

能確定變量值一定不為空時使用。

與可選參數 不同的是,非空斷言操作符不會防止出現 null 或 undefined。

let s = e!.name; // 斷言e是非空并訪問name屬性

拓展

1. 屬性或參數中使用 ?:表示該屬性或參數為可選項

2. 屬性或參數中使用 !:表示強制解析(告訴typescript編譯器,這里一定有值),常用于vue-decorator中的@Prop

3. 變量后使用 !:表示類型推斷排除null、undefined

4. Vue組件的Ts寫法

從 vue2.5 之后,vue 對 ts 有更好的支持。根據官方文檔,vue 結合 typescript ,有兩種書寫方式:

Vue.extend

import Vue from ’vue’ const Component = Vue.extend({ // type inference enabled })

vue-class-component

import { Component, Vue, Prop } from ’vue-property-decorator’ @Componentexport default class Test extends Vue { @Prop({ type: Object }) private test: { value: string }

理想情況下,Vue.extend 的書寫方式,是學習成本最低的。在現有寫法的基礎上,幾乎 0 成本的遷移。

但是Vue.extend模式,需要與mixins 結合使用。在 mixin 中定義的方法,不會被 typescript 識別到

,這就意味著會出現丟失代碼提示、類型檢查、編譯報錯等問題。

菜鳥才做選擇,大佬都挑最好的。直接講第二種吧:

4.1 vue-class-component

Vue新搭檔TypeScript快速入門實踐記錄

我們回到src/components/HelloWorld.vue

<template> <div class='hello'> <h1>{{ msg }}</h1> <!-- 省略 --> </div></template> <script lang='ts'>import { Component, Prop, Vue } from ’vue-property-decorator’; @Componentexport default class HelloWorld extends Vue { @Prop() private msg!: string;}</script> <!-- Add 'scoped' attribute to limit CSS to this component only --><style scoped></style>

有寫過python的同學應該會發現似曾相識:

vue-property-decorator這個官方支持的庫里,提供了函數 **裝飾器(修飾符)**語法

1. 函數修飾符 @

“@”,與其說是修飾函數倒不如說是引用、調用它修飾的函數。

或者用句大白話描述:@: '下面的被我包圍了。'

舉個栗子,下面的一段代碼,里面兩個函數,沒有被調用,也會有輸出結果:

test(f){ console.log('before ...'); f()console.log('after ...'); } @testfunc(){console.log('func was called');}

直接運行,輸出結果:

before ...func was calledafter ...

上面代碼可以看出來:

只定義了兩個函數:test和func,沒有調用它們。 如果沒有 @test,運行應該是沒有任何輸出的。

但是,解釋器讀到函數修飾符“@”的時候,后面步驟會是這樣:

去調用test函數,test函數的入口參數就是那個叫“func”的函數; test函數被執行,入口參數的(也就是func函數)會被調用(執行);

換言之,修飾符帶的那個函數的入口參數,就是下面的那個整個的函數。有點兒類似JavaScript里面的 function a (function () { ... });

2. vue-property-decorator和vuex-class提供的裝飾器

vue-property-decorator的裝飾器:

@Prop @PropSync @Provide @Model @Watch @Inject @Provide @Emit @Component (provided by vue-class-component) Mixins (the helper function named mixins provided by vue-class-component)

vuex-class的裝飾器:

@State @Getter @Action @Mutation

我們拿原始Vue組件模版來看:

import {componentA,componentB} from ’@/components’; export default {components: { componentA, componentB},props: { propA: { type: Number }, propB: { default: ’default value’ }, propC: { type: [String, Boolean] }, } // 組件數據 data () { return { message: ’Hello’ } }, // 計算屬性 computed: { reversedMessage () { return this.message.split(’’).reverse().join(’’) } // Vuex數據 step() { return this.$store.state.count } }, methods: { changeMessage () { this.message = 'Good bye' }, getName() { let name = this.$store.getters[’person/name’] return name } }, // 生命周期 created () { }, mounted () { }, updated () { }, destroyed () { }}

以上模版替換成修飾符寫法則是:

import { Component, Vue, Prop } from ’vue-property-decorator’;import { State, Getter } from ’vuex-class’;import { count, name } from ’@/person’import { componentA, componentB } from ’@/components’; @Component({ components:{ componentA, componentB},})export default class HelloWorld extends Vue{@Prop(Number) readonly propA!: number | undefined @Prop({ default: ’default value’ }) readonly propB!: string @Prop([String, Boolean]) readonly propC!: string | boolean | undefined // 原data message = ’Hello’ // 計算屬性private get reversedMessage (): string[] { return this.message.split(’’).reverse().join(’’) } // Vuex 數據 @State((state: IRootState) => state . booking. currentStep) step!: number@Getter( ’person/name’) name!: name // method public changeMessage (): void { this.message = ’Good bye’ }, public getName(): string { let storeName = name return storeName }// 生命周期 private created ():void { }, private mounted ():void { }, private updated ():void { }, private destroyed ():void { }}

正如你所看到的,我們在生命周期 列表那都添加private XXXX方法,因為這不應該公開給其他組件。

而不對method做私有約束的原因是,可能會用到@Emit來向父組件傳遞信息。

4.2 添加全局工具

引入全局模塊,需要改main.ts:

import Vue from ’vue’;import App from ’./App.vue’;import router from ’./router’;import store from ’./store’; Vue.config.productionTip = false; new Vue({ router, store, render: (h) => h(App),}).$mount(’#app’);

npm i VueI18n

import Vue from ’vue’;import App from ’./App.vue’;import router from ’./router’;import store from ’./store’;// 新模塊import i18n from ’./i18n’; Vue.config.productionTip = false; new Vue({ router, store, i18n, // 新模塊 render: (h) => h(App),}).$mount(’#app’);

但僅僅這樣,還不夠。你需要動src/vue-shim.d.ts:

// 聲明全局方法declare module ’vue/types/vue’ { interface Vue {readonly $i18n: VueI18Next;$t: TranslationFunction; }}

之后使用this.$i18n()的話就不會報錯了。

4.3 Axios 使用與封裝

Axios的封裝千人千面

如果只是想簡單在Ts里體驗使用Axios,可以安裝vue-axios 簡單使用Axios

$ npm i axios vue-axios

main.ts添加:

import Vue from ’vue’import axios from ’axios’import VueAxios from ’vue-axios’ Vue.use(VueAxios, axios)

然后在組件內使用:

Vue.axios.get(api).then((response) => { console.log(response.data)}) this.axios.get(api).then((response) => { console.log(response.data)}) this.$http.get(api).then((response) => { console.log(response.data)})

1. 新建文件request.ts

文件目錄:

-api - main.ts // 實際調用-utils - request.ts // 接口封裝

2. request.ts文件解析

import * as axios from ’axios’;import store from ’@/store’;// 這里可根據具體使用的UI組件庫進行替換import { Toast } from ’vant’;import { AxiosResponse, AxiosRequestConfig } from ’axios’; /* baseURL 按實際項目來定義 */const baseURL = process.env.VUE_APP_URL; /* 創建axios實例 */const service = axios.default.create({ baseURL, timeout: 0, // 請求超時時間 maxContentLength: 4000,}); service.interceptors.request.use((config: AxiosRequestConfig) => { return config;}, (error: any) => { Promise.reject(error);}); service.interceptors.response.use( (response: AxiosResponse) => {if (response.status !== 200) { Toast.fail(’請求錯誤!’);} else { return response.data;} }, (error: any) => {return Promise.reject(error); }); export default service;

為了方便,我們還需要定義一套固定的 axios 返回的格式,新建ajax.ts:

export interface AjaxResponse { code: number; data: any; message: string;}

3. main.ts接口調用:

// api/main.tsimport request from ’../utils/request’; // getexport function getSomeThings(params:any) { return request({url: ’/api/getSomethings’, });} // postexport function postSomeThings(params:any) { return request({url: ’/api/postSomethings’,methods: ’post’,data: params });}

5. 編寫一個組件

為了減少時間,我們來替換掉src/components/HelloWorld.vue,做一個博客帖子組件:

<template><div class='blogpost'><h2>{{ post.title }}</h2><p>{{ post.body }}</p><p class='meta'>Written by {{ post.author }} on {{ date }}</p></div></template> <script lang='ts'>import { Component, Prop, Vue } from ’vue-property-decorator’; // 在這里對數據進行類型約束export interface Post {title: string;body: string;author: string;datePosted: Date;} @Componentexport default class HelloWorld extends Vue {@Prop() private post!: Post; get date() {return `${this.post.datePosted.getDate()}/${this.post.datePosted.getMonth()}/${this.post.datePosted.getFullYear()}`;}}</script> <style scoped>h2 { text-decoration: underline;}p.meta { font-style: italic;}</style>

然后在Home.vue中使用:

<template> <div class='home'> <img alt='Vue logo' src='http://www.gepszalag.com/assets/logo.png'> <HelloWorld v-for='blogPost in blogPosts' :post='blogPost' :key='blogPost.title' /> </div></template> <script lang='ts'>import { Component, Vue } from ’vue-property-decorator’;import HelloWorld, { Post } from ’@/components/HelloWorld.vue’; // @ is an alias to /src @Component({ components: { HelloWorld, },})export default class Home extends Vue { private blogPosts: Post[] = [{ title: ’My first blogpost ever!’, body: ’Lorem ipsum dolor sit amet.’, author: ’Elke’, datePosted: new Date(2019, 1, 18),},{ title: ’Look I am blogging!’, body: ’Hurray for me, this is my second post!’, author: ’Elke’, datePosted: new Date(2019, 1, 19),},{ title: ’Another one?!’, body: ’Another one!’, author: ’Elke’, datePosted: new Date(2019, 1, 20),}, ];}</script>

這時候運行項目:

Vue新搭檔TypeScript快速入門實踐記錄

這就是簡單的父子組件

Vue新搭檔TypeScript快速入門實踐記錄

而關于Class API撤銷,其實還是挺舒服的。 用class 來編寫 Vue組件確實太奇怪了。 (所以本篇Ts入門壓根沒寫Class API)

以上就是Vue新搭檔TypeScript快速入門實踐的詳細內容,更多關于Vue TypeScript快速入門的資料請關注好吧啦網其它相關文章!

標簽: Vue
相關文章:
主站蜘蛛池模板: 国产色网站 | 日韩精品视频在线播放 | 精品在线一区 | 国产精品18久久久久久久久 | 久久99精品久久久久久青青日本 | 日日搞夜夜操 | 日韩成人一区二区 | 日韩精品免费看 | 日韩欧在线 | 美女视频一区 | 亚洲精品在线成人 | www.五月婷婷 | 欧美日韩高清 | 国产精品久久久久久 | 一区| 欧美国产一区二区 | 亚洲精品国产综合区久久久久久久 | 国产成人在线一区二区 | 精品一区二区三区在线观看 | 黄色片免费看. | av免费网站在线观看 | 欧洲一区在线 | 成人欧美一区二区三区在线观看 | 91免费观看国产 | 久久这里只有精品首页 | 日本一区二区三区四区 | 欧美一级精品片在线看 | 天天天天综合 | 国产成人一区二区三区 | 伊人免费观看视频 | 97国产在线视频 | 久久久久中文 | 久久aⅴ乱码一区二区三区 91综合网 | 天堂成人av | 国产精品99久久免费观看 | 亚洲欧美激情精品一区二区 | 亚洲一区 中文字幕 | 一级黄色大片视频 | 黄色毛片在线观看 | 午夜影院在线 | 亚洲热在线视频 | 国产一区二区视频在线观看 | 久久午夜精品 | 国产精品久久久久久久 | 91原创视频在线观看 | 日韩精品小视频 | 日韩精品| 国产一区在线观看视频 | 国产精品久久久 | 久久激情五月丁香伊人 | 男人天堂社区 | 五月婷亚洲 | 久久av一区二区三区 | 伊人青青操 | 一级视频在线观看 | 日韩在线播放一区 | 在线免费色视频 | 精品日韩一区二区 | 黑人粗黑大躁护士 | 精品久久国产 | 亚洲v在线| 亚洲精品在线看 | 免费观看国产精品 | 欧美日韩中文国产一区发布 | 国产一级毛片在线视频 | 毛片网站大全 | 免费在线一区二区三区 | 午夜国产一区 | 欧美激情视频一区二区三区在线播放 | 国产情侣一区二区三区 | 亚洲午夜视频在线观看 | 成人黄色在线视频 | 午夜精品一区 | 亚洲高清一区二区三区 | 99热在线免费观看 | 婷婷色综合 | 日本一区二区成人 | 免费一区二区三区 | 精品九九久久 | 婷婷色av| 欧美日韩国产在线 | 成人免费小视频 | 成人精品电影 | 久久精品 | 国产精品久久久久久久久久久免费看 | 伊人久操 | av网站观看| 欧美一区久久 | 九色一区 | 国产精品久久久久久久久福交 | 国产精品99精品久久免费 | 日本黄色片免费看 | 国产1区2区精品 | 国产欧美一区二区精品婷 | 精品久久久久一区二区三区 | 亚洲欧美日本在线 | 成人精品一区二区三区中文字幕 | 国产在线一区二区三区 | www.蜜桃av.com | 99久久久无码国产精品 | 国产精品久久久久久久久久 | 日韩欧美在线一区 | a在线看| 国产精品18久久久 | 国产精品一区二 | 国产午夜精品一区二区三区视频 | 午夜免费 | 欧美第一网站 | 免费看男女www网站入口在线 | 成人精品视频 | 亚洲精品国产9999久久久久 | 亚洲不卡视频 | 欧美一区二区三区免费电影 | 日韩不卡一区二区三区 | 国内精品久久久久国产 | 91精品区| 中文字幕成人免费视频 | 亚洲午夜电影 | 欧美一级二级三级视频 | 日韩一区在线视频 | 九色在线 | 一区二区三区精品视频 | 国产亚州av| 中文字幕在线第一页 | 精品一二区 | 综合久久国产九一剧情麻豆 | 国产在线第一页 | 久久久久成人精品 | 麻豆久久久9性大片 | 久久三区| 亚洲日本韩国在线观看 | 久久久久久亚洲一区二区三区蜜臀 | 日本色综合 | 亚洲国产成人在线 | 五月色综合| av免费网站 | 欧美一二三 | 可以在线观看的黄色 | 日韩综合一区 | 亚洲欧洲精品视频 | 国产农村妇女精品 | 亚洲视频在线播放 | 亚洲一区二区三区 | 一区二区精品在线观看 | av在线天堂| 久久精品一 | 中文字幕视频在线免费观看 | 久久成人免费视频 | 国产精品美女久久久久久久久久久 | 成人欧美一区二区三区在线播放 | 不卡一区 | 成人在线国产 | 亚洲欧美国产精品久久 | 最新国产在线 | 国产偷自视频区视频 | 国产高清精品一区二区三区 | 在线精品一区 | 日韩精品一区二区三区老鸭窝 | 久久久国产精品视频 | 欧美日韩一区二区三区在线观看 | 99re热精品视频 | 在线色综合 | 日日干夜夜干 | 在线免费观看色视频 | 亚洲一区二区三区久久久 | 精品久久久久一区二区国产 | 色噜噜狠狠狠综合曰曰曰88av | 日韩在线观看精品 | 神马久久久久久 | 久久久国产视频 | 成av人在线 | 岛国精品| 亚洲热在线视频 | 久久欧美精品 | 日韩av福利 | 国产精品久久久一区二区 | 一区二区不卡视频 | 另类亚洲专区 | 国产成人一区二区 | 视频二区 | 色吊丝在线 | 亚洲成人一区二区三区 | 九九视频网 | 看亚洲a级一级毛片 | 欧美一区二区三区在线视频 | 亚洲午夜视频 | 欧美精品免费在线 | 操操网| 国产精品一区久久久久 | 嫩草影院黄色 | 日本激情在线 | 人人草视频在线观看 | 久久精品免费看 | 日本黄色激情片 | 亚洲欧美在线播放 | 亚洲高清在线视频 | 成人影院www在线观看 | 国产精品人人做人人爽人人添 | 高清国产一区二区三区 | 黑人巨大精品欧美一区二区小视频 | 超碰天堂 | 三区在线视频 | 日韩性在线| 亚洲综合视频一区 | 日韩免费网站 | 亚洲一区播放 | 久久国产欧美日韩精品 | 日本黄色免费大片 | 91麻豆精品久久久久蜜臀 | 免费毛片网站 | 亚洲一区二区三区在线免费观看 | 2018啪一啪 | 久久午夜影院 | 九色av | 日韩中文一区二区三区 | 99精品全国免费观看视频软件 | 日韩久草 | 99综合 | 日韩视频一区在线观看 | 羞羞视频在线免费观看 | 操一草 | 在线看av网址 | 免费黄色毛片视频 | 国产一区二区三区欧美 | 国产精品视频免费 | 国产婷婷精品av在线 | 国产 在线 | 日韩 | 一区在线视频 | 自拍亚洲 | 国产日韩欧美亚洲 | 亚洲国产精品一区二区久久,亚洲午夜 | 亚洲精品在线免费播放 | 国产99久久精品 | 老牛嫩草一区二区三区眼镜 | 亚洲精品久久久久久久久久久 | 久久精品色欧美aⅴ一区二区 | 青青草av电影 | 久久久艹 | 中文字幕一区在线 | 国产人妖在线 | a中文字幕 | 精品国产一区二区三区成人影院 | 午夜免费视频 | 97超碰免费| 伊人狠狠 | 久久久久国产精品一区二区三区 | 午夜专区 | 国产精拍| 欧美99 | 黄色片视频免费 | 日本黄色大片免费 | 五月婷婷天 | 亚洲精品一区二区三区99 | 国语精品久久 | 日本一区二区不卡视频 | 一级在线观看视频 | 久久草草影视免费网 | 可以在线观看的av网站 | 伊人青青草 | 国产精品毛片在线 | 亚洲精品国产高清 | 成人欧美一区二区三区在线观看 | 亚洲久草 | 精品无人乱码一区二区三区 | 日韩视频在线观看视频 | 亚洲国产情侣自拍 | 成人看片免费网站 | 一级片观看 | 免费色在线| 国产精品一区二区久久久久 | av一区二区三区四区 | 中文字幕久久综合 | 国产欧美精品一区二区色综合朱莉 | 国产精品激情在线观看 | www.操.com| 国产精品久久久久久亚洲调教 | 成人精品 | 成人毛片视频免费 | 欧美video| 97视频久久久| 91久久91久久精品免观看 | 天天天操 | 国产精品成人国产乱一区 | 国产欧美在线视频 | 91精品久久久久久久久久小网站 | 小川阿佐美88av在线播放 | 韩日精品一区 | 日韩欧美视频 | 亚洲视频精品一区 | 99免费精品| a久久免费视频 | 黄色二区| 久久精品一区二区三区中文字幕 | 伊人狠狠干 | 日韩中文在线观看 | 日韩喷潮 | www.久久99| 97精品国产| 午夜在线小视频 | 欧美精品一区三区 | 欧美精品在欧美一区二区少妇 | 亚洲成人精品一区 | 操操操小说 | 91精品午夜| 亚洲毛片在线观看 | 亚洲国产精品久久人人爱 | 国产丝袜在线 | 国产一区二 | 龙珠z国语版291集全 | 一区二区三区在线看 | 高清国产一区二区三区 | 99pao成人国产永久免费视频 | 久久精品一区二区三区四区 | 精品视频久久 | 国产精品成人一区二区三区夜夜夜 | 91精品国产乱码久久久久久久久 | 欧美激情在线精品一区二区三区 | 国产精品福利在线 | 中字幕视频在线永久在线观看免费 | 欧美午夜视频在线观看 | 亚洲综合色视频在线观看 | 日韩高清在线 | 免费亚洲成人 | 亚洲精品国精品久久99热 | 一区视频在线 | 国产高清在线a视频大全 | 国产日韩欧美精品一区二区三区 | www312aⅴ欧美在线看 | 国产福利精品一区 | 国产精选视频 | 99精品视频在线 | 亚洲精品国产剧情久久9191 | 欧美日韩亚洲成人 | ririsao久久精品一区 | 激情五月婷婷在线 | 日韩成人在线视频 | 日本一二三区视频 | 欧美精品久久久久 | 国产精品无码久久久久 | 国产精品日韩 | 毛片免费看| 日韩精品第一页 | 亚洲精品中文字幕中文字幕 | 91精品国产91久久久久久最新 | 精品人伦一区二区三区蜜桃视频 | 色一情| 成人精品一区二区三区中文字幕 | www日批| 国产精品久久久久久妇女6080 | theporn国产在线精品 | 日韩精品一区二区三区在线播放 | 日韩精品免费观看 | 一区二区三区四区在线 | 欧美日韩精品一区二区 | 日韩视频在线观看 | www国产一区 | 亚洲欧美综合乱码精品成人网 | 欧美精品99 | 中文字幕在线视频网站 | 精品视频一区二区三区四区 | 久久二区三区 | 簧片毛片| www.久草.com | 精品一区二区三区在线观看 | 精品少妇一区二区 | 黄色a视频 | 欧洲精品一区二区 | 日韩在线一区二区 | 国产精品久久久久久久久久久杏吧 | 久久综合社区 | 性瘾调教校园h | 天天成人综合网 | 一区二区中文字幕 | 欧美一区二区视频 | 一区二区视频 | 欧美一区精品 | 亚洲视频在线观看免费 | 国产精品网站在线 | 91精品久久久久久久久久 | 免费中文字幕 | 成人亚洲网 | 国产伦精品一区二区三区四区视频 | 99热播在线 | 亚洲毛片在线 | 91麻豆视频 | 亚洲毛片网站 | 亚洲一区二区视频在线观看 | 欧美中文字幕在线 | 亚洲男人天堂网 | 日韩亚洲视频 | 伊人在线 | 一级网站在线观看 | 999热在线 | 最近日韩中文字幕 | 综合久久网 | 日韩欧美一区二区三区 | 操老逼 | 视频一区中文字幕 | 99精品欧美一区二区三区综合在线 | 91精品国产高清一区二区三区 | 国产在线三区 | 欧美自拍视频 | 999国内精品永久免费视频 | 免费一级黄色电影 | 亚洲精品视频在线看 | 婷婷av网站| 久久久久国产精品一区二区三区 | 久久蜜桃av一区二区天堂 | 国产一区免费 | 精品久久久成人 | 久久久国产精品入口麻豆 | 在线亚洲一区二区 | 毛片com| 春色导航| 天堂中文网官网 | 91中文字幕在线观看 | 51ⅴ精品国产91久久久久久 | 国产成人精品久久 | 色黄视频在线 | 日韩视频在线免费观看 | 日韩欧美第一页 | 日韩欧美久久 | 自拍视频在线 | 久久免费视频网 | 欧美在线a| 日本免费三片免费观看 | 欧美性猛xxx | 国产激情精品一区二区三区 | 国产最新视频 | 青青伊人久久 | 国产成人亚洲精品 | 国产美女高潮视频 | 日韩视频网站在线观看 | 91 久久| 欧美一区二区久久 | 欧美一级二级视频 | 亚洲精品乱码 | 欧美自拍视频在线观看 | 美女在线国产 | 黄色一级电影免费观看 | 久草天堂 | 91精品一区二区 | 成人精品网 | 韩日在线观看视频 | 日韩午夜激情 | 日本精品视频网站 | 91成人小视频 | 视频一区二区三区中文字幕 | 在线视频国产一区 | 亚洲综合99| 久久精品免费观看 | 日日干夜夜操 | 男女羞羞视频免费看 | 人人草人人 | 天堂在线一区二区 | www日本高清 | 久热中文| 一区二区免费播放 | 国产亚洲二区 | 亚洲精品久久久久久久久久久久久 | 一区二区三区精品视频 | 国产99久久精品 | www.久久视频 | 最新黄色网页 | 一区二区三区在线观看免费 | 国产情品 | 自拍偷拍一区二区三区 | 五月免费视频 | www.xxxx在线观看 | 国产成人av在线 | 热久久这里只有精品 | 中文字幕亚洲欧美精品一区四区 | 国产精品1区2区 | www.国产高清| 亚洲成av | 天堂在线一区二区 | 一本一道久久a久久精品逆3p | 精品国产一区二区三区成人影院 | 韩国毛片在线 | 高清日韩av | 成人a网 | 玖玖综合网| 国产成人一区 | 久久免费精品视频 | 性色浪潮| 国产成人99久久亚洲综合精品 | 日韩精品视频久久 | 在线精品日韩 | 成年人看的羞羞网站 | 狠狠色综合久久丁香婷婷 | 亚洲精品日韩激情在线电影 | 99精品视频一区二区三区 | 国产色| 欧美成人第一页 | 91免费观看国产 | 日本一区二区不卡 | www.欧美| 中文字字幕一区二区三区四区五区 | 国产在线精品一区 | www.一区二区三区 | 久久青青 | 久久99精品视频 | 日韩一区二区福利视频 | 在线一级电影 | 亚洲国产日韩a在线播放性色 | 亚洲精品久久久久久一区二区 | 成人午夜免费视频 | 色偷偷噜噜噜亚洲男人 | 成人精品 | jlzzjlzz亚洲日本少妇 | 欧美国产精品一区二区 | 国产精品久久久久久一级毛片 | 成人欧美一区二区三区黑人孕妇 | 亚洲视频欧美视频 | 日韩国产高清在线 | 午夜精品视频 | 日日夜夜草 | 爱爱网址 | 国产精品成人一区二区三区夜夜夜 | 日本女人高潮视频 | 精品国产髙清在线看国产毛片 | 久久国产区 | 国产91在线观看 | 日韩av一区在线 | 在线观看国产精品一区 | 国产成人精品一区二区三区视频 | 欧美日韩国产精品一区二区 | 欧美一区二区三区黄色 | 亚洲欧美中文字幕 | 91精品国产一区二区 | 国产成人精品一区二区三区网站观看 | 亚洲黄网在线观看 | 国产精品伦理一区 | 一区二区三区在线播放 | 欧美久久久久久久久久久 | 成人在线观看免费视频 | 日本黄网站在线观看 | 黄色一级毛片免费 | 日韩欧美在线看 | 久久99精品久久久久久琪琪 | 久热久热 | 免费在线观看国产 | 久久蜜桃精品一区二区三区综合网 | 国产欧美精品一区二区三区 | 永久精品 | 精品九九 | 国产成人一区二区三区 | 玖玖操 | 韩国精品一区二区三区 | 激情com | 欧美一级二级视频 | 高清日韩av | 亚洲精品v | 精品国产乱码久久久久久久软件 | 国产日韩欧美激情 | 国产一区二区三区在线免费观看 | 亚洲一区中文字幕在线观看 | 久久国内免费视频 | 亚洲成人av在线 | 四虎影院最新网址 | 欧美xxxx性| 国产欧美久久一区二区三区 | 在线观看国产精品一区二区 | 国产一区免费 | 羞羞视频网站在线看 | 自拍视频在线观看免费 | yy6080久久伦理一区二区 | 国产一级在线观看 | 日本a v在线播放 | 日本视频一区二区三区 | 欧美日韩在线免费观看 | 可以看av的网站 | 国产精品国产精品国产专区不片 | 久久av综合 | 中文字幕精品一区 | 日韩在线视频资源 | 精品亚洲视频在线观看 | 欧美精产国品一二三区 | 欧美二三区 | 国产精品日韩精品 | 国产精品1区2区3区 中文字幕一区二区三区四区 | 一区二区三区欧美 | 国产玖玖 | 三级黄色片在线 | 在线观看视频一区二区 | 四虎永久免费影院 | 中文字幕免费在线 | 精品国产一区二区三区久久 | 欧美亚洲一 | 久久久精品网 | 国产精品毛片久久久久久 | 黄色一级免费观看 | 亚洲一区二区中文字幕在线观看 | 中文字幕不卡在线88 | 97久久精品午夜一区二区 | 欧美在线视频一区二区 | 国产亚洲综合精品 | www.久久精品 | 国产一区精品视频 | 欧美日韩一区二区三区在线观看 | 久久久a| 国产专区一区二区三区 | 国产一区在线免费 | 免费中文字幕 | 99精品欧美一区二区蜜桃免费 | 久久国产成人 | 激情综合在线 | 国产网站在线播放 | 久久男女视频 | 久久精品免费国产 | 另类 综合 日韩 欧美 亚洲 | 视频一区二区三区中文字幕 | 亚洲在线 | 中国特级黄色片 | 国产区福利 |