日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > vue >内容正文

vue

Vue 项目中各种痛点问题及方案(建议收藏)

發布時間:2023/12/20 vue 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Vue 项目中各种痛点问题及方案(建议收藏) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

點擊上方[全棧開發者社區]右上角[...][設為星標?]

作者:愣錘

https://juejin.im/post/6844903632815521799

最近要求使用vue進行前后端分離開發微信公眾號,不斷摸索踩坑之后,總結出如下幾點vue項目開發中常見的問題及解決辦法。

  • 列表進入詳情頁的傳參問題

  • 本地開發環境請求服務器接口跨域的問題

  • axios封裝和api接口的統一管理

  • UI庫的按需加載

  • 如何優雅的只在當前頁面中覆蓋ui庫中組件的樣式

  • 定時器問題

  • rem文件的導入問題

  • Vue-Awesome-Swiper基本能解決你所有的輪播需求

  • 打包后生成很大的.map文件的問題

  • fastClick?的300ms延遲解決方案

  • 組件中寫選項的順序

  • 路由懶加載(也叫延遲加載)

  • 開啟gzip壓縮代碼

  • 詳情頁返回列表頁緩存數據和瀏覽位置、其他頁面進入列表頁刷洗數據的實踐

  • css的scoped私有作用域和深度選擇器

  • hiper打開速度測試

  • vue數據的兩種獲取方式+骨架屏

  • 自定義組件(父子組件)的雙向數據綁定

  • 路由的拆分管理

  • mixins混入簡化常見操作

  • 打包之后文件、圖片、背景圖資源不存在或者路徑錯誤的問題

列表進入詳情頁的傳參問題

例如商品列表頁面前往商品詳情頁面,需要傳一個商品id;

<router-link?:to="{path:?'detail',?query:?{id:?1}}">前往detail頁面</router-link>復制代碼

c頁面的路徑為http://localhost:8080/#/detail?id=1,可以看到傳了一個參數id=1,并且就算刷新頁面id也還會存在。此時在c頁面可以通過id來獲取對應的詳情數據,獲取id的方式是this.$route.query.id

vue傳參方式有:query、params+動態路由傳參。

說下兩者的區別:

1.query通過path切換路由,params通過name切換路由

//?query通過path切換路由 <router-link?:to="{path:?'Detail',?query:?{?id:?1?}}">前往Detail頁面</router-link> //?params通過name切換路由 <router-link?:to="{name:?'Detail',?params:?{?id:?1?}}">前往Detail頁面</router-link>復制代碼

2.query通過this.$route.query來接收參數,params通過this.$route.params來接收參數。

//?query通過this.$route.query接收參數 created?()?{const?id?=?this.$route.query.id; }//?params通過this.$route.params來接收參數 created?()?{const?id?=?this.$route.params.id; }復制代碼

3.query傳參的url展現方式:/detail?id=1&user=123&identity=1&更多參數

params+動態路由的url方式:/detail/123

4.params動態路由傳參,一定要在路由中定義參數,然后在路由跳轉的時候必須要加上參數,否則就是空白頁面:

{??????path:?'/detail/:id',??????name:?'Detail',??????component:?Detail???? },復制代碼

注意,params傳參時,如果沒有在路由中定義參數,也是可以傳過去的,同時也能接收到,但是一旦刷新頁面,這個參數就不存在了。這對于需要依賴參數進行某些操作的行為是行不通的,因為你總不可能要求用戶不能刷新頁面吧。例如:

//?定義的路由中,只定義一個id參數 {path:?'detail/:id',name:?'Detail',components:?Detail }// template中的路由傳參, //?傳了一個id參數和一個token參數 //?id是在路由中已經定義的參數,而token沒有定義 <router-link?:to="{name:?'Detail',?params:?{?id:?1,?token:?'123456'?}}">前往Detail頁面</router-link>//?在詳情頁接收 created?()?{//?以下都可以正常獲取到//?但是頁面刷新后,id依然可以獲取,而token此時就不存在了const?id?=?this.$route.params.id;const?token?=?this.$route.params.token; }復制代碼

本地開發環境請求服務器接口跨域的問題

上面的這個報錯大家都不會陌生,報錯是說沒有訪問權限(跨域問題)。本地開發項目請求服務器接口的時候,因為客戶端的同源策略,導致了跨域的問題。

下面先演示一個沒有配置允許本地跨域的的情況:

可以看到,此時我們點擊獲取數據,瀏覽器提示我們跨域了。所以我們訪問不到數據。

那么接下來我們演示設置允許跨域后的數據獲取情況:

注意:配置好后一定要關閉原來的server,重新npm run dev啟動項目。不然無效。

我們在1出設置了允許本地跨域,在2處,要注意我們訪問接口時,寫的是/api,此處的/api指代的就是我們要請求的接口域名。如果我們不想每次接口都帶上/api,可以更改axios的默認配置axios.defaults.baseURL = '/api';這樣,我們請求接口就可以直接this.$axios.get('app.php?m=App&c=Index&a=index'),很簡單有木有。此時如果你在network中查看xhr請求,你會發現顯示的是localhost:8080/api的請求地址。這樣沒什么大驚小怪的,代理而已:

好了,最后附上proxyTable的代碼:

proxyTable:?{//?用‘/api’開頭,代理所有請求到目標服務器'/api':?{target:?'http://jsonplaceholder.typicode.com',?//?接口域名changeOrigin:?true,?//?是否啟用跨域pathRewrite:?{?//'^/api':?''}} }復制代碼

注意:配置好后一定要關閉原來的server,重新npm run dev啟動項目。不然無效。

axios封裝和api接口的統一管理

axios的封裝,主要是用來幫我們進行請求的攔截和響應的攔截。

在請求的攔截中我們可以攜帶userToken,post請求頭、qs對post提交數據的序列化等。

在響應的攔截中,我們可以進行根據狀態碼來進行錯誤的統一處理等等。

axios接口的統一管理,是做項目時必須的流程。這樣可以方便我們管理我們的接口,在接口更新時我們不必再返回到我們的業務代碼中去修改接口。

由于這里內容稍微多一些,放在另一篇文章,這里送上鏈接。

UI庫的按需加載:

為什么要使用按需加載的方式而不是一次性全部引入,原因就不多說了。這里以vant的按需加載為例,演示vue中ui庫怎樣進行按需加載:

  • 安裝:?cnpm i vant -S

  • 安裝babel-plugin-import插件使其按需加載:??cnpm i babel-plugin-import -D

  • 在 .babelrc文件中中添加插件配置 :

libraryDirectory?{?"plugins":?[?//?這里是原來的代碼部分//?…………//?這里是要我們配置的代碼["import",?{?"libraryName":?"vant",?"libraryDirectory":?"es",?"style":?true?}]?]? }復制代碼
  • 在main.js中按需加載你需要的插件:

//?按需引入vant組件 import?{???DatetimePicker,???Button,???List? }?from?'vant';復制代碼
  • 使用組件:

//?使用vant組件 Vue.use(DatetimePicker)??.use(Button)??.use(List);復制代碼
  • 最后在在頁面中使用:

<van-button?type="primary">按鈕</van-button>復制代碼

ps:出來vant庫外,像antiUi、elementUi等,很多ui庫都支持按需加載,可以去看文檔,上面都會有提到。基本都是通過安裝babel-plugin-import插件來支持按需加載的,使用方式與vant的如出一轍,可以去用一下。

如何優雅的只在當前頁面中覆蓋ui庫中組件的樣式

首先我們vue文件的樣式都是寫在<style lang="less" scoped></style>標簽中的,加scoped是為了使得樣式只在當前頁面有效。那么問題來了,看圖:

我們正常寫的所有樣式,都會被加上[data-v-23d425f8]這個屬性(如1所示),但是第三方組件內部的標簽并沒有編譯為附帶[data-v-23d425f8]這個屬性。所以,我們想修改組件的樣式,就沒轍了。怎么辦呢,有些小伙伴給第三方組件寫個class,然后在一個公共的css文件中或者在當前頁面再寫一個沒有socped屬性的style標簽,然后直接在里面修改第三方組件的樣式。這樣不失為一個方法,但是存在全局污染和命名沖突的問題。約定特定的命名方式,可以避免命名沖突。但是還是不夠優雅。

作為一名優()秀()的()前()端(),怎么能允許這種情況出現呢?好了,下面說下優雅的解決方式:

通過深度選擇器解決。例如修改上圖中組件里的van-ellipsis類的樣式,可以這樣做:

.van-tabs?/deep/?.van-ellipsis?{?color:?blue}; 復制代碼

編譯后的結果就是:

這樣就不會給van-ellipsis也添加[data-v-23d425f8]屬性了。至此你可以愉快的修改第三方組件的樣式了。

當然了這里的深度選擇器/deep/是因為我用的less語言,如果你沒有使用less/sass等,可以用>>>符號。

更多的關于深度選擇器的內容,在文章后面有介紹。

定時器問題:

我在a頁面寫一個定時,讓他每秒鐘打印一個1,然后跳轉到b頁面,此時可以看到,定時器依然在執行。這樣是非常消耗性能的。如下圖所示:

解決方法1:

首先我在data函數里面進行定義定時器名稱:

data()?{????????????return?{??????????????????????????????timer:?null??//?定時器名稱??????????}???????? },復制代碼

然后這樣使用定時器:

this.timer?=?(()?=>?{//?某些操作 },?1000)復制代碼

最后在beforeDestroy()生命周期內清除定時器:

beforeDestroy()?{clearInterval(this.timer);????????this.timer?=?null; }復制代碼

方案1有兩點不好的地方,引用尤大的話來說就是:

  • 它需要在這個組件實例中保存這個?timer,如果可以的話最好只有生命周期鉤子可以訪問到它。這并不算嚴重的問題,但是它可以被視為雜物。

  • 我們的建立代碼獨立于我們的清理代碼,這使得我們比較難于程序化的清理我們建立的所有東西。

解決方案2:

該方法是通過$once這個事件偵聽器器在定義完定時器之后的位置來清除定時器。以下是完整代碼:

const?timer?=?setInterval(()?=>{????????????????????//?某些定時器操作???????????????? },?500);???????????? //?通過$once來監聽定時器,在beforeDestroy鉤子可以被清除。 this.$once('hook:beforeDestroy',?()?=>?{????????????clearInterval(timer);???????????????????????????????????? })復制代碼

方案2要感謝@zzx18023在評論區提供出的解決方案。類似于其他需要在當前頁面使用,離開需要銷毀的組件(例如一些第三方庫的picker組件等等),都可以使用此方式來解決離開后以后在背后運行的問題。

綜合來說,我們更推薦使用**方案2,使得代碼可讀性更強,一目了然。**如果不清楚$once、$on、$off的使用,這里送上官網的地址教程,在程序化的事件偵聽器那里。

rem文件的導入問題:

我們在做手機端時,適配是必須要處理的一個問題。例如,我們處理適配的方案就是通過寫一個rem.js,原理很簡單,就是根據網頁尺寸計算html的font-size大小,基本上小伙伴們都知道,這里直接附上代碼,不多做介紹。

;(function(c,d){var?e=document.documentElement||document.body,a="orientationchange"?in?window?"orientationchange":"resize",b=function(){var?f=e.clientWidth;e.style.fontSize=(f>=750)?"100px":100*(f/750)+"px"};b();c.addEventListener(a,b,false)})(window);復制代碼

這里說下怎么引入的問題,很簡單。在main.js中,直接import './config/rem'導入即可。import的路徑根據你的文件路徑去填寫。

Vue-Awesome-Swiper基本能解決你所有的輪播需求

在我們使用的很多ui庫(vant、antiUi、elementUi等)中,都有輪播組件,對于普通的輪播效果足夠了。但是,某些時候,我們的輪播效果可能比較炫,這時候ui庫中的輪播可能就有些力不從心了。當然,如果技術和時間上都還可以的話,可以自己造個比較炫的輪子。

這里我說一下vue-awesome-swiper這個輪播組件,真的非常強大,基本可以滿足我們的輪播需求。swiper相信很多人都用過,很好用,也很方便我們二次開發,定制我們需要的輪播效果。vue-awesome-swiper組件實質上基于swiper的,或者說就是能在vue中跑的swiper。下面說下怎么使用:

  • 安裝?cnpm install vue-awesome-swiper --save

  • 在組件中使用的方法,全局使用意義不大:

//?引入組件 import?'swiper/dist/css/swiper.css'? import?{?swiper,?swiperSlide?}?from?'vue-awesome-swiper'//?在components中注冊組件 components:?{swiper,swiperSlide }//?template中使用輪播 //?ref是當前輪播 //?callback是回調 //?更多參數用法,請參考文檔 <swiper?:options="swiperOption"?ref="mySwiper"?@someSwiperEvent="callback">????????????<!--?slides?-->????????????<swiper-slide><div?class="item">1</div></swiper-slide>????????????<swiper-slide><div?class="item">2</div></swiper-slide>????????????<swiper-slide><div?class="item">3</div></swiper-slide>????????????<!--?Optional?controls?-->????????????<div?class="swiper-pagination"??slot="pagination"></div>????????????<div?class="swiper-button-prev"?slot="button-prev"></div>????????????<div?class="swiper-button-next"?slot="button-next"></div>????????????<div?class="swiper-scrollbar"???slot="scrollbar"></div> </swiper> 復制代碼 //?參數要寫在data中 data()?{????????????return?{?????//?swiper輪播的參數???????????swiperOption:?{?//?滾動條???????????????????scrollbar:?{????????????????????????el:?'.swiper-scrollbar',????????????????????},?//?上一張,下一張???????????????????navigation:?{????????????????????????nextEl:?'.swiper-button-next',????????????????????????prevEl:?'.swiper-button-prev',????????????????????},//?其他參數…………???}????????????}???????????????????? },復制代碼

swiper需要配置哪些功能需求,自己根據文檔進行增加或者刪減。附上文檔:npm文檔,swiper3.0/4.0文檔,更多用法,請參考文檔說明。

打包后生成很大的.map文件的問題

項目打包后,代碼都是經過壓縮加密的,如果運行時報錯,輸出的錯誤信息無法準確得知是哪里的代碼報錯。?而生成的.map后綴的文件,就可以像未加密的代碼一樣,準確的輸出是哪一行哪一列有錯可以通過設置來不生成該類文件。但是我們在生成環境是不需要.map文件的,所以可以在打包時不生成這些文件:

在config/index.js文件中,設置productionSourceMap: false,就可以不生成.map文件

fastClick的300ms延遲解決方案

開發移動端項目,點擊事件會有300ms延遲的問題。至于為什么會有這個問題,請自行百度即可。這里只說下常見的解決思路,不管vue項目還是jq項目,都可以使用fastClick解決。

安裝?fastClick:

cnpm?install?fastclick?-S復制代碼

在main.js中引入fastClick和初始化:

import?FastClick?from?'fastclick';?//?引入插件 FastClick.attach(document.body);?//?使用?fastclick復制代碼

組件中寫選項的順序

為什么選項要有統一的書寫順序呢?很簡單,就是要將選擇和認知成本最小化。

  • 副作用?(觸發組件外的影響)

    • el

    • 全局感知?(要求組件以外的知識)

      • name

      • parent

    • 組件類型?(更改組件的類型)

      • functional

    • 模板修改器?(改變模板的編譯方式)

      • delimiters

      • comments

    • 模板依賴?(模板內使用的資源)

      • components

      • directives

      • filters

    • 組合?(向選項里合并屬性)

      • extends

      • mixins

    • 接口?(組件的接口)

      • inheritAttrs

      • model

      • props/propsData

    • 本地狀態?(本地的響應式屬性)

      • data

      • computed

    • 事件?(通過響應式事件觸發的回調)

      • watch

      • 生命周期鉤子 (按照它們被調用的順序)-?beforeCreate-?created-?beforeMount-?mounted-?beforeUpdate-?updated-?activated-?deactivated-?beforeDestroy-?destroyed

    • 非響應式的屬性?(不依賴響應系統的實例屬性)

    • - `methods`
    • 渲染?(組件輸出的聲明式描述)

    • - `template`/`render` - `renderError`

      查看打包后各文件的體積,幫你快速定位大文件

      如果你是vue-cli初始化的項目,會默認安裝webpack-bundle-analyzer插件,該插件可以幫助我們查看項目的體積結構對比和項目中用到的所有依賴。也可以直觀看到各個模塊體積在整個項目中的占比。很霸道有木有~~

      npm?run?build?--report?//?直接運行,然后在瀏覽器打開http://127.0.0.1:8888/即可查看復制代碼

      記得運行的時候先把之前**npm run dev**開啟的本地關掉

      路由懶加載(也叫延遲加載)

      路由懶加載可以幫我們在進入首屏時不用加載過度的資源,從而減少首屏加載速度。

      路由文件中,

      非懶加載寫法:

      import?Index?from?'@/page/index/index'; export?default?new?Router({??routes:?[????{?path:?'/',?name:?'Index',?????component:?Index?}] })復制代碼

      路由懶加載寫法:

      export?default?new?Router({routes:?[????{?path:?'/',?name:?'Index',?component:?resolve?=>?require(['@/view/index/index'],?resolve)?}] })復制代碼

      開啟gzip壓縮代碼

      spa這種單頁應用,首屏由于一次性加載所有資源,所有首屏加載速度很慢。解決這個問題非常有效的手段之一就是前后端開啟gizp(其他還有緩存、路由懶加載等等)。gizp其實就是幫我們減少文件體積,能壓縮到30%左右,即100k的文件gizp后大約只有30k。

      vue-cli初始化的項目中,是默認有此配置的,只需要開啟即可。但是需要先安裝插件:

      // 2.0的版本設置不一樣,本文寫作時為v1版本。v2需配合vue-cli3cnpm i compression-webpack-plugin@1.1.11 復制代碼

      然后在config/index.js中開啟即可:

      build:?{//?其他代碼…………productionGzip:?true,?//?false不開啟gizp,true開啟//?其他代碼 }復制代碼

      現在打包的時候,除了會生成之前的文件,還是生成.gz結束的gzip過后的文件。具體實現就是如果客戶端支持gzip,那么后臺后返回gzip后的文件,如果不支持就返回正常沒有gzip的文件。

      **注意:這里前端進行的打包時的gzip,但是還需要后臺服務器的配置。配置是比較簡單的,配置幾行代碼就可以了,一般這個操作可以叫運維小哥哥小姐姐去搞一下,沒有運維的讓后臺去幫忙配置。

      詳情頁返回列表頁緩存數據和瀏覽位置、其他頁面進入列表頁刷新數據的實踐

      這樣一個場景:有三個頁面,首頁/或者搜索頁,商品分類頁面,商品詳情頁。我們希望從首頁進入分類頁面時,分類頁面要刷新數據,從分類進入詳情頁再返回到分類頁面時,我們不希望刷新,我們希望此時的分類頁面能夠緩存已加載的數據和自動保存用戶上次瀏覽的位置。之前在百度搜索的基本都是keep-alive處理的,但是總有那么一些不完善,所以自己在總結了之后進行了如下的實踐。

      解決這種場景需求我們可以通過vue提供的keepAlive屬性。這里直接送上另一篇處理這個問題的傳送門吧

      CSS的coped私有作用域和深度選擇器

      大家都知道當?<style>?標簽有?scoped?屬性時,它的 CSS 只作用于當前組件中的元素。那么他是怎么實現的呢,大家看一下編譯前后的代碼就明白了:

      編譯前:

      <style?scoped> .example?{color:?red; } </style>復制代碼

      編譯后:

      <style> .example[data-v-f3f3eg9]?{color:?red; }復制代碼

      看完你肯定就會明白了,其實是在你寫的組件的樣式,添加了一個屬性而已,這樣就實現了所謂的私有作用域。但是也會有弊端,考慮到瀏覽器渲染各種 CSS 選擇器的方式,當?p { color: red }?設置了作用域時 (即與特性選擇器組合使用時) 會慢很多倍。如果你使用 class 或者 id 取而代之,比如?.example { color: red },性能影響就會消除。所以,在你的樣式里,進來避免直接使用標簽,取而代之的你可以給標簽起個class名。

      如果你希望?scoped?樣式中的一個選擇器能夠作用得“更深”,例如影響子組件,你可以使用?>>>?操作符:

      <style?scoped>.parent?>>>?.child?{?/*?...?*/?} </style>復制代碼

      上述代碼將會編譯成:

      .parent[data-v-f3f3eg9]?.child?{?/*?...?*/? }復制代碼

      而對于less或者sass等預編譯,是不支持>>>操作符的,可以使用/deep/來替換>>>操作符,例如:.parent /deep/ .child { /* ... */ }

      后面會繼續更新:

      • axios封裝和api接口的統一管理(已更新,在上面的鏈接)

      • hiper打開速度測試

      • vue數據的兩種獲取方式+骨架屏

      • 自定義組件(父子組件)的雙向數據綁定

      • 路由的拆分管理

      • mixins混入簡化常見操作

      • 打包之后文件、圖片、背景圖資源不存在或者路徑錯誤的問題

      • vue插件的開發、發布到github、設置展示地址、發布npm包

      Hiper:一款令人愉悅的性能分析工具

      如上圖,是hiper工具的測試結果,從中我們可以看到DNS查詢耗時、TCP連接耗時、第一個Byte到達瀏覽器的用時、頁面下載耗時、DOM Ready之后又繼續下載資源的耗時、白屏時間、DOM Ready 耗時、頁面加載總耗時。

      在我們的編輯器終端中全局安裝:

      cnpm?install?hiper?-g復制代碼

      **使用:**終端輸入命令:hiper 測試的網址

      #?當我們省略協議頭時,默認會在url前添加`https://`#?最簡單的用法hiper?baidu.com#?如何url中含有任何參數,請使用雙引號括起來hiper?"baidu.com?a=1&b=2"#??加載指定頁面100次hiper?-n?100?"baidu.com?a=1&b=2"#??禁用緩存加載指定頁面100次hiper?-n?100?"baidu.com?a=1&b=2"?--no-cache#??禁JavaScript加載指定頁面100次hiper?-n?100?"baidu.com?a=1&b=2"?--no-javascript#??使用GUI形式加載指定頁面100次hiper?-n?100?"baidu.com?a=1&b=2"?-H?false#??使用指定useragent加載網頁100次hiper?-n?100?"baidu.com?a=1&b=2"?-u?"Mozilla/5.0?(Macintosh;?Intel?Mac?OS?X?10_13_4)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/66.0.3359.181?Safari/537.36"復制代碼

      這段用法示例,我直接拷貝的文檔說明,具體的可以看下文檔,這里送上鏈接。當我們項目打開速度慢時,這個工具可以幫助我們快速定位出到底在哪一步影響的頁面加載的速度。

      平時我們查看性能的方式,是在performance和network中看數據,記錄下幾個關鍵的性能指標,然后刷新幾次再看這些性能指標。有時候我們發現,由于樣本太少,受當前「網絡」、「CPU」、「內存」的繁忙程度的影響很重,有時優化后的項目反而比優化前更慢。

      如果有一個工具,一次性地請求N次網頁,然后把各個性能指標取出來求平均值,我們就能非常準確地知道這個優化是「正優化」還是「負優化」。

      hiper就是解決這個痛點的。

      vue獲取數據的兩種方式的實踐+簡單骨架屏實現

      在vue中獲取數據有兩種方式,引入尤大大的話就是:

      • 導航完成之后獲取:先完成導航,然后在接下來的組件生命周期鉤子中獲取數據。在數據獲取期間顯示“加載中”之類的指示。

      • 導航完成之前獲取:導航完成前,在路由進入的守衛中獲取數據,在數據獲取成功后執行導航。

      從技術角度講,兩種方式都不錯 —— 就看你想要的用戶體驗是哪種。那么我們來實踐一下這兩種獲取數據的方式,以及用戶體驗優化的一點思考。

      **一、首先是第一種:導航完成之后獲取,**這種方式是我們大部分都在使用的,(因為可能一開始我們只知道這種方式^V^)。使用這種方式時,我們會馬上導航和渲染組件,然后在組件的?created?鉤子中獲取數據。這讓我們有機會在數據獲取期間展示一個 loading 狀態,還可以在不同視圖間展示不同的 loading 狀態。獲取數據大家都會,這里說下用戶體驗的一些東西:

      • 在數據獲取到之前,頁面組件已經加載,但是數據沒有拿到并渲染,所以在此過程中,我們不能加載頁面內展示數據的那塊組件,而是要有一個loading的加載中的組件或者骨架屏。

      • 當頁面數據獲取失敗,可以理解為請求超時的時候,我們要展示的是斷網的組件。

      • 如果是列表頁,還要考慮到空數據的情況,即為空提示的組件。

      那么,我們的頁面是要有這基本的三個部分的,放代碼:

      <template><div?class="list"><!--加載中或者骨架屏--><div?v-if="loading"></div><!--請求失敗,即斷網的提示組件--><div?v-if="error"></div><!--頁面內容--><div?v-if="requestFinished"?class="content"><!--頁面內容--><div?v-if="!isEmpty"><!--例如有個列表,當然肯定還會有其他內容--><ul></ul></div><!--為空提示組件--><div?v-else>空空如也</div></div></div> </template>復制代碼

      這種獲取數據的情況下,我們進來默認的是展示loading或者骨架屏的內容,然后如果獲取數據失敗(即請求超時或者斷網),則加載error的那個組件,隱藏其他組件。如果數據請求成功,則加載內容的組件,隱藏其他組件。如果是列表頁,可能在內容組件中還會有列表和為空提示兩塊內容,所以這時候也還要根據獲取的數據來判斷是加載內容還是加載為空提示。

      二、第二種方式:導航完成之前獲取

      這種方式是在頁面的beforeRouteEnter鉤子中請求數據,只有在數據獲取成功之后才會跳轉導航頁面。

      beforeRouteEnter?(to,?from,?next)?{????????api.article.articleDetail(to.query.id).then(res=>?{????????????next(vm?=>?{????????????????vm.info?=?res.data;????????????????vm.loadFinish?=?true????????????})????????})???? },復制代碼

      1. 大家都知道鉤子中beforeRouteEnter鉤子中this還不能使用,所以要想進行賦值操作或者調用方法,我們只能通過在next()方法的回調函數中處理,這個回調函數的第一個參數就代表了this,他會在組件初始化成功后進行操作。

      2. 我想,很多時候我們的api或者axios方法都是掛載到vue的原型上的,由于這里使用不了this,所以只能在頁面組件內引入api或者我們的axios。

      3. 賦值操作也可以寫在method方法中,但是調用這個賦值方法還是vm.yourFunction()的方式。

      4. 為空提示、斷網處理等都和第一種方式一樣,但是,由于是先獲取到數據之后再跳轉加載組件的,所以我們不需要在預期的頁面內展示骨架屏或者loading組件。可以,我們需要在當前頁面進入之前,即在上一個頁面的時候有一個加載的提示,比如頁面頂部的進度條。這樣用戶體驗就比較友好了,而不至于因為請求的s速度慢一些導致半天沒反應而用戶又不知道的結果。全局的頁面頂部進度條,可以在main.js中通過router.beforeEach(to, from, next) {}來設置,當頁面路由變化時,顯示頁面頂部的進度條,進入新路由后隱藏掉進度條。

      關于怎么添加進度條,因為在另一篇文章已經寫了,這里直接送上鏈接吧,就不再重復浪費地方了。操作也比較簡單,可自行查閱。

      其實說到了這里,那么骨架屏的事情也就順帶已經解決了,一般頁面骨架屏也就是一張頁面骨架的圖片,但是要注意這張圖片要盡可能的小。

      自定義組件(父子組件)的雙向數據綁定

      說到父子組件的通信,大家一定都不陌生了:父組件通過props向子組件傳值,子組件通過emit觸發父組件自定義事件。但是這里要說的是父子組件使用v-model實現的通信。相信大家在使用別人的組件庫的時候,經常是通過v-model來控制一個組件顯示隱藏的效果等,例如彈窗。下面就一步一步解開v-model的神秘面紗。抓~~穩~~嘍~~,老司機彎道要踩油門了~~~

      提到v-model首先想到的就是我們對于表單用戶數據的雙向數據綁定,操作起來很簡潔很粗暴,例如:

      <input?type="text"?v-model="msg">data?()?{????????????return?{????????????????msg:?''????????????}???????? }復制代碼

      其實v-model是個語法糖,上面這一段代碼和下面這一段代碼是一樣的效果:

      <input?type="text"?:value="msg"?@input="msg?=?$event.target.value"> data?()?{return?{msg:?''?}???????? },復制代碼

      由此可以看出,v-model="msg"實則是?:value="msg" @input="msg = $event.target.value"的語法糖。這里其實就是監聽了表單的input事件,然后修改:value對應的值。除了在輸入表單上面可以使用v-model外,在組件上也是可以使用的,這點官網有提到,但是介紹的不是很詳細,導致剛接觸的小伙伴會有一種云里霧里不知所云的感覺。既然了解了v-model語法糖本質的用法,那么我們就可以這樣實現父子組件的雙向數據綁定:

      以上原理實現方法,寫法1:

      父組件用法:

      <empty?v-model="msg"></empty>復制代碼

      子組件寫法:

      //?點擊該按鈕觸發父子組件的數據同步 <div?class="share-btn"?@click="confirm">確定</div>//?接收父組件傳遞的value值 //?注意,這種實現方法,這里只能使用value屬性名 props:?{????????????value:?{????????????????type:?Boolean,????????????????default:?false????????????}???????? }, methods:?{????????????confirm?()?{????????????????//?雙向數據綁定父組件:value對應的值?//?通過$emit觸發父組件input事件,第二個參數為傳遞給父組件的值,這里傳遞了一個false值?//?可以理解為最上面展示的@input="msg?=?$event.target.value"這個事件//?即觸發父組件的input事件,并將傳遞的值‘false’賦值給msg?????????????this.$emit('input',?false)????????????}???????? }復制代碼

      這種方式實現了父子組件見v-model雙向數據綁定的操作,例如你可以試一下實現一個全局彈窗組件的操作,通過v-model控制彈窗的顯示隱藏,因為你要在頁面內進行某些操作將他顯示出來,控制其隱藏的代碼是寫在組件里面的,當組件隱藏了對應的也要父組件對應的值改變。

      以上這種方式實現的父子組件的v-model通信,雖可行,但限制了我們必須popos接收的屬性名為value和emit觸發的必須為input,這樣就容易有沖突,特別是在表單里面。所以,為了更優雅的使用v-model通信而解決沖突的問題,我們可以通過在子組件中使用**model**選項,下面演示寫法2:

      父組件寫法:

      <empty?v-model="msg"></empty>復制代碼

      子組件寫法:

      <div?class="share-btn"?@click="confirm">確定</div>//?model選項用來避免沖突 //?prop屬性用來指定props屬性中的哪個值用來接收父組件v-model傳遞的值 //?例如這里用props中的show來接收父組件傳遞的v-model值 // event:為了方便理解,可以簡單理解為父組件@input的別名,從而避免沖突 // event的值對應了你emit時要提交的事件名,你可以叫aa,也可以叫bb,但是要命名要有意義哦!!! model:?{????????????prop:?'show',????????????event:?'changed'???????? }, props:?{//?由于model選項中的prop屬性指定了,所以show接收的是父組件v-model傳遞的值????????????show:?{????????????????type:?Boolean,????????????????default:?false????????????}???????? },???????? methods:?{????????????confirm?()?{????????????????//?雙向數據綁定父組件傳遞的值//?第一個參數,對應model選項的event的值,你可以叫aa,bbb,ccc,起名隨你?this.$emit('changed',?false)????????????}???????? }復制代碼

      這種實現父子組件見v-model綁定值的方法,在我們開發中其實是很常用的,特別是你要封裝公共組件的時候。

      最后,實現雙向數據綁定的方式其實還有**.sync**,這個屬性一開始是有的,后來由于被認為或破壞單向數據流被刪除了,但最后證明他還是有存在意義的,所以在2.3版本又加回來了。

      例如:父組件:

      <empty?:oneprop.sync="msg"></empty>data?()?{return?{msg:?''} }復制代碼

      子組件:

      <div?class="share-btn"?@click="changeMsg">改變msg值</div>props:?{????????????oneprop:?{????????????????type:?String,????????????????default:?'hello?world'}???????? },???????? methods:?{????????????changeMsg?()?{????????????????//?雙向數據流this.$emit('update:msg',?'helow?world')???????????}???????? }????????復制代碼

      這樣,便可以在子組件更新父組件的數據。由于v-model只使用一次,所以當需要雙向綁定的值有多個的時候,.sync還是有一定的使用場景的。.sync是下面這種寫法的語法糖,旨在簡化我們的操作:

      <empty:msg="message"@update:msg="message?=?$event" ></empty>復制代碼

      掌握了組件的v-model寫法,在封裝一些公共組件的時候就又輕松一些了吧。

      這里再提一下:

      • vm.$emit(event ,[...args])這個api,其主要作用就是用來觸發當前實例上的事件。附加參數都會傳給監聽器回調。子組件也屬于當前實例。第一個參數:要觸發的事件名稱。后續的參數可選:即作為參數傳遞給要觸發的事件。文檔

      • 監聽當前實例上的自定義事件,事件可以有$emit觸發,也能通過hook監聽到鉤子函數,

      vm.$on( event, callback ):一直監聽;文檔

      vm.$once( event, callback ):監聽一次;文檔

      vm.$off( [event, callback] ):移除監聽;文檔

      監聽$emit觸發的自定義事件,上面已經有過用法了,監聽鉤子函數,在上面的定時器那塊也有演示到。監聽鉤子函數的場景使用的不多,但是還是要知道的。

      • vm.$attrs:可以獲取到父組件傳遞的除class和style外的所有自定義屬性。

      • vm.$listeners:可以獲取到父組件傳遞的所有自定義事件

      例如:父組件:

      <empty:msg="message":title="articleTitle"@confirm="func1"@cancel="func2" ></empty>復制代碼

      就可以在子組件中獲取父組件傳遞的屬性和事件,而不用在props中定義。子組件簡單演示如下:

      created()?{????????????const?msg?=?this.$attrs.msg;?//?獲取父組件傳遞的msgthis.$listeners.confirm?&&?this.$listeners.confirm();?//若組件傳遞事件confirm則執行 },復制代碼

      這在我們寫一些高級組件時候,會有用到的。

      路由拆分管理

      這里說的路由拆分指的是將路由的文件,按照模塊拆分,這樣方便路由的管理,更主要的是方便多人開發。具體要不要拆分,那就要視你的項目情況來定了,如果項目較小的話,也就一二十個路由,那么是拆分是非常沒必要的。但倘若你開發一些功能點較多的商城項目,路由可以會有一百甚至幾百個,那么此時將路由文件進行拆分是很有必要的。不然,你看著index.js文件中一大長串串串串串串的路由,也是很糟糕的。

      首先我們在router文件夾中創建一個index.js作為路由的入口文件,然后新建一個modules文件夾,里面存放各個模塊的路由文件。例如這里儲存了一個vote.js投票模塊的路由文件和一個公共模塊的路由文件。下面直接上index.js吧,而后在簡單介紹:

      import?Vue?from?'vue' import?Router?from?'vue-router'//?公共頁面的路由文件 import?PUBLIC?from?'./modules/public'? //?投票模塊的路由文件 import?VOTE?from?'./modules/vote'?Vue.use(Router)//?定義路由 const?router?=?new?Router({??mode:?'history',??routes:?[????...PUBLIC,????...VOTE,??] })//?路由變化時 router.beforeEach((to,?from,?next)?=>?{????if?(document.title?!==?to.meta.title)?{????????document.title?=?to.meta.title;????}????next() })//?導出 export?default?router復制代碼

      首先引入vue和router最后導出,這就不多說了,基本的操作。

      這里把router.beforeEach的操作寫了router的index.js文件中,有些人可能會寫在main.js中,這也沒有錯,只不過,個人而言,既然是路由的操作,還是放在路由文件中管理更好些。這里就順便演示了,如何在頁面切換時,自動修改頁面標題的操作。

      而后引入你根據路由模塊劃分的各個js文件,然后在實例化路由的時候,在routes數組中,將導入的各個文件通過結構賦值的方法取出來。最終的結果和正常的寫法是一樣的。

      然后看下我們導入的vote.js吧:

      /**?*?投票模塊的router列表??*/export?default?[????//?投票模塊首頁????{????????path:?'/vote/index',????????name:?'VoteIndex',????????component:?resolve?=>?require(['@/view/vote/index'],?resolve),????????meta:?{????????????title:?'投票'????????}????},????//?詳情頁????{????????path:?'/vote/detail',????????name:?'VoteDetail',????????component:?resolve?=>?require(['@/view/vote/detail'],?resolve),meta:?{????????????title:?'投票詳情'????????}???? }]?復制代碼

      這里就是將投票模塊的路由放在一個數組中導出去。整個路由拆分的操作,不是vue的知識,就是一個es6導入導出和結構的語法。具體要不要拆分,還是因項目和環境而異吧。

      這里的路由用到了懶加載路由的方式,如果不清楚,文字上面有介紹到。

      還有這里的meta元字段中,定義了一個title信息,用來存儲當前頁面的頁面標題,即document.title。

      mixins混入簡化常見操作

      我們在開發中經常會遇到金錢保留兩位小數,時間戳轉換等操作。每次我們會寫成一個公共函數,然后在頁面里面的filters進行過濾。這種方法每次,但是感覺每次需要用到,都要寫一遍在filters,也是比較煩呢!!!但是,我們猿類的極致追究就是懶呀,那這怎么能行~~~

      兄弟們,抄家伙!上mixins!!!

      import?{?u_fixed?}?from?'./tool'const?mixins?=?{????filters:?{????????//?保留兩位小數????????mixin_fixed2?(val)?{????????????return?u_fixed(val)????????},//?數字轉漢字,16000?=>?1.60萬????????mixin_num2chinese?(val)?{????????????return?val?>?9999???u_fixed(val/10000)?+?'萬'?:?val;????????}???? }} export?default?mixins復制代碼

      新建一個mixins.js,把我們需要混入的內容都寫在里面,例如這里混入了filters,把常用的幾個操作寫在了里面,大家可以自行擴展。

      這樣的話,在我們需要的頁面import這個js,然后聲明一下混入就好,而后就可以像正常的方式去使用就好了。

      例如,我現在可以直接在頁面內使用我們的過濾操作{{1000 | mixin_fixed2}}

      打包之后文件、圖片、背景圖資源不存在或者路徑錯誤的問題

      先看下項目的config文件夾下的index.js文件,這個配置選項就好使我們打包后的資源公共路徑,默認的值為‘/’,即根路徑,所以打包后的資源路徑為根目錄下的static。由此問題來了,如果你打包后的資源沒有放在服務器的根目錄,而是在根目錄下的mobile等文件夾的話,那么打包后的路徑和你代碼中的路徑就會有沖突了,導致資源找不到。

      所以,為了解決這個問題,你可以在打包的時候把上面這個路徑由‘/’的根目錄,改為‘./’的相對路徑。

      這樣的的話,打包后的圖片啊js等路徑就是‘./static/img/asc.jpg’這樣的相對路徑,這就不管你放在哪里,都不會有錯了。但是,凡是都有但是~~~~~這里一切正常,但是背景圖的路徑還是不對。因為此時的相對就變成了static/css/文件夾下的static/img/xx.jpg,但是實際上static/css/文件夾下沒有static/img/xx.jpg,即static/css/static/img/xx.jpg是不存在的。此時相對于的當前的css文件的路徑。所以為了解決這個問題,要把我們css中的背景圖的加個公共路徑‘../../’,即讓他往上返回兩級到和index.html文件同級的位置,那么此時的相對路徑static/img/xx.jpg就能找到對應的資源了。那么怎么修改背景圖的這個公共路徑呢,因為背景圖是通過loader解析的,所以自然在loader的配置中修改,打開build文件夾下的utils文件,找到exports.cssLoaders的函數,在函數中找到對應下面這些配置:

      找到這個位置,添加一上配置,就是上圖紅框內的代碼,就可以把它的公共路徑修改為往上返回兩級。這樣再打包看下,就ok了!

      最后再鄭重說一點,如果你的路由模式是history的,那么打包放在服務器,必須要后臺服務器的配合,具體的可以看官方文檔,這點很重要。不然你會發現白屏啊等各種莫名其妙的問題。牢記!!!

      覺得本文對你有幫助?請分享給更多人關注「全棧開發者社區」加星標,提升全棧技能 本公眾號會不定期給大家發福利,包括送書、學習資源等,敬請期待吧! 如果感覺推送內容不錯,不妨右下角點個在看轉發朋友圈或收藏,感謝支持。 好文章,留言、點贊、在看和分享一條龍吧??

    總結

    以上是生活随笔為你收集整理的Vue 项目中各种痛点问题及方案(建议收藏)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    天天草天天操 | 欧美国产不卡 | 最近中文字幕完整高清 | 天天操狠狠操 | 91精品在线视频观看 | 欧美激情精品 | 国产 日韩 欧美 自拍 | av免费黄色 | 尤物九九久久国产精品的分类 | 福利视频在线看 | 国产精品久久久久永久免费观看 | 午夜999| www.久久久com | 久久久久国产精品视频 | 亚洲日本一区二区在线 | 婷婷久月| 天天视频色版 | 亚洲精品观看 | 久久综合久久八八 | 日韩欧美综合 | 中文亚洲欧美日韩 | 久久久久久亚洲精品 | 高清不卡毛片 | 永久av免费在线观看 | 免费观看一级成人毛片 | 91精彩在线视频 | 九九交易行官网 | 日本夜夜草视频网站 | av专区在线 | 伊人伊成久久人综合网站 | 99久久激情 | 天天摸日日摸人人看 | 国产专区视频 | 波多野结衣在线视频一区 | 日韩成人精品一区二区 | 视频在线日韩 | 久草在线视频中文 | 99视频免费播放 | 亚洲天堂网在线视频观看 | 最新成人在线 | 精品999在线观看 | 国产一级淫片免费看 | 麻豆久久久 | 九九热免费观看 | 久久99亚洲精品 | 亚洲天堂网视频 | 天天鲁一鲁摸一摸爽一爽 | 国产精品乱码在线 | 99视频国产精品 | 成人免费网站视频 | 久久调教视频 | 亚州av成人 | 欧美精品乱码99久久影院 | 在线看国产视频 | 天天操天天干天天爱 | 久久久久久久久久免费 | 高清精品在线 | 久久人人97超碰国产公开结果 | av黄色国产 | 在线免费性生活片 | 日韩中文字幕一区 | 国产精品日韩在线 | 狠狠躁日日躁狂躁夜夜躁 | 日韩久久片 | 欧美性成人 | 亚洲天堂网在线视频 | 日韩激情视频在线 | 99视频免费看 | 久久国产美女视频 | 黄av资源| 免费a v在线 | 国产黄视频在线观看 | 亚洲爱爱视频 | 久久在线电影 | 国产在线精品一区二区三区 | 久久久久久久久久久久国产精品 | av在线com| 精品国产一二三四区 | 狠狠搞,com | 91高清不卡 | 人人模人人爽 | 亚洲欧洲精品久久 | 国产精品永久免费在线 | 在线观看免费黄视频 | 福利一区在线 | 欧美精品久久久久久久久久丰满 | 久久999精品| 国产69久久久欧美一级 | 一区二区三区在线不卡 | 伊人中文在线 | 中文字幕在线免费播放 | 欧美性黑人 | 日韩精品一区二区三区丰满 | 激情五月婷婷激情 | 久久综合福利 | 亚洲黄色在线观看 | 在线播放精品一区二区三区 | 中文字幕中文字幕在线中文字幕三区 | 国产成人一区二区三区久久精品 | 日本在线观看一区二区三区 | 四虎欧美 | 久久视频精品在线 | 日韩精品一区二区三区中文字幕 | 99精品国产高清在线观看 | 免费午夜av | 麻豆视频免费在线播放 | 丁香网婷婷 | 香蕉网在线观看 | 免费激情网 | 在线你懂| 国产麻豆成人传媒免费观看 | 中文字幕首页 | 日韩美在线| 成年人在线免费看视频 | 又紧又大又爽精品一区二区 | 免费一级片久久 | 日韩精品久久中文字幕 | 亚洲欧美日韩一级 | 在线 你懂 | 一区二区三区中文字幕在线观看 | 亚洲视频中文 | 日韩精品视频免费专区在线播放 | 一区二区视频网站 | 日韩欧美精品在线 | 亚洲免费在线看 | 天天艹天天操 | 日韩av电影免费观看 | 免费成人黄色片 | 福利一区视频 | 93久久精品日日躁夜夜躁欧美 | 啪啪免费试看 | 久久精品国产99国产 | 亚洲最大av在线播放 | 国产精品久久久亚洲 | 婷婷免费在线视频 | 亚洲精品视频一二三 | 久久黄色成人 | 黄色电影网站在线观看 | 国产视频一区二区在线观看 | 免费成人在线观看视频 | 在线观看国产91 | 伊人中文字幕在线 | 亚洲第一成网站 | 国产麻豆电影在线观看 | 日韩精品视 | .国产精品成人自产拍在线观看6 | 国产成人精品午夜在线播放 | 日本精品在线视频 | 香蕉免费在线 | 中文字幕在线免费看 | 国产精品99久久久久久小说 | 免费精品视频在线观看 | 午夜精品久久久久久久99水蜜桃 | 亚洲精品永久免费视频 | 99视频久 | 国产中文字幕在线看 | 国产精品无av码在线观看 | 国产国语在线 | 中文字幕在线观看1 | 激情在线网址 | 人人干人人草 | 色视频网址 | 亚洲黄色片 | 欧美精品在线观看免费 | www免费网站在线观看 | 99国产精品久久久久久久久久 | 国产精品女同一区二区三区久久夜 | 日韩久久久久 | 精品视频在线看 | 天天操,夜夜操 | 婷婷午夜激情 | 久久成人一区 | 国色天香永久免费 | 日韩在线观看av | 91麻豆精品国产91久久久更新时间 | 91亚洲精品久久久蜜桃 | 久久久高清视频 | 2021国产在线视频 | 国产精品美女久久久久久 | 国产91av视频在线观看 | 亚洲男男gaygayxxxgv | 在线草 | 国产三级国产精品国产专区50 | 日本激情动作片免费看 | 久久尤物电影视频在线观看 | 成人午夜片av在线看 | 麻豆久久久 | 国产免费人成xvideos视频 | 国产aaa毛片 | 久久狠狠亚洲综合 | 亚洲精品资源在线 | 国产高清精品在线观看 | 中文字幕免费播放 | av线上看 | 久久爱992xxoo| 精品久久一区二区 | 日韩网站视频 | 欧美一级淫片videoshd | 精品国产一区二区三区四区在线观看 | 日韩视频中文字幕在线观看 | 国产精品xxxx18a99 | 久久人人添人人爽添人人88v | 91.麻豆视频 | 国内精品久久久久久久久 | 亚州精品在线视频 | 亚洲精品在线视频网站 | 天天久久综合 | 在线看的毛片 | 亚洲天堂网在线视频 | 午夜精品一区二区三区免费 | 亚洲视频每日更新 | 午夜91在线| 五月婷婷深开心 | 日韩av在线免费播放 | 91精品在线麻豆 | 日本 在线 视频 中文 有码 | av7777777| 在线成人免费电影 | 91在线看视频免费 | 成人教育av| 精品国产一区二区三区男人吃奶 | 91看片淫黄大片一级在线观看 | 亚洲国产精品女人久久久 | 欧美-第1页-屁屁影院 | 久久99久久精品国产 | 91av片 | 91精品蜜桃 | 国产精品99页| 黄色一级免费网站 | 中文av字幕在线观看 | 欧美综合在线观看 | 日本韩国中文字幕 | 久久精品国产精品亚洲 | 国产一级黄色片免费看 | 超碰在线97国产 | 香蕉视频免费在线播放 | 国产美女免费 | avhd高清在线谜片 | 亚洲欧美成人网 | 国产黄色精品在线 | 999久久久欧美日韩黑人 | 日韩精品一区二区在线视频 | 亚洲专区中文字幕 | 欧美尹人 | 欧美一级特黄高清视频 | 国产精品入口传媒 | 国产一区二区在线免费观看 | 欧美成人精品xxx | 亚洲精品人人 | 精品国产乱码一区二区三区在线 | av中文在线播放 | 国产人成一区二区三区影院 | 欧美日韩高清一区二区三区 | 91精品久久久久久久99蜜桃 | 久久免费看 | 午夜日b视频 | 欧美激情综合五月色丁香小说 | 91免费观看网站 | 最新超碰在线 | 亚色视频在线观看 | 亚洲国产精品推荐 | 国产高清成人在线 | 亚洲精品在线观看的 | 超碰97中文 | 手机在线欧美 | 91九色在线观看 | 久久美女精品 | 美女国内精品自产拍在线播放 | 亚洲成成品网站 | 亚洲精品一区二区精华 | 91av视屏 | 91视频国产免费 | 成人av动漫在线 | 国产高清黄色 | 国产精品99久久久久久久久久久久 | 天天操夜夜干 | 免费看搞黄视频网站 | 久久国语露脸国产精品电影 | 日韩专区在线观看 | 四虎国产免费 | 免费看日韩片 | 亚洲色图激情文学 | 五月婷婷毛片 | 成人a视频片观看免费 | av高清免费在线 | 色爱成人网 | 久久久久久久久久久影视 | 亚洲精品在线播放视频 | 国产精品自产拍在线观看中文 | 久久久91精品国产一区二区三区 | 精品久久久久国产 | 亚洲九九影院 | 91日韩在线专区 | 成人毛片在线观看视频 | 亚洲国产精品电影 | 91精品国产成人www | 亚洲精品网站在线 | av在线影片| 五月婷婷激情综合网 | 成人黄色毛片 | 久久久人 | 天天爽人人爽夜夜爽 | 日韩免费高清 | 丁香六月婷婷开心婷婷网 | 久久69精品 | 婷婷激情久久 | 国产精品一区二区在线免费观看 | 五月婷婷激情六月 | 国产高清不卡一区二区三区 | 成人中文字幕+乱码+中文字幕 | 久久手机精品视频 | 成年人在线免费看视频 | 久久免费看毛片 | www视频在线免费观看 | 成人在线一区二区三区 | 午夜久久福利影院 | 久草免费在线 | 精品视频一区在线 | 国产一区二区网址 | 人人艹人人 | 在线免费观看黄色大片 | 四虎国产永久在线精品 | 超碰免费成人 | 日韩高清在线看 | 高清日韩一区二区 | a色视频 | 伊人色**天天综合婷婷 | 丝袜制服综合网 | 91桃色免费视频 | 久久精品视频日本 | 国产精品久久久久高潮 | 亚洲国产欧美一区二区三区丁香婷 | 午夜在线资源 | 久久99国产综合精品免费 | 日韩天天操 | 色网站国产精品 | 日本中文字幕在线一区 | 国产69精品久久久久99尤 | 天堂资源在线观看视频 | 91精品国产自产在线观看 | 国产污视频在线观看 | 九色精品 | 日韩精品一区二区三区视频播放 | 五月天国产 | 国产免费嫩草影院 | 在线性视频日韩欧美 | 91精品啪在线观看国产线免费 | 麻花天美星空视频 | 中文字幕在线观看一区二区 | 日韩中文字幕免费在线观看 | 九色精品免费永久在线 | 亚洲三级网 | 97国产精品免费 | 久久免费的精品国产v∧ | 欧美黑人性爽 | 91黄色在线视频 | 97香蕉久久超级碰碰高清版 | 欧美作爱视频 | 久久综合偷偷噜噜噜色 | 日韩中文字幕免费视频 | 欧美大码xxxx | 在线天堂中文www视软件 | 精品免费一区 | 日韩www在线| 色综合久久久久久中文网 | 亚洲综合在线一区二区三区 | 欧美一级在线观看视频 | 97人人精品| 日韩免费在线观看 | 99人久久精品视频最新地址 | 亚洲国产成人精品电影在线观看 | av一级片网站 | 伊人精品在线 | 天天插夜夜操 | 国产专区视频在线观看 | 97视频免费 | 搡bbbb搡bbb视频| 97精品在线 | 伊人亚洲综合网 | 国产精品永久在线观看 | 奇米777777 | 四虎影视久久久 | 97视频人人澡人人爽 | 69xx视频| 在线天堂日本 | av888av.com| 草免费视频 | 欧美一区二区三区不卡 | 婷婷综合亚洲 | 欧洲高潮三级做爰 | 亚洲国产精品传媒在线观看 | 免费毛片一区二区三区久久久 | 天天插天天色 | 天堂av在线网 | 国产韩国日本高清视频 | 国产九色视频在线观看 | 欧美另类高潮 | 日本午夜在线亚洲.国产 | 99电影 | 91丨九色丨丝袜 | 人人干狠狠干 | 99精品一区二区三区 | 麻豆国产精品永久免费视频 | 激情黄色一级片 | 天天操夜夜操天天射 | 五月天色网站 | 国产丝袜在线 | 精品一区二区免费在线观看 | 色五月色开心色婷婷色丁香 | 91亚洲精 | 亚洲免费专区 | 日韩理论在线观看 | 中文字幕a∨在线乱码免费看 | 国产精品免费视频久久久 | 亚洲精品视频免费在线观看 | 色天天综合网 | 中文永久字幕 | 操操操人人人 | 免费看精品久久片 | 91麻豆精品| 日韩三级.com | 色综合中文字幕 | 日韩欧美在线不卡 | 久久国产精品久久久 | 国产成人性色生活片 | 狠狠色噜噜狠狠狠合久 | 国产精品 中文在线 | 91免费国产在线观看 | 天天射天天射天天 | 三级av网站 | 国产不卡一二三区 | 天天玩夜夜操 | 亚洲天天在线 | 美女在线免费视频 | 色婷婷啪啪免费在线电影观看 | 少妇bbr搡bbb搡bbb | 国产一区二区在线免费播放 | 丁香婷婷自拍 | 亚洲激情一区二区三区 | 在线播放视频一区 | 亚洲人成免费网站 | 中文字幕.av.在线 | 久久成人在线 | 天天搞天天干 | 精品久久久久久亚洲 | 日本 在线 视频 中文 有码 | 国产 亚洲 欧美 在线 | 久久少妇| 91大神电影| 97成人精品 | 国产天天综合 | 欧美亚洲精品在线观看 | 久久久久久久久久久久久9999 | 手机成人在线 | 97av免费视频 | 国产日产精品一区二区三区四区的观看方式 | 天天色天天色 | 国产精品s色| 日韩三级一区 | 欧美精品亚洲二区 | 涩涩伊人 | 免费av在线 | 国产麻豆精品一区二区 | 色网站在线免费观看 | 玖玖玖在线 | 国产成人久久av免费高清密臂 | av日韩中文 | 欧美精品亚洲精品 | 91视频首页 | 国产精品都在这里 | www.天天射| 精品亚洲视频在线 | 国内一区二区视频 | 国产视频中文字幕在线观看 | 色婷婷狠狠五月综合天色拍 | 一区二区视频免费在线观看 | 亚洲aⅴ乱码精品成人区 | 免费精品在线视频 | 黄色av播放 | 国产999视频在线观看 | 国产精品成人一区 | 狠狠色综合网站久久久久久久 | 亚洲人成在 | 激情av资源 | 91在线国内视频 | 中文综合在线 | 国产精品美女久久久 | 亚洲最新在线 | 在线观看黄网站 | 成人高清av在线 | 午夜精品一区二区国产 | 最近最新中文字幕 | 九九久久久久久久久激情 | 在线一二区 | 天天躁日日躁狠狠躁av麻豆 | 在线成人观看 | 色999精品| 天堂网一区二区三区 | 国产精品原创视频 | 国产美女免费看 | 久久草视频 | 国产99久久久久久免费看 | 日本字幕网 | 99爱视频在线观看 | 丁香视频全集免费观看 | 天天操天天干天天操天天干 | 91精品1区| 91在线免费视频 | 久久久免费毛片 | 免费国产在线精品 | 久草视频在线免费 | 成人亚洲精品国产www | 日韩午夜网站 | 激情动态| 99中文字幕视频 | 成+人+色综合 | 高清免费在线视频 | 国产精品嫩草影院99网站 | 久久国产精品第一页 | 精品美女视频 | 久久久精品午夜 | 日韩av免费观看网站 | 天天操,夜夜操 | 亚洲自拍偷拍色图 | 在线观看国产一区二区 | 欧美日韩18| 香蕉视频在线免费 | 久久久久黄色 | 久久av中文字幕片 | 97综合在线| 欧美另类人妖 | 精品一区中文字幕 | 亚洲 欧洲av | 成人av电影免费在线观看 | 久久久国产精品一区二区中文 | 国产精品高潮久久av | 国产高清在线看 | 日韩欧美国产成人 | 99久久久久成人国产免费 | 操碰av | 久久只有精品 | 国产69久久精品成人看 | 国产在线精品国自产拍影院 | 中文字幕精品一区二区三区电影 | 国产精品第 | 2020天天干夜夜爽 | 波多野结衣久久资源 | 久久精品免费 | 中文字幕乱在线伦视频中文字幕乱码在线 | aaa日本高清在线播放免费观看 | 久久综合久色欧美综合狠狠 | 欧美国产日韩一区二区 | 婷婷国产一区二区三区 | 精品国模一区二区三区 | 美女久久久久久久久久 | 美国人与动物xxxx | 欧美色图东方 | 日日干狠狠操 | 久草视频视频在线播放 | 在线成人免费av | 成人9ⅰ免费影视网站 | 日韩二三区 | 在线免费观看国产视频 | 中文字幕av在线 | 色www精品视频在线观看 | 波多野结衣一区 | 婷婷色综合色 | 色丁香久久 | 国产成人精品免费在线观看 | 免费美女久久99 | 不卡视频一区二区三区 | 国产精品久久久久一区二区国产 | 特黄特色特刺激视频免费播放 | 麻豆免费在线播放 | 国产xxxxx在线观看 | 天天插综合 | 麻豆国产精品一区二区三区 | 色中文字幕在线观看 | 米奇影视7777| 久久精品直播 | 99久久er热在这里只有精品15 | 国产中文字幕视频在线 | 国产精品美女免费 | 久草在线最新视频 | 超碰97在线人人 | 欧美最猛性xxxx | 美女网站视频免费都是黄 | 久久精品三 | 天天色官网 | 午夜电影久久 | 久草亚洲视频 | bayu135国产精品视频 | 开心激情久久 | 亚洲欧美成人网 | 日韩在线欧美在线 | av在线色 | 亚洲精品乱码久久久久久高潮 | 欧美国产不卡 | 欧美少妇的秘密 | 国内精品久久久久影院优 | 色就是色综合 | av一区二区三区在线播放 | 午夜av免费在线观看 | 色偷偷88欧美精品久久久 | 最近中文字幕免费大全 | 天天做天天爱天天爽综合网 | 久久免费激情视频 | 亚洲精品中文字幕视频 | 国产精品入口久久 | 91精品亚洲影视在线观看 | 深夜福利视频在线观看 | 欧美xxxx性xxxxx高清 | 亚洲成aⅴ人片久久青草影院 | 蜜臀久久99精品久久久无需会员 | 久久久久激情电影 | 亚洲免费不卡 | 毛片一二区 | 国产黄av| 天天添夜夜操 | 成人黄色片免费看 | 97精品国产97久久久久久久久久久久 | 久久免费中文视频 | 亚洲国产电影在线观看 | 在线视频 影院 | 欧美一区二区三区四区夜夜大片 | 国产精品毛片久久久 | 9999在线视频 | 国产一区在线视频播放 | 99草视频 | 日韩欧美精品免费 | 97精品在线 | 欧美日本三级 | 黄色的网站在线 | 一区二区三区免费播放 | 青青草国产精品视频 | 国产精品成人一区二区三区吃奶 | 日韩欧美在线综合网 | 91视频免费国产 | 热久在线| 日韩字幕在线 | 欧美日韩一区久久 | 综合国产在线 | 在线观看亚洲视频 | 久草国产在线观看 | av在线收看 | а天堂中文最新一区二区三区 | 操高跟美女 | 久草综合视频 | 五月天激情视频 | 国产精品ssss在线亚洲 | 国产亚洲精品成人av久久ww | 久久免费电影网 | 国产一区二区三区网站 | 91视频3p | 999在线视频 | 91精品视频免费 | 免费av在 | 国产在线观看你懂得 | 国产精品第一 | 特黄免费av | 国产亚洲精品久久久久久电影 | 在线观看av网 | 一级黄色片网站 | 久久九九影视网 | 狠狠色丁香久久婷婷综合丁香 | 不卡在线一区 | zzijzzij亚洲成熟少妇 | 免费观看成年人视频 | 91色在线观看视频 | 久久在线电影 | 午夜久久福利影院 | 午夜精品久久一牛影视 | 国产精品久久久久久久久久直播 | 在线影视 一区 二区 三区 | 国产美腿白丝袜足在线av | 色综合天天 | 免费成人黄色片 | 国产成人777777 | 久久99国产综合精品免费 | 丝袜制服天堂 | 日本久久中文字幕 | 天天搞天天干 | 欧美 日韩 国产 中文字幕 | 久久综合久久综合这里只有精品 | 久久超级碰视频 | 婷婷六月综合网 | 久久精品久久久精品美女 | 91精品入口 | 欧美一级日韩免费不卡 | 亚洲视频 在线观看 | 国产群p视频 | 在线免费黄网站 | 高清在线观看av | 亚洲高清视频在线 | 久久久人人爽 | 国产一卡久久电影永久 | 手机av片| www.久热 | 日本性久久 | 久久久久久久久综合 | 成人在线观看免费 | 欧美最新大片在线看 | 一区二区不卡 | 处女av在线 | 久久婷婷国产色一区二区三区 | 日韩,精品电影 | 国产成人香蕉 | 欧美日韩后 | 热久精品 | 国产91区| 狠狠操狠狠操 | 九九热在线精品 | 婷婷丁香国产 | 美女精品国产 | 蜜臀av性久久久久av蜜臀妖精 | 国产a国产 | 久久婷婷激情 | 久久久国产精品人人片99精片欧美一 | 色婷婷综合久久久 | 日韩av一卡二卡三卡 | 激情一区二区三区欧美 | 中文成人字幕 | 亚洲精品资源在线 | 激情五月婷婷激情 | 久久国产免费看 | 欧美视频在线观看免费网址 | 人人擦 | 日韩在线观看一区二区三区 | 日韩精品一卡 | 叶爱av在线 | 色99之美女主播在线视频 | 碰超在线| 久久精品小视频 | av日韩不卡 | 91色九色 | 亚洲美女精品视频 | 五月天激情婷婷 | 亚洲国产精品一区二区久久hs | 亚洲国产精品久久久 | 中文字幕在线看视频 | 国产日产高清dvd碟片 | 中文字幕av网站 | 免费在线国产黄色 | www.久久婷婷 | 免费av网址在线观看 | 国产九九在线 | av短片在线| 亚洲成人资源 | 日本 在线 视频 中文 有码 | 国产成本人视频在线观看 | 久久久精品一区二区三区 | 三级黄色网址 | 欧美极品xxx | 国产视频2 | 91av在线电影 | 人人玩人人添人人澡97 | 欧美analxxxx | 欧洲性视频 | 久热超碰 | 日韩视频二区 | 国产91精品一区二区麻豆网站 | 69精品久久 | 成人综合日日夜夜 | 91精品国产91久久久久福利 | 天天插狠狠干 | 伊甸园永久入口www 99热 精品在线 | 国产精品每日更新 | 最新av免费 | 91在线网站| 国产美女视频免费 | 午夜色大片在线观看 | 免费色视频网站 | 久久九九精品 | 91在线91拍拍在线91 | 日韩高清激情 | 又黄又爽又刺激的视频 | 亚洲日本在线视频观看 | av品善网| 欧美男同网站 | 伊人久久国产 | 亚洲三级黄色 | 国产中文字幕视频在线 | 成人宗合网 | 国产色 在线 | 国产精品一区二区麻豆 | 日韩免费在线一区 | 99久久一区 | 亚洲精欧美一区二区精品 | 亚洲国内精品在线 | 在线观看黄色的网站 | 91av资源在线| 中文字幕av最新 | 在线观看免费视频你懂的 | 欧美视频一区二 | av日韩av | 色综合久久88色综合天天 | 亚洲精品在线免费 | av黄色免费在线观看 | 日韩av在线一区二区 | 五月天激情综合 | 精品自拍av | 欧美精品成人在线 | 西西4444www大胆视频 | 夜夜躁狠狠躁 | 天天干天天摸天天操 | 在线小视频你懂得 | 亚洲国产美女精品久久久久∴ | 成人久久影院 | 在线有码中文字幕 | 久久无码av一区二区三区电影网 | 婷婷丁香av | 欧美日韩在线网站 | 91在线产啪 | 国产精品久久久久永久免费 | 成人黄色在线看 | 精品视频不卡 | 在线观看免费成人av | 国产1区2区3区精品美女 | 一区二区三区四区在线 | 日韩欧在线 | 亚洲精品久久久久久久蜜桃 | 97成人在线免费视频 | 久久免费视频在线观看6 | 久久国产美女视频 | 玖玖玖在线 | 国产专区欧美专区 | 在线视频一二三 | 国产在线观看,日本 | 99热手机在线| 欧美在线视频一区二区三区 | 色婷婷99 | 欧美在线视频免费 | 99久久精品国产系列 | 成人污视频在线观看 | 免费网站观看www在线观看 | 中文字幕亚洲国产 | 人人玩人人弄 | 久久人人爽人人爽人人片av免费 | 在线高清av | 免费在线观看日韩视频 | 在线观看av的网站 | 国产综合视频在线观看 | 久草精品电影 | 国产亚洲精品久久19p | 又黄又爽又无遮挡免费的网站 | 麻豆 videos| av超碰在线观看 | 亚洲精品小视频在线观看 | 国产自产在线视频 | 成人欧美一区二区三区在线观看 | 免费韩国av| av在线免费播放 | 久久免费黄色大片 | 欧美日韩视频在线观看免费 | 麻豆小视频在线观看 | 欧美日本三级 | 国产精品日韩久久久久 | 国产黑丝一区二区三区 | 色吊丝在线永久观看最新版本 | 国产精品2020 | 狠狠干天天操 | 在线看v片成人 | 在线免费色 | 黄色资源在线 | 天天草综合网 | 成人电影毛片 | 免费在线播放 | 中文字幕欧美日韩va免费视频 | 激情丁香 | 干 操 插 | 国产精品18久久久久久久久久久久 | 久碰视频在线观看 | 欧美一二三视频 | 日日干网址 | 国产91对白在线播 | 国产一级黄 | 亚洲精品在线网站 | 欧美日性视频 | 午夜99| 国产精品久久久久久五月尺 | 日韩综合一区二区 | 日韩簧片在线观看 | 特级西西444www大精品视频免费看 | www.伊人色.com| 色婷婷丁香 | 国产精品久久二区 | 一区二区视频在线看 | 日韩欧美综合精品 | 中文字幕av网站 | 五月激情久久 | 国产日韩在线一区 | 超碰国产在线播放 | 日韩精品一区在线播放 | 久久99久久99久久 | 欧美日韩18| 亚洲成人精品国产 | 国产精品久久久久久久电影 | 99久久99久久免费精品蜜臀 | 午夜av免费看 | 国产成人精品亚洲精品 | 最近日本韩国中文字幕 | 国模精品一区二区三区 | 国产亚洲高清视频 | 亚洲欧美偷拍另类 | 国产精品国产亚洲精品看不卡15 | 久久精品欧美日韩精品 | 国产精品毛片一区二区在线 | 国产一级在线看 | 国产精品久99 | 日本精品久久久久中文字幕 | 69视频在线| 久久a国产 | 欧美国产不卡 | 日韩精品一区二区三区外面 | 亚洲免费视频在线观看 | 国产一区国产二区在线观看 | 日本少妇高清做爰视频 | 成人动漫视频在线 | 麻豆视频大全 | 成人av亚洲| 国产日韩精品在线 | 天天射天天干天天 | 亚洲天堂视频在线 | 最近2019中文免费高清视频观看www99 | 成年免费在线视频 | 午夜精品久久久久久久99无限制 | 国产精品岛国久久久久久久久红粉 | 成人在线观看资源 | 欧美视频在线二区 | av在线一级 | 成人超碰97| 亚洲视频六区 | 91完整版在线观看 | 人人盈棋牌 | 少妇bbbb| 亚洲乱码精品久久久 | 国产中文字幕视频在线观看 | 久久草在线免费 | 干天天| 在线免费观看黄网站 | 国产视频午夜 | 国产精品久久久久久影院 | 四川bbb搡bbb爽爽视频 | 国产精品久久久久久久久久不蜜月 | 国产精品精品久久久 | 国产a视频免费观看 | 91成人精品一区在线播放69 | 午夜精品电影 | 久久久精品久久日韩一区综合 | 香蕉网在线观看 | 中文字幕大全 | 亚洲精品免费看 | 激情五月亚洲 | 欧美日韩精品国产 | 精品一区二区6 | 成人av网站在线播放 | 亚洲春色奇米影视 | 久青草电影| 九九久久视频 | 免费观看成人网 | 亚洲精品久久久蜜桃 | 久久久久北条麻妃免费看 | 夜夜婷婷 | 91在线免费观看国产 | www.久久成人| 玖玖精品视频 | 精品福利在线 | 婷婷在线色 | 91精品老司机久久一区啪 | 91成人免费看片 | 日韩在线观看一区二区 | 天天干夜夜夜操天 | 成人免费视频网站 | 亚洲成人免费在线观看 | 国产无套视频 | 午夜精品久久久久久久久久久 | 国产不卡在线观看 | 伊人天天狠天天添日日拍 | 久草视频看看 | 最新色视频| 99热亚洲精品 | 日韩大片免费在线观看 | 欧美日韩国产综合一区二区 | 国产麻豆精品免费视频 | 亚洲国产中文字幕在线 | av不卡中文字幕 | 久久久久精| 97偷拍视频 | 精品视频免费看 | 久久综合桃花 | 免费日韩一区二区 | 亚洲成aⅴ人在线观看 | 国产视频一区在线 | 久久久穴 | 精品中文字幕在线观看 | 国产一级做a爱片久久毛片a | 婷婷av电影 | 亚洲另类久久 |