데이터가 Vue.js에 로드될 때까지 '찾을 수 없음' 오류를 지연시키는 방법
이 루트를 : ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」http://site.dev/person/1
제 컴포넌트는 다음과 같습니다.
// PeopleComponent.vue
<template>
<div>
<template v-if="person == null">
<b>Error, person does not exist.</b>
</template>
<template v-else>
<pre> {{ person }} </pre>
</template>
</div>
</template>
<script>
export default {
mounted() {
this.$store.dispatch('getPeople');
}
computed: {
// represents the person whose id potentially matches the value of `/:id` in route.
person(){
let id = parseInt(this.$route.params.id)
let person = null
if(id > 0)
person = this.$store.state.people.find(p => p.id == id)
return person;
}
}
}
</script>
// [styles]
이 컴포넌트에서 수행하는 작업:
.ID는 이 페이지에 표시되는 특정 리소스를 나타냅니다.는 나나 a a a가 있다
person()
vuex 스토어에서 URL의 매개 변수와 일치하는 ID를 가진 개체를 검색하는 계산된 속성입니다.
바람직한 결과:
페이지 상단에 오브젝트를 찾을 수 없는 경우(예를 들어 스토어의 오브젝트 배열에 존재하지 않는 ID를 입력하는 경우) 에러 메시지를 표시하고 싶습니다.아이템이 발견되면 오브젝트의 단순한 덤프만으로 충분합니다.현재 이 방법은 작동하지만 API에서 데이터를 가져오고 스토어에서 적절한 개체를 찾을 때까지의 지연은 페이지가 처음 로드되었을 때 개체를 찾을 수 없었던 것처럼 잠깐 오류 메시지를 표시하기에 충분합니다. 네트워크 속도가 느린 상태에서 테스트하면 이 오류 메시지가 몇 초간 표시됩니다. 오브젝트가 존재해도 전혀 나타나지 않도록 삭제하고 싶다.
내가 시도한 것:
v-cloak
- div, - "div"에도div#app
을 사용하다★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★v-if
- - '예'로 지정됩니다
조언해주시면 감사하겠습니다!
업데이트: 2020년 3월 31일
필의 제안대로, 나는 페이지가 언제 준비되었는지 나타내는 플래그를 삽입하려고 했다.나는 두 가지 다른 방법으로 그것을 했다.
방법 #1 작성 방법mounted()
와 'c'를 했습니다.people
해 보겠습니다.합니다.
async mounted() {
await this.$store.dispatch('getPeople');
this.loaded = true;
}
하지만 에러 메세지가 잠깐 표시됩니다.
방법 #2
사용하다then
를 「콜백」으로 합니다.true
내부
mounted() {
let vm = this
vm.$store.dispatch('getPeople').then(() => {
vm.loaded = true;
})
}
두 방법 모두 메시지 표시를 중지하지 않습니다.
이런 일이 일어나고 있는 것 같습니다.
핵심 규칙
는 에러, 에러일 에만 표시되어야 합니다.
loaded=true
★★★★★★★★★★★★★★★★★」person=null
- 로드, 「」, 「」,
loaded
false
★★★★★★★★★★★★★★★★★」person
null
에러는 표시되지 않습니다. - 페이지는 API에서 사람들을 불러오기 위해 호출을 합니다.에러는 아직 표시되지 않는다.
- 이 끝나면, 「 。
loaded
설정되었습니다.true
에서]loaded
true
★★★★★★★★★★★★★★★★★」person
아직 계산 속성에 의해 해결되지 않았습니다.여기서 에러가 발생하고 있다고 생각합니다.] - 계산된 속성은 다음 눈금에 저장소에서 관련 레코드를 찾습니다.
Person
더 이상 아니다null
에러가 사라집니다.
2020년 01월 04일 편집
필의 질문에 대답:What does your getPeople() action look like?
getPeople({ commit }) {
axios.get('/get/people')
.then(response => {
commit("getPeople", response.data);
})
.catch(error => {
console.log(error);
})
},
상태 조각이 하나 더 필요한 것 같습니다. 예를 들어 로딩이 필요합니다.
변경하다getPeople
구성 가능한 동작(Axios 반환)Promise
비동기 태스크가 완료될 때까지 기다립니다.
getPeople ({ commit }) {
// make sure you return the promise
return axios.get('/get/people').then(response => {
commit("getPeople", response.data)
}).catch(error => {
console.error(error)
// also make sure you don't accidentally convert this to a successful response
return Promise.reject(error)
})
},
그럼 이런 거 해 봐
export default {
data: () => ({ loading: true }),
async created () {
// "created" fires earlier than "mounted"
await this.$store.dispatch('getPeople')
this.loading = false
},
computed: {
// etc
}
}
이제 사용할 수 있습니다.loading
템플릿 내
<div v-if="loading">Loading...</div>
<div v-else>
<!-- your "person" template stuff goes here -->
</div>
메모
비록 이것이 저의 초기 해결책이었지만, 필의 답변이 문제를 가장 잘 설명하고 더 적절한 해결책을 제시해 주는 것 같습니다.따라서 로더를 계속 사용하고 있지만 타이머를 설정하는 대신 Promise를 기다립니다.
결국 나는 그 사이트에 정보가 검색될 때까지 무기한의 시간을 기다려 달라고 요청하고 있다는 것을 깨달았다.그때 무슨 일이 일어나야 해요.이 작업은 즉시 수행될 수 없기 때문에 "자원이 검색되기 전에 무엇을 표시해야 합니까?"라고 자문해야 했습니다.스피너를 넣었어요.
하지만 문제는 "불확실한" 부분입니다.스피너를 얼마나 오래 표시해야 할지 몰라서 글로벌하게 설정했습니다.timeout
변수.
그렇게
1) 타임아웃에 도달하지 않고 리소스가 비어 있는 경우 디스플레이 로더
2) 리소스가 로드된 경우 리소스를 표시합니다.
3) 리소스가 비어 있고 타임아웃에 도달한 경우 오류 메시지를 표시합니다.
저는 이것이 해결책으로 만족합니다.
Vue-progressbar를 사용했을 때와 같은 문제가 있었습니다.여기는 링크입니다.
http://hilongjw.github.io/vue-progressbar/index.html
도움이 필요하시면 말씀해주세요.
언급URL : https://stackoverflow.com/questions/60923431/how-to-delay-not-found-error-until-data-has-loaded-in-vue-js
'programing' 카테고리의 다른 글
C 및 C++ : 자동구조 부분 초기화 (0) | 2022.08.23 |
---|---|
getter에서 rootState를 가져올 수 없습니다. (0) | 2022.08.23 |
vue.js를 사용한 스프링 스톰프 웹소켓 (0) | 2022.08.23 |
C에서 함수 프로토타입을 선언해야 합니까? (0) | 2022.08.23 |
Vuex 저장소에서 초기 로컬 데이터를 설정하여 "변환 안 함" 오류가 발생함 (0) | 2022.08.23 |