Vue2.5 学习笔记 9.6 使用Ajax获取动态数据

1. 获取AJAX数据

模拟后端传过来的JSON

获取数据:

<script>
import DetailBanner from './components/Banner'
import DetailHeader from './components/Header'
import DetailList from './components/List'
import axios from 'axios'
export default {
  name: 'Detail',
  components: {
    DetailBanner,
    DetailHeader,
    DetailList
  },
  data () {
    return {
      sightName: '',
      bannerImg: '',
      gallaryImgs: [],
      list: []
    }
  },
  methods: {
// 通过axios.get获取数据 并且获得id值
    getDetailInfo () {
      axios.get('/api/detail.json', {
        params: {
          id: this.$route.params.id
        }
      }).then(this.handleGetDataSucc)
    },
    handleGetDataSucc (res) {
      res = res.data
// 将各个数据传递给本地变量
      if (res.ret && res.data) {
        const data = res.data
        this.sightName = data.sightName
        this.bannerImg = data.bannerImg
        this.gallaryImgs = data.gallaryImgs
        this.list = data.categoryList
      }
    }
  },
//使用生命周期钩子获取数据
  mounted () {
    this.getDetailInfo()
  }
}
</script>


// router

    {
      path: '/detail/:id',
      name: 'Detail',
      component: Detail
    }
  ],



//Detail.vue/template

<template>
  <div>
将数据传递给各个组件
    <detail-banner
      :sightName="sightName"
      :bannerImg="bannerImg"
      :gallaryImgs="gallaryImgs"
    ></detail-banner>
    <detail-header></detail-header>
    <div class="content">
      <detail-list :list="list"></detail-list>
    </div>
  </div>
</template>

Banner.vue子组件展示数据:

<template>
  <div>
    <div class="banner" @click="handleBannerClick">
// 这里
      <img class="banner-img" :src="bannerImg" />
      <div class="banner-info">
// 这里
        <div class="banner-title">{{this.sightName}}</div>
        <div class="banner-number"><span class="iconfont banner-icon">&#xe6eb;</span>
//这里
          {{this.gallaryImgs.length}}
        </div>
      </div>
    </div>
    <common-gallary
// 这里
      :imgs="gallaryImgs"
      v-show="showGallary"
      @close="handleGallaryClose"
    >
    </common-gallary>
  </div>
</template>

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

List.vue:

<template>
  <div>
    <div
      class="item"
      v-for="(item, index) of list"
      :key="index"
    >
      <div class="item-title border-bottom">
        <span class="item-title-icon"></span>
        {{item.title}}
      </div>
      <div v-if="item.children" class="item-children">
//这里 
        <detail-list :list="item.children"></detail-list>
      </div>
    </div>
  </div>
</template>


<script>
export default {
  name: 'DetailList',
  props: {
    list: Array
  }
}
</script>

到了这里主要的是写完了。但是还有2个BUG

 

mounted会做缓存 所以每次点击页面进来 都不会再重新请求数据 这样 id永远都是001

所以需要如下操作:

// 根目录的App.vue

<template>
  <div id="app">
// 他这里吧所有的组件都用keep-alive包裹建缓存   使用exclude 排除组件 也就是说 Detail这个组件不执行缓存机制。
    <keep-alive exclude="Detail">
      <router-view/>
    </keep-alive>
  </div>
</template>

<script>
export default {
  name: 'App'
}
</script>

<style>

</style>

第二个问题就是在每次点击进去详情页的时候  页面都不会在顶部 滚动条会在不同页面上互相影响。 所以需要在router/index.js需要添加如下代码:

export default new Router({
  routes: [
    {
      path: '/',
      name: 'Home',
      component: Home
    }, {
      path: '/city',
      name: 'City',
      component: City
    },
    {
      path: '/detail/:id',
      name: 'Detail',
      component: Detail
    }
  ],
// 这里添加
  scrollBehavior (to, from, savedPosition) {
    return { x: 0, y: 0 }
  }
})

这样就搞定了。  

详情查看:https://cn.vuejs.org/v2/guide/routing.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@凌晨三点半

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值