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

Vue如何二次封裝一個高頻可復用的組件

開發 開發工具
在我們的業務里,我們通常會二次封裝一些高頻業務組件,比如彈框,抽屜,表單等這些業務組件,為什么要二次封裝?

在我們的業務里,我們通常會二次封裝一些高頻業務組件,比如彈框,抽屜,表單等這些業務組件,為什么要二次封裝?我們所有人心里的答案肯定是,同樣類似的代碼太多了,我想復用組件,或者原有組件可能達不到我想要的效果,我想基于原有組件自定義一些自己的接口,那么此時就需要二次封裝了。二次封裝雖好,但同時也會帶來一定的心智負擔,因為二次封裝的組件可能會變得不那么純粹。

本文是一篇筆者關于二次封裝組件的思考,希望看完在項目中有所思考和幫助。

在內容開始之前,本文主要從以下幾個方向去思考:

1、二次組件必須繼承原有組件的所有特性。

2、二次組件名必須見名知意。

3、自定義暴露出來的接口越簡單越好。

4、留有自定義插槽,讓用戶可以自己選擇。

5、封裝二次的組件,能根據schame數據配置,讓組件更通用。

繼承原有組件接口

在之前的項目例子中,我們以一個彈框組件為例:

我們看下在業務中一般是怎么寫的。

<template>
<div class="list-app">
<div><a href="javascript:void(0)" @click="handleToHello">to hello</a></div>
...
<list-modal
title="編輯"
width="50%"
v-model="formParams"
:visible.sync="dialogVisible"
@refresh="featchList"
></list-modal>
</div>
</template>
<script>
import { sourceDataMock } from '@/mock';
import ListModal from './ListModal';


export default {
name: 'list',
components: {
ListModal,
},
...
};
</script>

我們再繼續看下list-modal這個組件。

<!--ListModal.vue-->
<template>
<el-dialog
:visible.sync="currentVisible"
width="30%"
v-bind="$attrs"
>
<el-form label-position="left" label-width="80px" :model="formParams">
<el-form-item label="日期">
<el-input v-model="formParams.date"></el-input>
</el-form-item>
<el-form-item label="名稱">
<el-input v-model="formParams.name"></el-input>
</el-form-item>
<el-form-item label="地址">
<el-input v-model="formParams.address"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="closeModal">取 消</el-button>
<el-button type="primary" @click="handleSure">確 定</el-button>
</span>
</el-dialog>
</template>

我們會發現,這個list-modal業務組件只是包了一層,當我們使用v-bind="$attrs"時,vue提供的這個api會將父組件所有的props繼承,官方給了一大段解釋。

  • $attrs

包含了父作用域中不作為 prop 被識別 (且獲取) 的 attribute 綁定 (class 和 style 除外)。當一個組件沒有聲明任何 prop 時,這里會包含所有父作用域的綁定 (class 和 style 除外),并且可以通過 v-bind="$attrs" 傳入內部組件——在創建高級別的組件時非常有用。

首先我們思考為什么要用這個$attrs?上面一段話的意思是,父組件class與style會排除。

圖片

我們從頁面上可以看出title與width都是父組件傳過來的,但是我們發現,實際上這兩個外部看似自己傳入的props也是el-dialog的props,所以說我們必須要保持自己二次封裝的組件也有el-dialog所有能力,所以此時v-bind='$attrs'就可以做到了。

  • $listeners

包含了父作用域中的 (不含 .native 修飾器的) v-on 事件監聽器。它可以通過 v-notallow="$listeners" 傳入內部組件——在創建更高層次的組件時非常有用。

在以上的$attrs我們是將父級的所有的props都拿到了,但是自定義事件呢,所以才有的了$listeners。

所以你在父組件寫了一個el-dialog的自定義事件想要生效,那么必須要在子組件綁定$listeners。

<!--list/ListModal.vue-->
<el-dialog
:visible.sync="currentVisible"
width="30%"
v-bind="$attrs"
v-notallow="$listeners"
>
...
</el-dialog>

正常來說一個高階二次組件必須要有v-bind="$attrs"與v-notallow="$listeners"。

另外我們自己封裝的二次組件里有v-model='formParams'。

這個formParams就是我們彈框內部表單的使用內容。

v-model

關于v-model實際上官方解釋就是用在組件或者表單上創建雙向綁定,如果把v-model看成是一個內部提供的一個語法糖,那么它可以拆解成:value="value"與:input=“handleInput”,v-model不僅僅是可以作用在表單元素上,并且還可以作用在組件上,同時也提供了一個model的接口,提供自定義修改事件名稱。

<script>
export default {
name: 'list-modal',
model: {
prop: 'formParams',
event: 'change',
},
props: {
visible: {
type: Boolean,
default: false,
},
formParams: {
type: Object,
},
},
data() {
return {
currentVisible: false,
};
},
watch: {
visible(bool) {
this.currentVisible = bool;
},
currentVisible(bool) {
this.$emit('update:visible', bool);
},
}
};
</script>

以上代碼就自定義了model的event,prop就是formParams,同時props上必須有引入formParams。

不知道你有沒有好奇,為啥我data中定義了一個currentVisible,而且watch了visible與currentVisible,使用currentVisible時,這里是有一個坑,因為彈框的icon關閉操作不會觸發最外層事件,也就是你點擊右上角的關閉操作后,當你再次打開時,此時,就打不開了,所以就沒直接用visible了,我們需要另一個變量,然后去watch最終達到我們需要的效果。

在這里有人會奇怪,傳入子組件的formParams直接在表單上使用了,嘿,這樣不是直接修改props嗎,但實際上控制臺并不會報錯,如果你父組件傳入的是一個基礎數據類型,你在子組件里修改是會直接警告你不能修改的,但是你傳入的是一個對象,你此時修改的是對象屬性值,并沒有修改原對象,所以一個非基礎數據類型數據,修改內部值時,是不會警告的,這樣做也是ok的。

插槽

在這個彈框中的確認和取消操作是用插槽slot="footer"去顯示的,如果你想自定義插槽,那么你可以通過具名插槽進行兼容處理。

<el-dialog
:visible.sync="currentVisible"
width="30%"
v-bind="$attrs"
v-on="$listeners"
>
...
<template v-if="$slots.footer">
<slot name="footer" />
</template>
<span v-else slot="footer" class="dialog-footer">
<el-button @click="closeModal">取 消</el-button>
<el-button type="primary" @click="handleSure">確 定</el-button>
</span>
</el-dialog>

在我們的業務中有大量這樣的XXXModal彈框,如果我們只是這樣包了一層,那么我們只是完成了組件的基本使用,也是符合我們常規業務需求,但是你會發現,我們絕大部份業務里的彈框內容都是表單,所以我能不能通過可配置的schame數據去配置出來呢?

組件更抽象

我們在components下新建了一個form-modal組件,并注冊成全局組件,我的目標是把彈框的內容區域做成可配置化,這樣我只需要用配置數據就可以渲染出對應的內容。

<!--src/components/form-modal/view/index.vue-->
<template>
<div class="form-modal">
<el-dialog :visible.sync="currentVisible" v-bind="$attrs" v-on="$listeners">
<el-form v-bind="formConfig.formAttrs" :model="formParams">
<div v-for="(item, index) in formConfig.fields" :key="index">
<el-form-item :label="item.label">
<!--自定義插槽-->
<template v-if="item.slot">
<slot :name="item.slot" :row="{ ...item, formParams, index }" />
</template>
<!--文本or文本域-->
<template v-else-if="['text', 'textarea'].includes(item.type)">
<el-input
:type="item.type"
v-bind="item.attrs || {}"
v-model="formParams[item.key]"
></el-input>
</template>
<!--下拉框-->
<template v-else-if="item.type === 'select'">
<el-select v-bind="item.attrs" v-model="formParams[item.key]">
<el-option
v-for="(sitem, index) in item.options.data"
:key="index"
:label="sitem[item.options.extraProps.label]"
:value="sitem[item.options.extraProps.value]"
>
</el-option>
</el-select>
</template>
</el-form-item>
</div>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="closeModal">取 消</el-button>
<el-button type="primary" @click="handleSure">確 定</el-button>
</span>
</el-dialog>
</div>
</template>

全局注冊

// src/components/index.js
import Vue from 'vue';
import FormModal from './form-modal';
const custCompoment = {
FormModal,
};
export const installCustComponent = () => {
Object.keys(custCompoment).forEach((key) => {
Vue.component(key, custCompoment[key]);
});
};

main.js

// main.js
import { installCustComponent } from '@/components';
installCustComponent();
...

我們發現在模版里面有不少添加條件,實際上,這些條件主要根據你業務需要而定,除了模版方式,插槽,我們也可以預留一個自定義formater的接口,像下面這樣。

<!--src/components/form-modal/view/index.vue-->
<div v-for="(item, index) in formConfig.fields" :key="index">
<el-form-item :label="item.label">
<!--自定義render-->
<template v-if="item.formater">
<component
:is="'renderComponent'"
:value="formParams[item.key]"
:input="e => formParams[item.key] = e"
v-bind="{ ...item }"
></component>
</template>
<!--自定義插槽-->
<template v-else-if="item.slot">
<slot :name="item.slot" :row="{ ...item, formParams, index }" />
</template>
<!--文本or文本域-->
...
</el-form-item>
</div>

那么此時你會發現有一個renderComponent這樣的自定義組件,我們必須引入進來。

/* src/components/form-modal/view/render.js*/
export default {
functional: true,
props: ['value'],
render(h, ctx) {
const { formater, attrs, input: handleInput } = ctx.data.attrs;
return formater(h, {
attrs: {
...attrs,
value: ctx.props.value,
},
on: {
input(e) {
handleInput(e);
},
},
});
},
};

在form-modal/view/index.vue中我們必須引入,所以模版中就可以使用了。

<script>
// src/components/form-modal/view/index.vue
import renderComponent from './render';
export default {
name: 'form-modal',
model: {
prop: 'formParams',
event: 'change',
},
components: {
renderComponent,
},
props: {
visible: {
type: Boolean,
default: false,
},
formParams: {
type: Object,
},
formConfig: {
type: Object,
},
},
...
</script>

我們再看下我們之前業務彈框與schame再次抽象后的兩個組件,其實第二個全局組件就多了一個formConfig,我們統一把內容抽離了出去,實際上呢,我們的form-modal就變得更加通用,我們只需要關注formConfig這份配置數據就行。

/* eslint-disable func-names */
<template>
<div class="list-app">
...
<list-modal
title="編輯"
width="50%"
class="list-modal"
style="border: 1px solid transparent"
v-model="formParams"
:visible.sync="dialogVisible"
@refresh="featchList"
@close="handleClose"
>
<div slot="footer">確定</div>
</list-modal>
<form-modal
title="編輯"
width="50%"
class="list-modal"
style="border: 1px solid transparent"
v-model="formParams"
:formConfig="formConfig"
:visible.sync="dialogVisible2"
@refresh="featchList"
@close="handleClose"
>
<template slot-scope="{ row }" slot="number">
<el-input
:type="row.type"
v-bind="row.attrs || {}"
v-model="row.formParams[row.slot]"
></el-input>
</template>
</form-modal>
</div>
</template>


<script>
import { sourceDataMock } from '@/mock';
import ListModal from './ListModal';
export default {
name: 'list',
components: {
ListModal,
},
data() {
return {
...
tableData: [],
dialogVisible: false,
dialogVisible2: false,
formParams: {
date: '',
name: '',
address: '',
number: '1',
scholl: '公眾號:Web技術學苑',
},
};
},
computed: {
formConfig() {
return {
formAttrs: {
labelWidth: '80px',
labelPosition: 'left',
},
fields: [
{
type: 'text',
key: 'date',
label: '日期',
attrs: {
placeholder: '請填寫日期',
},
},
{
type: 'text',
key: 'name',
label: '名稱',
attrs: {
placeholder: '請填寫名稱',
},
},
{
type: 'select',
key: 'address',
label: '地址',
attrs: {
placeholder: '請選擇地址',
style: {
width: '100%',
},
},
options: {
data: this.tableData,
extraProps: {
value: 'address',
label: 'address',
},
},
},
{
type: 'text',
slot: 'number',
label: '編號',
attrs: {
placeholder: '請輸入編號',
},
},
{
type: 'text',
key: 'scholl',
label: '畢業學校',
attrs: {
placeholder: '請輸入畢業學校',
},
formater: (h, props) =>
h('el-input', {
...props,
}),
},
],
};
},
},
};
</script>


<style scoped>
.list-app .el-form {
text-align: left;
}
</style>

看下最終的結果:

圖片

在我們自定義一個formater的接口,我們注意到,實際上這里有用vue的純函數組件,我們注意到在render.js中我們是申明了functional: true,這里會有巨坑,如果是一個函數組件,在render函數中是獲取不到this的,只能通過第二個ctx參數獲取父組件傳入的props信息。

/* eslint-disable no-param-reassign */
export default {
functional: true,
props: ['value'],
render(h, ctx) {
// console.log(this, '---'); // 會是null,只能通過第二個參數ctx拿對應參數
const { formater, attrs, input: handleInput } = ctx.data.attrs;
return formater(h, {
attrs: {
...attrs,
value: ctx.props.value,
},
on: {
input(e) {
handleInput(e);
},
},
});
},
};

并且我們修改數據,我們發現我們用了一個父組件傳入的一個回調函數去修改,這在react很常見,這里我們也是通過回調方式修改數據,因為vue數據流是單向的,所以只能這種方式去修改了。

因此在業務中我們的form-modal就變得更通用,更高頻了,這樣會減少你重復勞動的時間,你只需要關注配置接口信息就行。

但是這樣帶來的負擔是有的,如果這個form-modal耦合了太多業務邏輯,那么帶來的心智負擔是有的,當你二次封裝的一個高頻組件,你組內小伙伴不能像使用第三方組件庫那么快捷時,說明組件的接口設計還有提高的空間,判斷一個組件好不好用的標準就是,零負擔,而且人人能改,人人都能改動,如果因為業務特殊,當我們考慮二次封裝一個組件參雜很多業務邏輯判斷時,那我的觀點是,還是不要進行二次封裝了。

總結

以一個彈框組件為例,我們二次封裝組件到底需要注意哪些問題,以及我們必須注意些什么,核心思想就是繼承原有組件的特性,v-bind='$attrs'與v-notallow="$listeners"是核心。

當我們二次封裝一個組件時,我們自定義的一些接口能少就少,組件名必須見名知意。

二次封裝的組件不僅僅只是包一層,我們可以嘗試用數據配置方式讓組件更通用,預留一些接口插槽,或者自定義formater函數,不強制約束,讓組件靈活性拓展性更強些。

組件的props名字盡量不要帶來負擔,最好與原有組件props保持一致。

本文code example[1]。

參考資料

[1]code example: https://github.com/maicFir/lessonNote/tree/master/vue/05-keep-alive。

責任編輯:武曉燕 來源: Web技術學苑
相關推薦

2022-05-13 08:46:46

jsoneditorjson編輯器

2023-04-10 08:30:30

json編輯器typescript

2021-05-05 11:34:09

前端開發技術熱點

2024-07-30 08:59:22

2024-04-01 11:52:46

2024-03-13 13:39:21

2021-12-05 21:05:49

前端JSON API

2021-03-03 08:32:09

開源子節點組件

2018-01-31 15:45:07

前端Vue.js組件

2015-12-04 11:36:04

SaaS架構設計可持續

2024-11-20 13:18:21

2025-06-16 01:00:00

2024-11-15 10:03:43

應用模板Vue

2024-01-22 04:15:00

Vue3組件開發

2022-04-12 14:00:05

元宇宙人工智能安全

2022-09-20 11:00:14

Vue3滾動組件

2015-03-10 11:21:44

JavaScript組JavaScript

2021-09-03 13:54:45

雙重勒索勒索軟件攻擊

2023-05-17 10:05:35

組件設計(Modal)組件

2020-10-29 15:13:55

數字科技金融行業互聯網
點贊
收藏

51CTO技術棧公眾號

日韩aⅴ视频一区二区三区| 久久91精品国产91久久久| 亚洲性生活网站| 免费在线观看一级毛片| 免费在线看成人av| 久久综合久中文字幕青草| 亚洲午夜精品在线观看| 欧美人与禽性xxxxx杂性| 91一区二区三区在线观看| 国产精品va在线| 男人操女人的视频网站| 日韩欧美影院| 91精品婷婷国产综合久久竹菊| 国产日韩专区在线| 日本黄色录像片| 成人免费一区| 亚洲精品免费播放| 欧美在线视频一区二区三区| 99久久亚洲精品日本无码| 99在线精品视频在线观看| 尤物九九久久国产精品的分类| 日韩极品视频在线观看| 日韩一区二区三区中文字幕| 国产在线播放一区二区三区| 国内精品伊人久久| 97精品在线播放| 亚洲丝袜美腿一区| 欧美videos大乳护士334| 爱情岛论坛vip永久入口| 182在线视频观看| 中文字幕日本乱码精品影院| 欧美激情国产日韩| 亚洲av无码一区二区三区性色| 亚洲在线久久| 亚洲欧美激情视频| 美女伦理水蜜桃4| 91精品麻豆| 欧美三级在线视频| 欧美 国产 综合| 羞羞的网站在线观看| 国产精品国模大尺度视频| 精品无人区一区二区三区竹菊| 久久久久久91亚洲精品中文字幕| 风间由美中文字幕在线看视频国产欧美| ...av二区三区久久精品| 极品校花啪啪激情久久| 国产高清精品软件丝瓜软件| 久久国产欧美日韩精品| 国产精品video| 老熟妇仑乱一区二区av| 亚洲国产精品第一区二区| 欧美美最猛性xxxxxx| 亚洲 欧美 变态 另类 综合| 久久伦理在线| 色综合伊人色综合网| 一级黄色录像毛片| 国产欧美一区二区三区精品观看| 91麻豆精品国产91久久久久久 | 99热这里只有精| 日韩精品欧美精品| 欧洲中文字幕国产精品| 欧美特黄aaaaaa| 国产欧美日韩一区二区三区在线| 国产一区二区三区三区在线观看| 亚洲一区二区三区四区五区| 国产精品66| 欧美日韩在线播| 亚洲另类第一页| 国产一区二区三区亚洲综合| 欧美一区二区在线免费播放| 欧美一级小视频| 999久久久国产999久久久| 欧美一区中文字幕| 真实乱偷全部视频| 99国产精品久久一区二区三区| 日本乱码高清不卡字幕| 国产a级一级片| 亚洲天堂导航| 在线免费亚洲电影| 奇米视频888| 日本超碰一区二区| 欧美精品一区二区久久婷婷| aa片在线观看视频在线播放| 蜜臀久久99精品久久一区二区| 欧美成人激情免费网| 国产午夜在线一区二区三区| 国产精品调教视频| 亚洲片在线资源| 久久国产高清视频| 亚洲午夜视频| 国产精品xxxxx| 国产三级小视频| www.爱久久.com| 日本高清不卡三区| av片在线观看| 精品成人国产在线观看男人呻吟| 天堂а√在线中文在线| 涩涩视频在线免费看| 精品视频在线免费| 欧美久久久久久久久久久| 日本中文字幕在线一区| 日韩在线视频网| 久久久久亚洲av成人片| 丝袜亚洲另类欧美综合| 91黄色国产视频| 免费在线性爱视频| 亚洲精品少妇30p| 91av俱乐部| 丁香五月缴情综合网| 中文字幕国产精品| 黄色片视频网站| 久久99精品国产麻豆婷婷| 国产视频在线观看一区| 在线a免费看| 精品久久久久国产| 无套内谢丰满少妇中文字幕 | 在线视频国内一区二区| 女人扒开双腿让男人捅| 精品国产a一区二区三区v免费| 精品亚洲永久免费精品| 91嫩草丨国产丨精品| 国产精品最新自拍| 亚洲综合自拍一区| 成年人在线看| 婷婷中文字幕一区三区| 黄色三级视频在线播放| 成人影院在线| 日本中文字幕成人| 日本激情一区二区| 亚洲精品免费播放| 国产三级精品三级在线| 精品国产一区二区三区香蕉沈先生| 亚洲老头老太hd| 激情四射综合网| 精品一区二区三区视频在线观看| 亚洲一区二区三区久久| 成人精品一区| 日韩欧美在线网址| 中文人妻一区二区三区| 欧美日韩成人| 2020国产精品久久精品不卡| 免费在线毛片网站| 欧美日韩你懂的| 久久亚洲无码视频| 久久综合网络一区二区| 好吊色欧美一区二区三区视频| 日韩一二三四| 欧美性少妇18aaaa视频| 国产白嫩美女无套久久| 日韩一级在线| 久久久福利视频| 日本不良网站在线观看| 亚洲第一福利在线观看| 国产一级视频在线观看| 国产精品一区三区| 久久久国内精品| 大奶在线精品| 国内精品久久久久久久久| 内射无码专区久久亚洲| 亚洲成人tv网| 丰满少妇在线观看资源站| 免费国产自线拍一欧美视频| 茄子视频成人在线观看| 日韩av超清在线观看| 中文字幕日韩专区| 91久久精品国产91性色69| 中文字幕在线播放不卡一区| 国产传媒免费观看| 你懂的一区二区| 国产精品.com| 三级在线看中文字幕完整版| 亚洲嫩模很污视频| 中文字幕在线观看视频一区| 最好看的中文字幕久久| 老司机av网站| 日韩午夜av| 欧洲精品亚洲精品| 婷婷激情成人| 欧美激情精品久久久久久黑人| 亚洲精品一区二区二区| 国产精品进线69影院| 爱情岛论坛亚洲自拍| 韩国在线视频一区| 欧美国产综合视频| 91精品在线免费视频| 久久久久国产精品免费网站| 青青色在线视频| 欧美日韩国产首页| 国产在线观看免费av| 久久男人中文字幕资源站| 亚洲成人天堂网| 国产精品mm| 天堂av一区二区| 国产精品一区二区三区www| 91精品国产九九九久久久亚洲| www.日韩在线观看| 日韩欧美高清在线视频| 人与动物性xxxx| 成人午夜视频网站| 美女少妇一区二区| 亚洲精品美女91| 伊人久久大香线蕉精品| 欧美成人基地| 91精品啪aⅴ在线观看国产| 成人免费图片免费观看| 在线亚洲国产精品网| 人妻精品一区二区三区| 欧美日韩一区二区在线观看视频| 日本污视频网站| 国产酒店精品激情| 欧美黑人又粗又大又爽免费| 激情欧美国产欧美| 在线国产99| 自拍偷拍精品| 国产精品一区二区欧美| 久久91视频| 日韩免费在线观看视频| 超碰97免费在线| 久久国产精品亚洲| 成人高清免费观看mv| 日韩www在线| 黄色一级大片在线免费看国产| 亚洲成精国产精品女| 91视频免费看片| 久久久久久久久久久久久久久99| 宅男噜噜噜66国产免费观看| 日韩午夜在线电影| www.夜夜爱| 一区二区三区中文| 一区二区在线高清视频| 精品久久久久久久| 麻豆av一区二区| 色愁久久久久久| 国产日产精品一区二区三区四区| 亚洲天堂资源| 性欧美办公室18xxxxhd| 青草在线视频在线观看| 久久亚洲国产精品成人av秋霞| 黄色三级网站在线观看| 日韩一区二区免费电影| 国产男男gay体育生网站| 在线观看视频一区二区| 色av性av丰满av| 日韩欧美成人免费视频| 岛国av中文字幕| 色狠狠桃花综合| 国产性生活视频| 91久久精品国产91性色tv| av片免费观看| 欧美性色综合网| 中国老头性行为xxxx| 欧美亚洲综合色| 久久午夜鲁丝片| 欧美性受xxxx| 一区二区久久精品66国产精品| 亚洲风情在线资源站| 免费无遮挡无码永久在线观看视频| 91视频91自| 亚洲一区二区三区蜜桃| 国产视频一区二区在线观看| 国产1区2区在线观看| 国产精品三级久久久久三级| 人与动物性xxxx| 一区二区三区av电影 | 91女人18毛片水多国产| 欧美日韩色综合| 国产免费黄色网址| 欧美一区日韩一区| 性猛交xxxx乱大交孕妇印度| 欧美精品一区二区三区很污很色的| 中文字幕在线视频第一页| 高跟丝袜欧美一区| 在线观看污污网站| 欧美日韩一区二区三区高清| 国产视频一区二区三| 精品av综合导航| 可以在线观看的黄色| www.亚洲一区| 日本动漫理论片在线观看网站| 最新的欧美黄色| 大地资源网3页在线观看| 久久久伊人日本| 依依综合在线| 91免费视频国产| 激情小说亚洲图片| 日韩免费电影一区二区| 亚洲91视频| 青青视频在线播放| 久久超碰97中文字幕| 亚洲成av人片在线观看无| 国产三级欧美三级| 少妇影院在线观看| 色噜噜狠狠一区二区三区果冻| 国产精品一区二区6| 欧美又粗又大又爽| 丰满熟妇人妻中文字幕| 日韩精品在线视频| 国产激情视频在线观看| 8x海外华人永久免费日韩内陆视频| 丁香花在线观看完整版电影| 国产91精品青草社区| 亚洲一区二区小说| 免费h精品视频在线播放| 91麻豆精品国产91久久久平台 | 好看的日韩av电影| 久久久久久香蕉| 成人性生交大片免费看中文网站| 欧美熟妇另类久久久久久多毛| 国内成人自拍视频| 三上悠亚ssⅰn939无码播放| 亚洲精品综合在线| 亚洲av无码不卡| 亚洲成人网在线观看| 欧美私人网站| 日韩免费观看网站| 精品三级av在线导航| 伊人再见免费在线观看高清版| 亚洲一区二区三区| 黑森林精品导航| 91丨porny丨在线| 久久久久久久久久91| 欧美二区在线观看| 国产在线视频福利| 91国在线精品国内播放| 日韩中文字幕| 在线观看成人一级片| 久久国产99| 中出视频在线观看| 无吗不卡中文字幕| 亚洲精品国产一区二| 久久影院中文字幕| 日韩av电影资源网| 欧美日本亚洲| 夜夜精品视频| 久久精品女同亚洲女同13| 一区二区三区美女| www.久久久久久久久久| 久久韩剧网电视剧| 国模私拍国内精品国内av| 日本高清不卡三区| 日韩成人精品在线| 级毛片内射视频| 在线一区二区三区| 美女欧美视频在线观看免费 | 国产精品夜夜嗨| 日本黄色录像视频| 欧美高清激情brazzers| 久草中文在线| 91久久爱成人| 亚洲免费二区| 久久久久无码精品| 亚洲综合一区二区精品导航| 亚洲av无码片一区二区三区| 欧美精品久久久久久久久久| 国产精品一区二区中文字幕| 一二三四视频社区在线| 91亚洲精品久久久蜜桃| 伊人中文字幕在线观看| 一区二区三区黄色| 国产精品xxx| 欧美性视频在线播放| 国产乱人伦偷精品视频不卡| 精品午夜福利在线观看| 亚洲精品国产电影| 深夜成人影院| 亚洲永久一区二区三区在线| 激情都市一区二区| 久久久久久久久久久网| 亚洲激情中文字幕| 精品无人乱码一区二区三区 | 国产成人鲁鲁免费视频a| 婷婷综合成人| 一区二区三区入口| 亚洲欧美另类久久久精品| 六月婷婷综合网| 欧美孕妇孕交黑巨大网站| 精品免费在线| 国产一级片中文字幕| 午夜av一区二区三区| 精品乱码一区二区三四区视频| 97精品国产91久久久久久| 人妖一区二区三区| 成人免费在线观看视频网站| 亚洲男帅同性gay1069| 午夜影院免费视频| 国产日韩精品入口| 91久久视频| 国产又粗又硬视频| 精品久久久久香蕉网| 在线成人视屏| 日本国产中文字幕| 久久久青草青青国产亚洲免观| 日韩少妇高潮抽搐| 亚洲无线码在线一区观看| 免费一区二区三区在线视频| 成人免费观看视频在线观看| 亚洲视频 欧洲视频| 人成免费电影一二三区在线观看| 欧美一级视频在线观看| 色999日韩|