suspense 部分,图片加载不出来。

来源:3-20 Suspense - 异步请求好帮手第二部分

淡语

2021-05-28

把狗狗的url 换成 猫猫的 url ,仍旧加载不出来。但是下面的猫猫图片能加载出来,所以可能不是猫猫API的问题。那为什么上面那个猫猫图片加载不出来呢?
图片描述

DogShow.vue 组件的代码:

<template>
  <img src="result && result.message">
</template>

<script lang="ts">
import axios from 'axios'
import { defineComponent } from 'vue'

export default defineComponent({
  // 当函数用 async 包裹的时候,函数里面可以采用 wait 方式来操作异步请求,返回结果还会用 Promise 进行自动包裹
  async setup() {
    const rawData = await axios.get('https://dog.ceo/api/breeds/image/random')
    return {
      result: rawData.data
    }
  }
})
</script>

<style>
</style>

App.vue 组件的代码:

<template>
  <img alt="Vue logo"
       src="./assets/logo.png">
  <h1> {{count}} </h1>
  <h1> {{double}} </h1>
  <h1> {{greetings}} </h1>

  <h1> {{error}} </h1>

  <!-- Suspense 的使用 -->
  <Suspense>
    <!-- Suspense 有两个具名插槽 -->
    <template #fallback>
      <!-- 这里展示加载前的内容 -->
      <h1>Loading...</h1>
    </template>
    <template #default>
      <!-- 这里展示加载后的内容 -->
      <div>
        <async-show />
        <dog-show />
      </div>
    </template>
  </Suspense>

  <!-- Teleport 的使用 -->
  <button @click="openModal"> Open Modal </button>
  <modal :isOpen="modalIsOpen"
         @close-modal="onModalClose"> My modal! </modal>

  <h1 v-if="loading">Loading!...</h1>
  <img v-if="loaded"
       :src="result[0].url">
  <h1> X: {{x}}, Y: {{y}} </h1>
  <button @click="increase"> 👍+1 </button>
  <button @click="updateGreeting"> Update Title </button>
</template>

<script lang="ts">
import {
  defineComponent,
  ref,
  computed,
  reactive,
  toRefs,
  watch,
  onErrorCaptured
} from 'vue'
import useMousePosition from './hooks/useMousePosition'
import Modal from './components/Modal.vue'
import useURLLoader from './hooks/useURLLoader'
import AsyncShow from './components/AsyncShow.vue'
import DogShow from './components/DogShow.vue'

interface DataProps {
  count: number
  double: number
  increase: () => void
}

interface DogResult {
  message: string
  status: string
}

interface CatResult {
  id: string
  url: string
  width: number
  height: number
}

export default defineComponent({
  components: { Modal, AsyncShow, DogShow },

  name: 'App',
  setup() {
    const error = ref(null)
    // 因为我们不知道error具体是什么类型,所以设置为 any 类型
    onErrorCaptured((e: any) => {
      error.value = e
      // 这个钩子函数要返回一个布尔值,表示这个错误是否向上传播
      return true
    })
    const data: DataProps = reactive({
      count: 0,
      increase: () => {
        data.count++
      },
      double: computed(() => data.count * 2)
    })
    const { x, y } = useMousePosition()
    // const { result, loading, loaded } = useURLLoader<DogResult>(
    //   'https://dog.ceo/api/breeds/image/random'
    // )
    const { result, loading, loaded } = useURLLoader<CatResult[]>(
      'https://api.thecatapi.com/v1/images/search'
    )
    watch(result, () => {
      // console.log(result.value.message)
      // type guard
      if (result.value) {
        // console.log('value', result.value.message)
        console.log('value', result.value[0].url)
      }
    })

    const greetings = ref('')
    const updateGreeting = () => {
      greetings.value += 'Hello!'
    }
    watch([greetings, () => data.count], (newValue, oldValue) => {
      console.log(newValue)
      console.log(oldValue)
      document.title = 'updated' + greetings.value
    })
    const refData = toRefs(data)

    const modalIsOpen = ref(false)
    const openModal = () => {
      modalIsOpen.value = true
    }
    const onModalClose = () => {
      modalIsOpen.value = false
    }
    return {
      ...refData, // 展开后为 count, increase, double
      greetings,
      updateGreeting,
      x,
      y,
      result,
      loading,
      loaded,

      modalIsOpen,
      openModal,
      onModalClose,

      error
    }
  }
})
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

写回答

2回答

张轩

2021-05-31

同学你好 你 DogShow 的 src 属性写错了,你写成了直接字符串,没有绑定变量~

DogShow.vue 第二行 应该为
<img :src="result && result.message">


0
2
张轩
回复
淡语
是要提升一下 慢慢来 其实你只要检查这个img 元素的 src 就可以看出端倪 会发现它是一个错误的字符串
2021-05-31
共2条回复

张轩

2021-05-29

同学你好 可否把代码给我看下 有代码就会方便很多 或者你可以尝试去看一下显示不出来的那张图片的 url,看看他到底是什么?应该根本就不是一张图片地址

0
3
淡语
是提供这个吗?https://git.imooc.com/Einzibelun/vue3-basic-note.git
2021-05-31
共3条回复

Vue3 + TS 仿知乎专栏企业级项目

带你完成前后端分离复杂项目,率先掌握 vue3 造轮子技能

3166 学习 · 2346 问题

查看课程