<template>
<NSpace vertical>
<span>Switch button to mock success request or error request</span>
<NSpace justify="space-between">
<NRadioGroup v-model:value="isErrorRequest">
<NRadioButton key="error" :value="1"> Error </NRadioButton>
<NRadioButton key="success" :value="0"> Success </NRadioButton>
</NRadioGroup>
<NButton type="primary" @click="handleClick"> Run </NButton>
</NSpace>
<NSpin :show="loading">
<NAlert :type="hasError ? 'error' : 'success'">
<span v-if="hasError">
{{ `${6 - errorCount} retries left` }}
<span v-if="needRetry">, waiting for retry </span>
</span>
<span v-else>
{{ data }}
</span>
</NAlert>
</NSpin>
</NSpace>
</template>
<script lang="ts">
import {
createDiscreteApi,
NAlert,
NButton,
NRadioButton,
NRadioGroup,
NSpace,
NSpin,
} from 'naive-ui';
import { computed, defineComponent, ref, watch } from 'vue';
import { useRequest } from 'vue-request';
let error = true;
function testService() {
return new Promise<string>((resolve, reject) => {
if (error) {
setTimeout(() => {
reject('Request failed');
}, 2000);
} else {
setTimeout(() => {
resolve('✿✿ヽ(°▽°)ノ✿ Successfuly');
}, 1000);
}
});
}
export default defineComponent({
name: 'App',
components: {
NRadioGroup,
NRadioButton,
NButton,
NSpace,
NSpin,
NAlert,
},
setup() {
const errorCount = ref(0);
const isErrorRequest = ref(1);
const { message } = createDiscreteApi(['message']);
const {
data,
error: hasError,
loading,
run,
} = useRequest(testService, {
errorRetryCount: 5,
initialData: 'init',
onError: () => {
message.error('(⊙︿⊙) something error');
errorCount.value++;
},
onSuccess: () => {
message.success('✿✿ヽ(°▽°)ノ✿ success');
errorCount.value = 0;
},
});
const handleClick = () => {
errorCount.value = 0;
run();
};
watch(isErrorRequest, val => {
error = Boolean(val);
});
return {
handleClick,
needRetry: computed(() => errorCount.value !== 0 && errorCount.value < 6),
isErrorRequest,
errorCount,
loading,
data,
hasError,
};
},
});
</script>
<style scoped lang="scss"></style>