问题一:我用reactive改写后运行正确,但是想请老师帮忙看下代码逻辑是否有什么问题
问题二:在template模板里引用data时,为什么data里的属性会从 toRefs 转成了 ref ?
import { reactive, ref, toRefs } from 'vue'
import axios from 'axios'
function useURLLoader (url: string) {
// const result = ref(null)
// const loading = ref(true)
// const loaded = ref(false)
// const error = ref(null)
const reData = reactive({
result: null,
loading: true,
loaded: false,
error: null
})
axios.get(url).then((rawData) => {
// loading.value = false
// loaded.value = true
// result.value = rawData.data
reData.loading = false
reData.loaded = true
reData.result = rawData.data
}).catch(e => {
reData.error = e
reData.loading = false
})
const data = toRefs(reData)
return { data }
}
export default useURLLoader
<template>
<img alt="Vue logo" src="./assets/logo.png">
Hello
<h1 v-if="data.loading.value">Loading......</h1>
<img v-if="data.loaded.value" :src="data.result.value.message">
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import useURLLoader from './hooks/useURLLoader'
// import HelloWorld from './components/HelloWorld.vue';
export default defineComponent({
name: 'App',
// components: {
// HelloWorld
// }
setup() {
const { data } = useURLLoader('https://dog.ceo/api/breeds/image/random')
return { data }
}
});
</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>