仿写去哪儿app项目和详细总结

我的代码地址:https://gitee.com/Zl190/Travel
效果图:

image.png

image.png

image.png

image.png

image.png

image.png

具体的话你们可以下载我的项目参考一下,有一些特效也可以自己改进。
接下来我要开始总结我所做的去哪儿app的一些心得了。

1.移动端开发中的1px边框问题,由于在不同屏幕上,可能会使得1px实际在移动端显示不是1px,怎么解决?

解决:通过设置对应viewport的rem基准值,这种方式就可以像以前一样轻松愉快的写1px了。

2.移动端click事件延迟300ms的解决方法?

先在终端下载fastclick

cnpm install fastclick --save

然后在main.js里面引入

import fastClick from 'fastclick'

使用fastClick

fastClick.attach(document.body)

3. scoped限制该vue文件下的css仅在该.vue文件下使用。

4. stylus样式的应用:

下载stylus

cnpm install stylus --save
cnpm install stylus-loader --save

使用

 <style lang="stylus" scoped> </style>

stylus使用变量的话可以在src下面的assets新建个文件夹css,然后建个 varibles.styl来存放要使用的一些变量.
最后在<style lang="stylus" scoped/>标签内引入

@import '../../../assets/css/varibles.styl'

这样就可以使用那些变量了。

5.简化路径

@在路径中指的是src目录,即@/assets/css/reset.css,注意,在css样式中引入其他css目录时,需要写成~@/assets/css/reset.css。

简化路径,为常用路径简化别名,如src/common可简化为common/:
步骤:在build下webpack.base.conf.js文件下
resolve: {
extensions: ['.js', '.vue', '.json'],
alias: {
'vue$': 'vue/dist/vue.esm.js',
'@': resolve('src'), //@这是src目录的别名
'common':resolve('src/common') //这是src/common的别名,从而用common替代src/common路径达到简化效果
}
}

6. iconfont字体图标的应用:

6.1 在iconfont注册账号,建立一个项目,然后将需要的图标加入到该项目下,下载到本地电脑该项目文件夹下src->assets->iconfont中。
6.2 在iconfont.css的url中修改字体在本地的路径,在main.js中直接引入该文件import ".import './assets/css/iconfont.css'"。
6.3 <span class="iconfont"></span>即可显示该图标字体。

7.解决网速过慢获取资源页面抖动问题

设置元素的宽高比例固定就行了

.swiper
        overflow : hidden
        width :100%
        height :0
        padding-bottom :31.25%//即高始终为宽的31.25%

8.scoped穿透

如果我们给样式设置了scoped,这个时候组件里面的样式既不能影响外部样式,也不能比外部样式所影响。

 .swiper >>> .swiper-pagination-bullet-active
        background-color :#fff

9.vue-awersome-swipper数据加载后直接显示最后一页问题。

解决:使用axios获取数据传递给轮播组件以后直接显示了最后一页,此时可以使用v-if通过判断数组长度返回的是true还是false

<swiper :options="swiperOption" v-if="showimg">
 showimg(){
        return this.swiperList.length
      }

这样这个问题就解决了。

10.vue-awesome-swiper轮播插件的应用:

    1.在main.js中引入全局插件:
        npm install vue-awesome-swiper@2.6.7 --save
        import VueAwesomeSwiper from 'vue-awesome-swiper'
        import "swiper/dist/css/swiper.css"
        Vue.use(VueAwesomeSwiper)
     2.
   <swiper :options="swiperOption" v-if="showimg">
  <!-- slides -->
  <swiper-slide v-for="list of swiperList" :key="list.id">
      <img class="swiper-img" :src="list.imgUrl"/>
  </swiper-slide>
  <!-- Optional controls -->
  <div class="swiper-pagination" slot="pagination"></div>
</swiper>

swipperDOM结构变化导致的滚动问题
如果我们插入swipper中的DOM有所变化,那么滚动效果就会变得非常的差,这个时候我们可以设置他的swipperOptions里面的observeParents以及observer

 data () {
   return {
     swiperOption: {
       pagination : '.swiper-pagination',
              paginationType : 'fraction',
              observer:true,
              observeParents:true,
     }
   }
 }

11.跨平台的axios的使用:实现跨平台的请求

      10.1  npm install axios --save  //或者<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
      10.2  import axios from "axios"
      10.3  methods:{            //通过.json文件模拟后端接受的数据,将index.json文件放在static里面
                  getHomeInfo(){
                      axios.get("./static/mock/index.json").then(this.getHomeInfoSucc)
                  },
                  getHomeInfoSucc(res){
                      console.log(res)
                  }
              }

12.在config>index.js里面 做如下设置,则可以实现通过调用api/index.json接口时,自动转到本地static/mock/index.json文件

             proxyTable: {
                "/api":{
                    target:"http://location:8098",
                    pathRewrite:{
                        "^/api":"/static/mock"
                    }
                }
            }

13. Bscroll使用方法:

    1. npm下载better-scroll:npm install better-scroll --save;
    2. 引入better-scroll:import Bscroll from "better-scroll";
    3. 定义标签dom:  < div ref="wrapper"></div>
    4. 实例化bscroll:  this.scroll = new BScroll(this.$refs.wrapper, {click: true});

注意:Bscroll提供滚动到指定DOM位置的API,this.scroll.scrollToElement(dom);

全局事件
如果把事件绑定到window上面比如scroll事件,那么在推出这个页面的时候一定要进行解绑,不然在其他的页面也会受到这个事件的影响,造成bug

  mounted () {
    window.addEventListener('scroll', this.handleScroll)
  },
  beforeDestroy () {
    window.removeEventListener('scroll', this.handleScroll)
  }

14.滚动行为

如果我们的某个页面是滚动的,切设置了keep-alive,那么我们进入其他页面返回的时候如果读取了缓存,那么这个缓存是包括滚动行为的,则原来页面滚动到什么位置现在也滚动到什么位置如果我们不希望出现这种情况,可以在路由中设置滚动行为

scrollBehavior (to, from, savedPosition) {   return { x: 0, y: 0 } }

15、组件name的作用

1、在递归组件中实用,即,我们在创建组件的时候就可以使用组件自身

2、keep-alive的exclude中实用,用来避免某些组件进入缓存

3、vue-devtools中的使用

16.keep-alive

使用keep-alive可以进行缓存,这样就不会每次进入相同的页面都会进行数据请求了,能提高用户体验、在使用keep-alive以后会多两个生命周期函数:activated以及deactivated,我们可以在这里进行一些判断操作,来决定是否需要缓存,是否需要执行数据获取。此外,如果我们是给整个路由router-view组件进行了keep-alive,并且在这里执行了一些exinclude设置

<keep-alive exclude="Detail">
<router-view/>
</keep-alive>
<keep-alive exclude="组件name名"> //exclude="组件name名"表示该组件不需要缓存,即每次跳转到页面都重新加载mounted生命周期

   activated(){ //因为keep-alive而多出来的生命周期,即页面初始加载时和mounted一样执行,且在每次页面跳转返回当前页面时,仍然会执行,但是mounted因为在keep-alive下不会执行了
      if(this.lastCity !== this.city){   //即跳转回当前页面时,如果选择的城市发生改变,则再次发生ajax,否则就不发生ajax
          this.lastCity=this.city;   
          this.getHomeInfo();   
      }
  }

那么对应的里面就没有这两个生命周期函数了,我们不能使用这两个函数

17

          <router-link
                     class="item-list border-bottom" 
                     v-for="item of recommendList" 
                     :key="item.id"
                     tag="li"
                     :to="'/details/'+item.id"></router-link>

这种写法,避免了a标签改变了li表示内里的文字颜色,相当于<li></li>且自带跳转页面的功能。
<router-link tag="div" :to="."></router-link> 其中to="."表示返回上一页

18.路由带参数传值:

{
  path: '/detail/:id',//动态id
  component: Detail
}

19.vue中的递归组件:即组件里面调用组件自己本身;

通过name:" detailComponent"名,去调用<detail-component :list="参数"></detail-component>


image.png

20.localStorage本地存储:

let defaultCity = '上饶'
try {
// 如果存在本地的城市,则让默认的城市等于本地选择的城市
  if (localStorage.city) {
    defaultCity = localStorage.city
  }
} catch (e) {

}
export default {
  city: defaultCity
}

21.

vuex的使用:如果您不打算开发大型单页应用,使用 Vuex 可能是繁琐冗余的。确实是如此——如果您的应用够简单,
您最好不要使用 Vuex。一个简单的 global event bus 就足够您所需了。但是,如果您需要构建一个中大型单页应用,您很可能会考虑如何更好地在组件外部管理状态,
Vuex 将会成为自然而然的选择;

步骤:21.1 安装vuex:npm install vuex --save ;
21.2 src文件夹下创建一个store文件夹用于处理vuex;
21.3 在store文件夹下创建index.js;
21.4 在index.js里写:

        import Vue from "vue"
        import Vuex from "vuex"
        Vue.use(Vuex);   //vue里面使用插件(如vuex)都是通过Vue.use(插件名)
        export default new Vuex.Store({  //创建new Vuex.Store仓库,并导出export
            state:{   //存放全局公用的数据
                city:"上饶",     //首页头部显示的城市,默认为重庆
            },
            actions:{   //接受模块通过this.$store.dispatch传递过来的changeCity=item的数据,ctx.commit表示把该数据名和值传递给mutations
               changeCity (txt, value) {

// 通过txt的commit方法触发mutations里的changeCity,并且传递city。

          txt.commit('changeCity', value)
              }
        }

            //注释:如果是this.$store.commit传递过的数据,可以直接不需要actions,从而直接通过mutations处理修改state的值
            mutations:{   //接受actions通过ctx.commit传递的数据并处理,即修改state里面的city让其等于item
                changeCity(state,item){
                    state.city=item;
                }
            }
        })

22.动画的添加

npm install animate.css --save

下面是我写的动画

image.png

然后使用该动画


image.png

23. vue项目的接口联调:即将模拟的json数据改成从服务器获取数据:

在config->index.js下:

        dev: {
            assetsSubDirectory: 'static',
            assetsPublicPath: '/',
            proxyTable: {
                "/api":{
                    target:"http://localhost:80", // 将此改为服务地址,即发送/api的ajax会从该地址获取数据
                }
            },

24.vue项目打包上线:进入该项目的命令行,输入npm run build,会生成dist文件,然后将该文件里内容放在服务上,如放在xampp->htdocs根目录文件夹下

补充一下:
还有函数节流
在我们使用一些滚动事件的时候,我们可以设置节流来提高效率,比如滚动事件如果在一定时间内连续滚动则不进行处理,直到最后确定滚动出来了,这样能提高性能。常见解决方式是设置一个定时器来进行解决

//   设置个定时器性能更好
      this.timer = setTimeout(() => {
        var result = [];
        // 遍历citier这个数组对象   i :0,1,2,3,...
        for (var i in this.cities) {
          // 循环这个数组上的所有元素
          this.cities[i].forEach(value => {
            // 如果当前对象的spell和name包含keywords关键字则向新创建的result数组中添加该对象
            if (
              value.spell.indexOf(this.keywords) > -1 ||
              value.name.indexOf(this.keywords) > -1
            ) {
              result.push(value);
            }
          });
        }
        this.list = result;
      }, 100);

这是我写完去哪儿app的心得。
想学习前端的同学,我留下[传送门](https://www.liaoxuefeng.com

),码子不易,如果文章对你有帮忙,点个赞呗

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容