目标: 使用ajax获取详情页面的数据

数据形式:

{"ret": true,"data": {"sightName": "迪士尼小镇","bannerImg": "http://img1.qunarzz.com/sight/p0/1707/82/821428e3bbf93bbaa3.water.jpg_600x330_2385695d.jpg","galleryImgs": ["http://img1.qunarzz.com/sight/p0/1707/c2/c2be8d6326cdea1a3.water.jpg_r_800x800_97e80887.jpg", "http://img1.qunarzz.com/sight/p0/1707/c4/c48e92049336b8ffa3.water.jpg_r_800x800_42a54b54.jpg"],"categoryList": [{"title": "成人票","children": [{"title": "成人三人团票","children": [{"title": "成人三人团票-亲情套餐"}]}, {"title": "成人五人团票"}]}, {"title": "学生票"}, {"title": "儿童票"}, {"title": "特惠票"}]}
}

在Detail.vue中借助ajax请求: 借用生命周期钩子来实现。

methods: {getDetailInfo () {axios.get('/api/detail.json')}
},
mounted() {this.getDetailInfo()
}

使用ajax请求要记得引入axios。此外,我们每次请求不同的详情页的时候,希望将对应的id带给后端,以此来获取不同详情页面的数据。 而这个id是动态路由的一个参数,在路由定义中是这样的:

path: '/detail/:id',
name: 'Detail',
component: Detail

上面的这个动态路由会把对应的id存放在id的这个变量当中,在页面上就可以这样写:axios.get('/api/detail.json?id=' + this.$route.params.id), 但是这样写太麻烦,换一种写法:

axios.get('/api/detail.json', {params: {id: this.$route.params.id}})

当ajax数据获取完毕之后就可以then了:

methods: {getDetailInfo () {axios.get('/api/detail.json', {params: {id: this.$route.params.id}}).then(this.handleGetDataSucc)},handleGetDataSucc (res) {var res = res.dataif (res.ret && res.data) {const data = res.datathis.sightName = data.sightNamethis.bannerImg = data.bannerImgthis.galleryImgs = data.galleryImgsthis.list = data.categoryList}}
}

res就是获取到的数据,然后将这些获得的数据以属性的形式分别传递给子组件。

<div><detail-banner :sightName="sightName":bannerImg="bannerImg":bannerImgs="galleryImgs"></detail-banner><detail-header></detail-header><div class="content"><detail-list :list="list"></detail-list></div>
</div>

子组件接收数据:
Banner.vue中接收:

props: {sightName: String,bannerImg: String,bannerImgs: Array
}

数据替换:

<div><div class="banner" @click="handleBannerClick"><img class="banner-img" :src="bannerImg" alt=""><div class="banner-info"><div class="banner-title">{{ this.sightName }}</div><div class="banner-number"><span class="iconfont banner-icon"></span>{{ this.bannerImgs.length }}</div></div></div><common-gallery :imgs="bannerImgs" v-show="showGallery"@close="handleBannerGallery"></common-gallery>
</div>

完成上面的数据替换,依然能够呈现出想要的效果。

但是,在页面上点击详情页的时候会发现,当我点击第一个详情页的时候它发了id为0001的ajax数据,而请求第二个详情页的时候并没有发送id为0002的ajax数据,原因是Detail页面使用keep-alive做了缓存,所以mounted只会执行一次,跟之前的页面一样,如果想要请求不同页面的时候都发送一个ajax请求的话,就要配合activated的生命周期钩子,但是这里,我们采用一种新的方式: 在我们的根组件App.vue中原本是这样的:

<keep-alive><router-view/>
</keep-alive>

表示所有路由的页面都做了一个缓存,如果我不想让详情页面做缓存,就可以这样做:

<keep-alive exclude="Detail"><router-view/>
</keep-alive>

其中Detail是详情页的名字,表示除了Detail页面都会缓存,只有Detail页面不会被缓存了,那么这个时候在请求不同详情页面的时候mounted钩子都会被执行。

每个组件中的name的作用是什么?
1. 递归组件需要使用
2. 相对某个页面取消缓存的时候需要使用
3. 网页中Vue开发调试工具会显示一个个组件的名字,就是这个name

一个小bug: 点击后面的详情页时会发现跳转过来的页面不是从顶部开始显示的,拖动效果在多个页面之间会互相影响。解决方法:Vue Router官网有一个滚动行为,在我们项目的路由部分添加以下内容:

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

表示每次做路由切换的时候都让显示的页面从(0,0)出开始显示,页面切换的时候始终从最顶部开始显示。

去哪儿-19-detail-ajax相关推荐

  1. 40岁了去华为19级,薪酬翻倍,但现在比较稳定,值得吗?

    最近在知乎上有个讨论的比较火热的问题: 40岁了去华为19级,薪酬翻倍,但现在比较稳定,值得吗? 我一个在华为干了12年的前华为朋友,为我从多个维度详细解答了这个问题 前言 1 首先上结论: 君子不立 ...

  2. jQuery与Ajax 面试题库(长期更新中...)

    jQuery 部分: JavaScript 是客户端脚本的标准语言,而 jQuery 使得编写 JavaScript 更加简单.你可以只用写几行的jQuery 代码就能实现更多的东西. 它是最长被用到 ...

  3. js同步等待ajax结果返回

    JavaScript中的await/async的作用和用法 await/async 是 ES7 最重要特性之一,它是目前为止 JS 最佳的异步解决方案了.这篇文章主要介绍了JavaScript中的aw ...

  4. ajax获取后台数据的几种方式及如何获取ajax内部的数据供外部使用

    文章目录 1 ajax获取后台数据的几种方式 1.1 原生js的ajax方式 1.1.1 get 1.1.2 post 1.2 jQuery封装的ajax方式 1.2.1 $.ajax 1.2.2 $ ...

  5. ajax同步,异步简单的介绍

    星期天一个人捣鼓个人网站的事情,read8686.com,如果哪位开发者又欢迎大家一起探讨,在文章的有我的微信 就是这样的一个注册的页面,其实我要实现的功能是什么啊,就是在用户注册的时候判断在数据库里 ...

  6. 分享7个我常去的国外AjaxJquery网站

    经常逛这些国外的网站,看到很不错的控件和Jquery的演示DEMO:今天拿出来和大家分享一番: Ajax Rain:http://www.ajaxrain.com/ AjaxRain有很多完美整合AJ ...

  7. 从零开始学习jQuery (六) AJAX快餐【转】

    一.摘要 本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案,  即使你会使用jQuery也能在阅读中发现些许秘籍. 本篇文章讲解如何使用jQuery方便快捷的实现A ...

  8. tp框架实现ajax

    不墨迹,直接进主题. tp框架实现ajax 首先,我们先做一个testajax.html用来显示页面(只是一个简单的下拉列表^_^) <!DOCTYPE html PUBLIC "-/ ...

  9. 优化asp.net ajax的脚本资源下载

    大家好像都有一种同感,使用了asp.net ajax的网站的速度好像都不是特别快.目前维护的网站,页面执行时间在0.1秒上下,页面本身的HTML也在50K左右,经常都是页面标题已经显示出来一段时间了, ...

  10. 从零开始学习jQuery (六) AJAX快餐

    本系列文章导航 从零开始学习jQuery (一) 开天辟地入门篇 从零开始学习jQuery (二) 万能的选择器 从零开始学习jQuery (三) 管理jQuery包装集 从零开始学习jQuery ( ...

最新文章

  1. 硬核!我的导师手写129页毕业论文,堪比打印!
  2. ejs文件与html,将HTMLWebpackPlugin与EJS文件一起使用
  3. datetimepicker时间控件
  4. VMware虚拟机Ubuntu系统与物理机Windows 7系统共享文件夹
  5. docker中部署mysql
  6. HDU - 4416 Good Article Good sentence(广义后缀自动机/后缀自动机)
  7. CentOS 7.0 上安装和配置 VNC 服务器
  8. python 字符串编码
  9. Linux笔记-解决QtCreator中qDebug不打印的问题
  10. 简述php语言的特点是_PHP语言有哪些优势和特点(一)
  11. openSUSE12.1安装及基本设置
  12. 西门子S7-300 PLC视频教程(百度网盘)
  13. 安航云酒店管理系统面试话术
  14. Linux系统下Lame环境的搭建
  15. java mysql物联网土壤智能监控web前端+java后台+数据接程序
  16. java基础知识整理
  17. springboot 签名验证
  18. 52单片机交通灯课程设计
  19. 电磁场与仿真软件(22)
  20. 如何划分测试集和训练集

热门文章

  1. linux_scp 远程复制不需要输入密码
  2. 你不知道的Chrome调试技巧
  3. Nginx 动态模块
  4. Linux基本命令 -- grep参数说明及常用用法
  5. SQL-连接查询:left join,right join,inner join,full join之间的区别
  6. 安卓开发学习笔记(六):如何实现指定图片定时开屏功能?
  7. git 部分常用命令记录
  8. 【Linux】统信UOS桌面壁纸右下角的统信UOS水印怎样去掉
  9. shell脚本spawn_如何使用child_process.spawn将Python / Ruby / PHP Shell脚本与Node.js集成
  10. VS2013的boost.python编译