27-网络请求:路由动态传值,页面跳转

2,619 阅读2分钟

小案例

在26节写了列表页面年部分,在这一节写跳转的detail部分,在detail部分是写一个页面,然后通过一个新的接口,获取新的数据,看起来和上一节的页面逻辑一模一样,但是有一个问题,这里获取到的就是一条数据,在前一个页面无论点哪一条数据进来,这里都是显示的这一条数据,这就需要带参数跳转,才能确认前一个页面对应到这个页面是哪一条数据

<template>
  <view class="detail">
    <view class="title">{{objData.title}}</view>
    <view class="content">{{objData.body}}</view>
  </view>
</template>

<script>
  export default {
    data() {
      return {
        objData:{}
      };
    },
    onLoad() {
      this.getDetail()
    },
    methods:{
      getDetail(){
      uni.request({
        url:"http://jsonplaceholder.typicode.com/posts/1",
        success:res=>{
          this.objData = res.data
        }
      })
      }
    }
  }
</script>

<style lang="scss">
.detail {
  padding: 30rpx;
  .title {
    font-size: 46rpx;
    color: #000;
    padding-bottom: 20rpx;
  }
  .content {
    font-size: 30rpx; 
    color: #666;
    padding-bottom: 60rpx;
  }
}
</style>

在列表页,无论点击哪一条数据进来,都是显示这个一条数据,因为只写了一个跳转,而且这一条数据本身就是在这个页面写的接口获取到的 image.png

先写一个加载提示框,再带数据传参,传参是list页面向detail页面传 先在标签的点击事件里,把要传的id带上item.id,然后在点击事件方法里接收这个值

<view class="row" v-for="item in listArr" :key="item.id" @click="clickItem(item.id)">

点击事件获取到的值,接口带的id是从1开始的

      clickItem(e){
        console.log(e);
        uni.navigateTo({
          url:"/pages/detail/detail"
        })
      }

image.png

在点击跳转的url后面把id拼接上去

      clickItem(e){
        console.log(e);
        uni.navigateTo({
          url:"/pages/detail/detail?id="+e
        })
      }

detail页面拿到id了 image.png

这个值在detail的onload里面能接收到

onLoad默认有一个Object类型的参数,是指其他页面打开当前页面所调用的 query 参数

    onLoad(e) {
      this.getDetail()
      console.log(e);
    },

image.png

这样就可以先在data中定义一个id,然后将onLoad方法中获取到的id赋值给它

    onLoad(e) {
      this.id = e.id
      this.getDetail()
    },

detail页面代码如下:

<template>
  <view class="detail">
    <view class="title">{{objData.title}}</view>
    <view class="content">{{objData.body}}</view>
  </view>
</template>

<script>
  export default {
    data() {
      return {
        objData:{},
        id:1
      };
    },
    onLoad(e) {
      this.id = e.id
      this.getDetail()
    },
    methods:{
      getDetail(){
        uni.showLoading({
          title:"数据加载中...",
          mask:true
        })
        uni.request({
          url:"http://jsonplaceholder.typicode.com/posts/" + this.id,
          success:res=>{
            this.objData = res.data
          },
          // 无论接口是否调用成功,都隐藏掉加载提示框
          complete: () => {
            uni.hideLoading()
          }
        })
      }
    }
  }
</script>

<style lang="scss">
.detail {
  padding: 30rpx;
  .title {
    font-size: 46rpx;
    color: #000;
    padding-bottom: 20rpx;
  }
  .content {
    font-size: 30rpx; 
    color: #666;
    padding-bottom: 60rpx;
  }
}
</style>

现在已经可以实现点击列表页的某一项,进入到detail之后是对应的内容

接下来在下面写评论区

评论区内容的接口不用双引号了,用ES6的模板字符串,模板字符串本身也是字符串,区别于普通字符串的最大特点是可以插入表达式,这样,就可以在接口url中动态的插入参数

详情和评论是分为两个接口分别拿到的数据,先获取哪一个接口数据根据需要进行判断,还可以先获取一个数据,然后另一个接口的数据获取就放在success里面,例如先拿详情,然后详情获取到之后,在success里再获取评论,这样比较合理

<template>
<view class="">
  <view class="detail">
    <view class="title">{{objData.title}}</view>
    <view class="content">{{objData.body}}</view>
  </view>
  
  <view class="comment">
    <view class="text">评论</view>
    <!-- 评论内容每次获取到5条,遍历数组,渲染数据 -->
    <view class="row" v-for="item in comments" :key="item.id">
      <view class="top">
        <view class="name">{{item.name}}</view>
        <view class="mail">{{item.email}}</view>
      </view>
      <view class="body">{{item.body}}</view>
    </view>
  </view>
</view>
</template>

<script>
  export default {
    data() {
      return {
        objData:{},
        id:1,
        comments: []
      };
    },
    onLoad(e) {
      this.id = e.id;
      // 获取内容详情方法
      this.getDetail();
      // 获取评论内容方法
      this.getComments();
    },
    methods:{
      getDetail(){
        uni.showLoading({
          title:"数据加载中...",
          mask:true
        })
        uni.request({
          url:"http://jsonplaceholder.typicode.com/posts/" + this.id,
          success:res=>{
            this.objData = res.data
          },
          // 无论接口是否调用成功,都隐藏掉加载提示框
          complete: () => {
            uni.hideLoading()
          }
        })
      },
      getComments(){
        uni.request({
          // 获取网络评论内容,使用模板字符串插入表达式--动态获取id
          url:`http://jsonplaceholder.typicode.com/posts/${this.id}/comments`,
          success:res => {
            // 获取到的评论内容绑定到data
          this.comments = res.data
          }
        })
      }
    }
  }
</script>

<style lang="scss">
.detail {
  padding: 30rpx;
  .title {
    font-size: 46rpx;
    color: #000;
    padding-bottom: 20rpx;
  }
  .content {
    font-size: 30rpx; 
    color: #666;
    padding-bottom: 60rpx;
  }
}
.comment{
  padding: 30rpx;
  background: #f8f8f8;
  .text {
    font-size: 46rpx;
    margin-bottom: 30rpx;
  }
  .row {
    border-bottom: 1px solid #e8e8e8;
    padding: 20rpx 0;
    .top {
      display: flex;
      justify-content: space-between;
      font-size: 22rpx;
      color: #999;
      padding-bottom: 15rpx;
    }
    .body {
      font-size: 28rpx;
      color: #555;
    }
  }
}
</style>