published on

vuetest

这是个人的一点小笔记,记录在学习vue的过程中解决的的一些小需求


目标:在一个页面的父组件中发请求,请求API中数据分别返回到两个子组件

假设我们请求的第一个API是一个包含多个对象的数组,其中每一个对象包含如下评论信息

  {    
    "id": 1244, 
    "likes": 0 ,
    "liked": false, 
    "user_name": "学而2016",
    "body": "比较轻松,期末小组做ppt"
  }

我们将从这个API中获取每一个对象的body信息并将其显示在页面上

1.首先,我们创建一个part1.vue,这是第一个子组件的页面,在每一个vue组件的页面中,应该有template标签,里面包含页面上显示的内容,有style标签,控制页面的具体样式,有script标签,包含我们对页面上内容的操作。由于我们此次请求信息返回的是一个数组对象,所以我决定在数组中将其以列表的形式展示出来,在template中代码如下

<template>
    <ul id="app1">
      <li v-for = "item in list" >
       {{ item.body }}
      </li>
    </ul>
  </template>

对了,还没有解释,其中的item是我为返回的数组取的名字,这一步是在在script标签中进行的

<script>
  export default {
    data() {
      return {
        list:[]
      }
    }
  }
</script>

关于页面的具体样式这里不做赘述,可自行设定,需要提醒的一点是,若用sass来写的话,应该在style标签内加入lang=‘sass’属性

2.接下来是第二个子组件part2.vue,其格式和part1.vue差不多,不过这个组件里我只想显示API返回的数组中第一个对象中的”user_name”和”id”属性,在此设第一个对象为obj,想重点提醒一下的是这两个属性在显示时要被包含在一个div中,因为一个组件中只能有一个并行的div,template中的代码如下

<template>
  <div>
    <div>
      {{ obj.user_name }}
    </div>
    <div>
      {{ obj.id }}
    </div>
  </div>
</template>

3.好了,接下来就是我们的重头戏父组件了,parent.vue
首先上代码

<template>
    <div>
      <div v-show="isLoading">
        加载中
      </div>
      <courseInfo ref="courseInfo"></courseInfo>
      <courseComment ref="comment"></courseComment>
    </div>
</template>

<script>
  import part1 from './part1'//把子组件和fecth方法import进来
  import part2 from './part2'
  import 'whatwg-fetch';

  export default {
    data() {
      return {
        isLoading:true
      }
    },
  	mounted () {
  		let promise1 = fetch("请求的API的相对路径").then( (res) => {
        return res.json()
      })
      let promise2 = fetch("请求的API的相对路径")
      .then( (res) => {
        return res.json()
      })
      Promise.all([promise1, promise2]).then( values => {
        //console.log(this.$refs.courseInfo.obj)
        this.$refs.courseInfo.list= values[1]
        this.$refs.comment.obj = values[0]
        this.isLoading = false
      })
    },
    components:{
      "courseInfo":part1,
      "courseComment":part2
    }
  }
</script>
 

接下来是几点要注意的地方:

a.由于我们这里还会使用fetch方法请求API所以还要先npm装一下fetch(如果只是在最新版的chrome中就不必如此),具体方法见fetch

b.data里面我们定义了一个isloding的值,是为了在浏览器还没有请求到数据之前先显示一个加载中的文字or信息提示一下,这个提示页面会一直存在直到所有的信息请求完毕,然后我们把isloading的值改为false转而显示页面应该显示的信息

c.然后开始请求API,由于返回的是数据流,所以用res.json() 把它转换成对象,用promise.all方法对相应的对象进行赋值操作,这里使用了v-ref子组件指定一个索引 ID,这样可以直接访问子组件,详见vue组件

d.重点强调一下promise.all是等待其参数全部请求成功返回后才会进行下一步的操作,这就正好满足我们希望两个promise成功就拿掉loading页面转而显示请求到的信息这一要求,我们将会在promise.all后的then中将isloading的值改为false

e.最后不要忘记了在component中注册一下子组件哦,这样才能在相应的template中用标签形式引入。