在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當(dāng)前位置:雨林木風(fēng)下載站 > 網(wǎng)頁設(shè)計(jì)教程 > 詳細(xì)頁面

JSON生成Form表單的詳細(xì)解析(代碼案例)

JSON生成Form表單的詳細(xì)解析(代碼案例)

更新時(shí)間:2025-12-08 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

導(dǎo)網(wǎng)頁的本質(zhì)就是超級(jí)文本標(biāo)記語言,通過結(jié)合使用其他的Web技術(shù)(如:腳本語言、公共網(wǎng)關(guān)接口、組件等),可以創(chuàng)造出功能強(qiáng)大的網(wǎng)頁。因而,超級(jí)文本標(biāo)記語言是萬維網(wǎng)(Web)編程的基礎(chǔ),也就是說萬維網(wǎng)是建立...
網(wǎng)頁的本質(zhì)就是超級(jí)文本標(biāo)記語言,通過結(jié)合使用其他的Web技術(shù)(如:腳本語言、公共網(wǎng)關(guān)接口、組件等),可以創(chuàng)造出功能強(qiáng)大的網(wǎng)頁。因而,超級(jí)文本標(biāo)記語言是萬維網(wǎng)(Web)編程的基礎(chǔ),也就是說萬維網(wǎng)是建立在超文本基礎(chǔ)之上的。超級(jí)文本標(biāo)記語言之所以稱為超文本標(biāo)記語言,是因?yàn)槲谋局邪怂^“超級(jí)鏈接”點(diǎn)。
本篇文章給大家?guī)淼膬?nèi)容是關(guān)于JSON生成Form表單的詳細(xì)解析(代碼實(shí)例),有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對你有所幫助。

JSON表單

描述

JSON表單是一個(gè)基于React的抽象組件,它可以把JSON數(shù)據(jù)格式描述的表單轉(zhuǎn)換成項(xiàng)目中的表單,它可以用簡短的幾行代碼,快速的生成Form表單。
JSON表單的優(yōu)點(diǎn)是:

  1. 可以快速構(gòu)建出一個(gè)表單

  2. 表單的數(shù)據(jù)、邏輯、視圖分離,方便抽離和進(jìn)一步抽象

  3. 提供校驗(yàn)、自動(dòng)緩存等額外功能,提升錄入體驗(yàn)

  4. 可以跨項(xiàng)目的共用復(fù)雜的表單組件

原始表單的缺點(diǎn)

1:代碼量龐大,開發(fā)效率低
每次開發(fā)一個(gè)表單頁的時(shí)候,都需要重復(fù)編寫表單組件及其交互事件的代碼,這塊代碼重復(fù)編寫且與主線業(yè)務(wù)邏輯無關(guān),除此之外,表單的校驗(yàn)、緩存等額外功能,也需要不少的代碼量,這樣就造成了一個(gè)表單頁的代碼量龐大。

2:不便于抽離和進(jìn)一步的抽象
在一個(gè)表單頁內(nèi),往往會(huì)將表單數(shù)據(jù)、表單組件、控制邏輯雜糅在一起,當(dāng)發(fā)現(xiàn)某一個(gè)子功能在很多場景下都需要用到的時(shí)候,想把該子功能拆分出來發(fā)現(xiàn)并不容易,因?yàn)檫壿嫛?shù)據(jù)、視圖的雜糅,導(dǎo)致想把子功能不受影響的剔除出來需要很仔細(xì)的檢查,這樣就導(dǎo)致功能的抽離和抽象的不便

3:維護(hù)成本高
這個(gè)和第二個(gè)問題是同樣的原因,這也是我的親身經(jīng)歷,當(dāng)我在項(xiàng)目中想優(yōu)化一個(gè)小功能的時(shí)候,發(fā)現(xiàn)不僅把之前的邏輯改沒了,還引出了不少的bug,這導(dǎo)致在一個(gè)邏輯很復(fù)雜的表單里,維護(hù)變成了一件高危工作。

4:需要額外處理校驗(yàn)和緩存等功能

一個(gè)栗子

const config = {
    formKey: 'example-form',
    data: {
        name: '',
        descr: '',
        typeName: ''
    },
    config: [
        {
            type: 'input',
            dataKey: 'name',
            label: 'param',
            placeholder: '請輸入param',
            validate: ['required', /^[a-zA-Z_{}0-9]+$/g],
            style: {
                display: 'inline-block',
                width: 270,
            },
        },
        {
            type: 'select',
            dataKey: 'typeName',
            options: ['string', 'integer', 'float'],
            style: {
                display: 'inline-block',
                width: 100,
                margin: '0 15px'
            },
            validate: [{type: 'required', message: 'param類型不能為空'}]
        },
        {
            type: 'textarea',
            dataKey: 'descr',
            placeholder: '請輸入param含義',
            label: 'param含義',
            validate: ['required'],
            style: {
                width: 385,
            }
        },
    ]
}

<From ref={ref => this.FormWrap = ref} config={config}></From>

上面是用JSON描述的三個(gè)常用的表單組件組合成的表單,其效果圖如下:

2367522610-5bf22f6385b7a_articlex.png

JSON表單的格式

{
    formKey: 'paramAddForm',
    data: {},
    config: []
}
屬性是否必傳說明類型默認(rèn)值
formKey用來自動(dòng)緩存,localStorage的key,不傳表示不自動(dòng)緩存string-
className用來添加一些自定義樣式string-
data表單的提交數(shù)據(jù),有自動(dòng)緩存和校驗(yàn)功能object-
assisData用于表單控制邏輯的額外數(shù)據(jù)object-
config組件配置,表單組件的配置Array-
realTimeSubmit表單是否實(shí)時(shí)提交,一般用于篩選表單booleanfalse

表單組件的配置

{
    type: 'input',
    dataKey: 'name',
    label: 'param',
    validate: ['required'],
    style: {}
}
屬性是否必傳說明類型默認(rèn)值
type表單組件的類型,其值可以為: input、select、textarea、form_array、container和一些自定義表單組件string-
dataKey指定表單組件值的key,可以為param.name.firstName形式string-
label表單組件的labelstring-
placeholder表單組件的placeholderstring-
validate表單組件的校驗(yàn)規(guī)則Array-
style表單組件的布局樣式string-
options當(dāng)表單組件為select時(shí),需要傳入的optionsArray-
render當(dāng)type為container時(shí),為自定義組件,render為渲染方法Function-
preventSubmit當(dāng)realTimeSubmit為true時(shí),控制當(dāng)前表單組件是否實(shí)時(shí)提交booleanfalse
children當(dāng)type為form_array時(shí),children表示子組件配置列表Array-
modifyDataFn當(dāng)type為自定義組件時(shí),且需要覆蓋render方法中的提交數(shù)據(jù)方法,可以使用modifyDataFn來重新自定義提交數(shù)據(jù)Function-

關(guān)鍵字段解釋

1. type

type是用來唯一表示表單組件類型的字段,其中JSON表單提供了三種默認(rèn)的表單組件:input、select、textarea,還有兩種復(fù)雜類型的表單組件:form_array、container。

form_array表單組件表示其數(shù)據(jù)結(jié)構(gòu)為Array,含有增加項(xiàng)刪除項(xiàng)的復(fù)合表單組件,該表單組件的配置里多一個(gè)children的字段,里面是每一項(xiàng)里面的表單組件配置的集合,其表單組件的效果如下圖所示:

4237662194-5bf23f88cdaad_articlex.png

container是用來自定義表單的接口,具體用法參考下面具體的介紹。

2. validate

validate是校驗(yàn)表單組件數(shù)據(jù)正確性的字段,其值為數(shù)組,里面的數(shù)組元素可以為String、object、RegExp、Function。

JSON表單采用的是async-validator異步處理校驗(yàn),在JSON表單內(nèi)部會(huì)將validate傳入的校驗(yàn)關(guān)鍵字解析為async-validator的rules。所以validate數(shù)組元素如果為object的話,其內(nèi)容就是async-validator的rules。

1. 數(shù)組元素為string,其值可以為:
    string,值必須為string
    number,值必須為數(shù)字 
    required,值不能為空
    boolean,值必須為布爾值
    integer,值必須為整數(shù)形
    float,值必須為浮點(diǎn)型
    email,值必須為郵箱類型
2. 數(shù)組元素為object,其值為rules:
    {type: 'enum', enum: ['1', '2'], message: '值不在確定范圍內(nèi)'}
3. 數(shù)組元素為RegExp, validate: [/^[a-zA-Z_{}0-9]+$/g]
4. 數(shù)組元素為Function, validate: [ (rules, value, callback) => {}]

3. style

用來確定表單組件在表單內(nèi)的布局樣式,比如想讓表單組件行內(nèi)顯示,且寬度為200,其style值如下:

{
    display: 'inline-block',
    width: 200
}

container表單組件

container表單組件是用來自定義表單組件的,它主要的作用有以下幾點(diǎn):

  1. 添加表單組件庫,例如Ant-Design

  2. 自定義表單組件,例如圖片上傳組件

  3. 用來構(gòu)建復(fù)雜的表單組件

  4. 處理控制邏輯和聯(lián)動(dòng)邏輯

使用栗子

import { Input, Select } from 'antd'
const Option = Select.Option
{
    type: 'container',
    dataKey: 'descr',
    style: {
        display: 'inline-block',
        width: 100,
        margin: '0 15px'
    },
    options: ['string', 'integer', 'float'],
    render: (curData, config, {changeFn, getFocus, loseFocus, error}) => {
        return <Select value={curData} 
            style={{width: '100%', height: 35}} 
            onMouseEnter={getFocus}
            onChange={(value) => changeFn(value, () => {
                loseFocus()
            })}>
            {
                config.options && config.options.map((item, idx) => <Option key={idx} value={item}>{item}</Option>)
            }
        </Select>
    }
},

container表單組件只是多一個(gè)render渲染方法,里面可以自定義表單組件的渲染內(nèi)容,render方法提供如下參數(shù):

1. curData: 當(dāng)前container組件的值,跟dataKey相關(guān)
2. config: 當(dāng)前container組件的配置
3:{changeFn, changeDataFn, getFocus, loseFocus, error, JSONForm}
changeFn, changDataFn是提交數(shù)據(jù)的方法,changeFn只能修改當(dāng)前組件dataKey的值,changeDataFn可以修改data中任意字段的值,changeFn(value, [callback]), changeFn(dataKey, value, [callback])
getFocus,loseFocus是自定義處理校驗(yàn)的字段,loseFocus是開始校驗(yàn),getFocus是去掉校驗(yàn)的報(bào)錯(cuò)信息
error是校驗(yàn)結(jié)果的報(bào)錯(cuò)信息
JSONForm是在container中使用JSON表單的組件配置用來生成新的表單組件,意思里container中依然可以嵌套表單組件。

使用antd的組件庫

JOSN表單只提供了input、select、textarea三種默認(rèn)的表單組件,遠(yuǎn)遠(yuǎn)不夠真實(shí)的項(xiàng)目中使用,所以我們可以將antd組件庫中的組件封裝到JSON表單中,這樣我們就可以再項(xiàng)目中很快的使用antd中的組件。

antd-components.js

import React from 'react'
import { Input } from 'antd'
export default [
    {
        type: 'antd-input',
        render: (curData, config, {changeFn, getFocus, loseFocus, error}) => {
            return <Input value={curData}  
                onFocus={getFocus}
                onBlur={loseFocus}
                placeholder={config.placeholder ? config.placeholder : ''}
                style={{borderColor: !!error ? '#f5222d' : ''}}
                onChange={event => changeFn(event.target.value)} />
        }
    }
]

我們在antd-components.js文件中聲明一個(gè)antd-input的自定義組件,然后在JSON表單中引入該自定義表單組件:

init.js

import Form from 'Form'
import components from './antd-components'
From.createCustomComp(components)
const config = {
    formKey: 'paramAddFromAntd',
    data: {
        name: '',
    },
    config: [
        {
            type: 'antd-input',
            dataKey: 'name',
            label: 'Param',
            placeholder: '請輸入param',
            validate: ['required', /^[a-zA-Z_{}0-9]+$/g]
        }
    ]
}
<From ref={ref => this.FormWrap = ref} config={config}></From>

使用container來引入antd組件庫,其原理就是通過container將antd組件封裝成'antd-input'自定義組件,然后使用它,這種方式不僅可以用來封裝組件庫,還可以用來共享一些共用表單組件,可以將常用的復(fù)雜表單組件封裝在一個(gè)共用文件里,然后在不同項(xiàng)目中引用,就可以跨項(xiàng)目共用表單組件。

在自定義組件中,如果需要自定義表單提交數(shù)據(jù)函數(shù),但是又不能重寫render方法以防覆蓋原先的render方法,所以可以使用modifyDataFn方法來覆蓋render中的提交數(shù)據(jù)部分。

modifyDataFn: ({changeFn, changeDataFn}, {parent, self}) => {
    let {parentData} = parent
    parentData = parentData.map(item => ({
        ...item,
        name: self.curData
    }))
    changeDataFn(parent.parentKey, parentData)
}

處理控制邏輯和聯(lián)動(dòng)邏輯

在JSON表單JSON配置中,有assistData的選填字段,該字段為JSON表單處理控制邏輯的額外數(shù)據(jù),例如在表單內(nèi)有一個(gè)刷新按鈕,其實(shí)現(xiàn)代碼如下:

{
    data: {},
    assistData: {
        refreshParam: false
    },
    config: [
        {
            type: 'container',
            dataKey: 'assistData.refreshParam',
            render: (curData, config, {changeFn, changeDataFn}) => {
                const handleClick = () => {
                    changeDataFn('assistData.refreshParam' ,true)
                    setTimeout(() => {
                        changeDataFn('assistData.refreshParam' ,false)
                    }, 1000 * 3)
                }
                return <React.Fragment>
                    {
                        config.index === config.parentData.length - 1 &&
                        <Popover placement="top" content="刷新param列表">
                            <Button shape="circle" loading={curData} onClick={handleClick}>{!curData && <Icon type="reload" />}</Button>
                        </Popover>
                    }
                </React.Fragment>
            }
        },
    ]
}

注意: 如果要使用assistData中的數(shù)據(jù),其dataKey必須以assistData開頭,且必須使用changeDataFn自定義提交assistData數(shù)據(jù)。

render方法內(nèi)嵌套組件配置

{
    type: 'container',
    dataKey: 'param',
    render: (curData, config, {changeFn, changeDataFn, JSONForm}) => {
        return <p>
            {
                JSONForm([
                    {
                        type: 'input',
                        dataKey: 'name',
                        placeholder: '請輸入param',
                        validate: ['required'],
                    }
                ])
            }
        </p>
    }

這樣就可以在container內(nèi)嵌套組件配置,實(shí)現(xiàn)更復(fù)雜的表單組件。

JSON表單提交數(shù)據(jù)

非實(shí)時(shí)表單提交

非實(shí)時(shí)表單提交數(shù)據(jù),就是在表單輸入完畢后,點(diǎn)擊提交按鈕統(tǒng)一提交所有的數(shù)據(jù),其提交的方式如下:

function handleClick() {
    this.FormRefs.getValue((valid, data) => {
        // valid 表示校驗(yàn)結(jié)果,false表示校驗(yàn)不通過
    })
}

實(shí)時(shí)表單提交

實(shí)時(shí)表單的提交首先需要注冊提交函數(shù):

componentDidMount(){
    this.FormRefs.registerSubmit((valid, data) => {
        console.log(valid, data)
    })
}

接著在配置里設(shè)置允許實(shí)時(shí)提交的字段:

{
    formKey: '',
    realTimeSubmit: true
}

如果需要在某些表單組件里自定義是否實(shí)時(shí)提交,需要在組件配置里設(shè)置阻止實(shí)時(shí)提交字段為true:

{
    dataKey: '',
    preventSubmit: true
}

JSON表單的應(yīng)用場景

表單分類

a. 按復(fù)雜度分類
1. 簡單表單:表單組件為input、select、textarea等常見的幾種,且表單組件之間邏輯獨(dú)立
2. 復(fù)雜表單:表單組件內(nèi)容和交互復(fù)雜且相互之間存在復(fù)雜的邏輯
其中復(fù)雜表單又可以分為:
1. 聯(lián)動(dòng)表單,上一個(gè)表單組件會(huì)影響接下來表單的值
2. 實(shí)時(shí)表單,表單組件的事件會(huì)觸發(fā)表單的實(shí)時(shí)提交,例如篩選表單
3. 富控制表單,表單內(nèi)部含有很多的控制邏輯

JSON表單最適合的應(yīng)用場景是簡單表單,它可以用極少的代碼,快速的構(gòu)建出表單來,對于復(fù)雜類型的表單,JSON表單需要使用container來構(gòu)建復(fù)雜的表單組件、處理復(fù)雜的控制邏輯,其代碼量優(yōu)勢雖然并不明顯,但是JSON表單可以使其代碼清晰,將表單組件和表單邏輯徹底解耦,便于抽離和維護(hù),便于共享常用組件,也帶來不少的好處。

到目前為止,JSON表單適合大部分的表單應(yīng)用場景。

JSON表單解決的問題

  1. 減少了表單代碼量,不需要重復(fù)的開發(fā)表單組件,只需要輸入組件配置即可

  2. 將表單組件和數(shù)據(jù)解耦,便于子功能的拆分和常用組件的共享

  3. 簡化了校驗(yàn)功能,只需要傳入validate字段即可

  4. 添加了自動(dòng)緩存功能

在我的項(xiàng)目,我嘗試了使用原始表單和JSON表單兩種方式來實(shí)現(xiàn)同一個(gè)表單頁,原始表單我編寫了600多行的代碼,而在JSON表單中,只有不到150行。

以上就是JSON生成Form表單的詳細(xì)解析(代碼實(shí)例)的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!


網(wǎng)站建設(shè)是一個(gè)廣義的術(shù)語,涵蓋了許多不同的技能和學(xué)科中所使用的生產(chǎn)和維護(hù)的網(wǎng)站。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統(tǒng)下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 久久久999免费视频| 人人爽人人爽av| 天堂а√在线中文在线| 女人高潮一级片| 国产乱女淫av麻豆国产| 亚洲成色www.777999| 人人干人人视频| 亚洲国产成人va在线观看麻豆| 91精品91久久久中77777老牛| av在线播放亚洲| 成人午夜精品久久久久久久蜜臀| 亚洲色成人www永久在线观看| 免费的av在线| www.成年人视频| 黄色国产一级视频| 熟女性饥渴一区二区三区| av观看免费在线| 一级在线免费视频| 波多野结衣网页| 黄色一级片av| 女人和拘做爰正片视频| 男女啪啪网站视频| 五月天综合婷婷| 人妻av中文系列| 999精彩视频| 久久综合亚洲精品| 国产淫片av片久久久久久| 色一情一区二区三区| 妞干网这里只有精品| 情侣黄网站免费看| 亚洲制服中文字幕| 免费av手机在线观看| 欧美成人福利在线观看| 大胆欧美熟妇xx| 欧美伦理片在线观看| 白白操在线视频| 亚洲激情在线观看视频| 国产一区二区片| 天天色天天综合网| 欧美成人一区二区在线观看| 污网站在线免费| 欧美在线观看www| 日韩欧美一级在线| 一级片视频免费观看| 国产精品videossex国产高清 | 午夜宅男在线视频| av网站大全免费| www.桃色.com| 嫩草av久久伊人妇女超级a| 日韩国产小视频| youjizz.com亚洲| 在线观看免费成人av| 成人免费在线小视频| 国产精品av免费观看| 99re6在线观看| 人人干人人视频| 热久久精品国产| 春日野结衣av| 国产精品国产亚洲精品看不卡| 激情五月五月婷婷| 日韩精品aaa| 亚洲免费av一区| 三上悠亚在线一区二区| 中文字幕无码不卡免费视频| 少妇无码av无码专区在线观看| 日韩欧美猛交xxxxx无码| 亚洲精品乱码久久久久久动漫| 中文字幕天天干| 国产福利在线免费| 四季av一区二区三区| 午夜精品中文字幕| 亚洲欧美视频二区| 日韩爱爱小视频| 一级黄色特级片| 2025韩国大尺度电影| 激情成人在线观看| 中国黄色录像片| 精品国偷自产一区二区三区| 精品人妻人人做人人爽| 精品久久久久久无码中文野结衣| 9191国产视频| 国产精品网站免费| 免费国产成人av| 亚洲男人天堂av在线| a级片一区二区| www黄色日本| 男人添女人下面免费视频| 色偷偷中文字幕| 日本香蕉视频在线观看| 久久婷婷五月综合色国产香蕉| 国产xxxxx视频| 青青草影院在线观看| 国产日本在线播放| 亚洲精品www.| www.亚洲成人网| 日日噜噜噜噜久久久精品毛片| 91在线第一页| 久久久999免费视频| 国产美女视频免费看| 男人添女荫道口女人有什么感觉| 鲁一鲁一鲁一鲁一澡| 日本中文字幕观看| www国产黄色| 亚洲精品天堂成人片av在线播放 | 日本久久精品一区二区| 国产对白在线播放| 国产午夜福利视频在线观看| 黄色片免费网址| 人妻有码中文字幕| 国产乱人伦精品一区二区三区| 国产v亚洲v天堂无码久久久| 免费在线精品视频| 亚洲a级黄色片| 国内自拍视频一区| 无码精品a∨在线观看中文| 午夜啪啪福利视频| 玖玖爱视频在线| 超碰网在线观看| 青青青在线视频播放| 91丝袜超薄交口足| xx欧美撒尿嘘撒尿xx| av天堂永久资源网| 亚洲不卡中文字幕无码| 国产成人免费高清视频| 不用播放器的免费av| 99蜜桃臀久久久欧美精品网站| 99在线免费视频观看| 国产人妻互换一区二区| 亚洲天堂av一区二区三区| 午夜激情在线观看视频| 欧美aⅴ在线观看| 国产精品无码一区二区在线| 日本一区二区三区四区五区六区| 婷婷激情综合五月天| 国产性生活一级片| 无套内谢丰满少妇中文字幕| 一级 黄 色 片一| 欧洲av无码放荡人妇网站| 欧美精品一区二区三区三州| 在线观看成人免费| 大陆极品少妇内射aaaaaa| 中文字幕55页| 日本a在线天堂| 亚洲精品久久久久久久蜜桃臀| 久久这里只有精品8| 免费看日本毛片| 国产精品无码专区av在线播放| 少妇人妻互换不带套| 色综合色综合色综合色综合| 在线视频一二区| 免费在线黄网站| 丰满人妻中伦妇伦精品app| 亚洲最大综合网| 天美一区二区三区| 成人在线播放网址| 爆乳熟妇一区二区三区霸乳| www午夜视频| 欧美性猛交内射兽交老熟妇| av无码久久久久久不卡网站| 国产成人亚洲精品无码h在线| 在线观看亚洲色图| 日韩一二区视频| 欧美 国产 小说 另类| 天堂av在线8| 久久久久久人妻一区二区三区| 欧美少妇性生活视频| 二级片在线观看| 国产免费成人在线| 9l视频自拍9l视频自拍| 你懂的av在线| a级网站在线观看| 精品久久久久av| 久操手机在线视频| 亚洲一级免费在线观看| 国产一二三在线视频| 91看片破解版| 欧美极品欧美精品欧美图片| 看一级黄色录像| 亚洲一区二区福利视频| 少妇高潮喷水久久久久久久久久| 欧洲美女亚洲激情| 国产福利一区视频| av日韩一区二区三区| 日韩视频在线观看视频| 天天爽天天爽夜夜爽| 青青艹视频在线| 国产玉足脚交久久欧美| 秋霞在线一区二区| 91小视频网站| 日韩av手机版| 亚洲 中文字幕 日韩 无码| 欧美爱爱视频免费看| 人妻无码一区二区三区四区| 欧美性受xxxxxx黑人xyx性爽| 青青青在线播放| 91国视频在线| 精品少妇在线视频| 久久久亚洲精品无码| 人妻少妇精品无码专区二区 | 亚洲欧美日本一区二区三区|