分享Vue3中通过axios获取后端数据遇到的坑

Vue3学习随笔之利用axios获取后端数据

起初我是这样写的:

<template>
  <table cellspacing="0px" cellpadding="10px">
    <tr>
      <td>booId</td>
      <td>bookName</td>
      <td>bookPrice</td>
      <td>bookAuthor</td>
      <td>publishTime</td>
    </tr>
    <tr v-for="book in books" :key="book.bookId">
      <td>{{ book.bookId }}</td>
      <td>{{ book.bookName }}</td>
      <td>{{ book.bookPrice }}</td>
      <td>{{ book.bookAuthor }}</td>
      <td>{{ book.publishTime }}</td>
    </tr>
  </table>
</template>

<script>
import axios from 'axios'
import { onMounted, reactive } from 'vue'
export default {
  name: "getBooks",
  setup() {
    let books = reactive([]);
    onMounted(() => {
      axios.get('http://localhost:8000/.../book/getBooks')
        .then(response => {
          books = response.data
          console.log(response.data)
        })
        .catch(error => {
          console.log(error)
        })
    })
    return { books, onMounted }
  }
}
</script>

我从后端获取的数据是如下的一段对象数组:
在这里插入图片描述
因此我可以定义一个响应式空数组,然后将从后端获取到的数据的data部分(response.data)传给数组,这样再通过onMounted钩子进行页面渲染。整个流程看起来貌似没什么问题,但是在我进入页面后却发现页面并没有被渲染。。。唉真让人头大。
在这里插入图片描述
中间我想过是不是因为钩子函数没有渲染到的原因,所以我又试了 onBeforeMount 钩子,然而发现并没卵用。最后我打开Vue开发者工具查看发现books仍是一个空数组,可是控制台确实能获取到数据啊,唉头又大了。
在这里插入图片描述
在这里插入图片描述
后来上网查了相关资料后才发现原来books经过被重新赋值后失去了响应式的特性,我又纳闷了,但是经过修改代码后发现确实是这种原因。。。

修改部分如下:

onMounted(() =>{
  axios.get('http://localhost:8000/.../book/getBooks')
    .then(response => {
      books.push(...response.data);
      console.log(response.data)
    })
    .catch(error => {
      console.log(error)
  	})
})

页面也正常显示了:
在这里插入图片描述
当然也有其他解决办法,我这里是直接用了数组的push方法,还可以将reactive改为ref同样可以。

就像这样:

let books = ref([])
books.value = response.data

还可以这样:

let books = reactive({
	list: []
})
books.list = response.data

但注意这时候就要把插值格式也改了,不然也没有值哦

至于为什么这样,原因就是:reactive声明的响应式对象被books代理 ,操作代理对象需要有代理对象的前缀,直接覆盖会丢失响应式

  • 15
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值