UNPKG

vuetensils

Version:

A 'naked' component library for building accessible, lightweight, on-brand applications.

174 lines (150 loc) 3.14 kB
This component is great for handling any asynchronous tasks that involve promises. For example, HTTP requests: ```vue <template> <VAsync :await="httpRequest"> <template v-slot:resolved="results"> <h3>{{ results.title }}</h3> <p>{{ results.body }}</p> </template> </VAsync> </template> <script> const url = 'https://jsonplaceholder.typicode.com/posts/1'; export default { data: () => ({ httpRequest: fetch(url).then((response) => response.json()), }), }; </script> ``` ## Handle pending states ```vue <template> <VAsync :await="sleep"> <template v-slot:pending> just...a bit...more... </template> <template v-slot:resolved> Ok, we're done </template> </VAsync> </template> <script> export default { data: () => ({ sleep: new Promise((resolve) => setTimeout((resolve), 3000)), }), }; </script> ``` ## Handle rejected errors ```vue <template> <VAsync :await="sleep"> <template v-slot:pending> just...a bit...more... </template> <template v-slot:rejected="error"> {{ error }} </template> </VAsync> </template> <script> export default { data: () => ({ sleep: new Promise((resolve, reject) => setTimeout(() => { reject(new Error('something went wrong')); }, 2000) ), }), }; </script> ``` ## Access full state with default scoped slot ```vue <template> <div> <VAsync :await="sleep"> <template v-slot:default="{ pending, results, error }"> <p v-if="pending">just...a bit...more...</p> <p v-else-if="error">{{ results }}</p> <p v-else="results">{{ results }}</p> </template> </VAsync> </div> </template> <script> export default { data: () => ({ sleep: new Promise((resolve, reject) => setTimeout(() => { resolve('Woop! We\'re done'); }, 2000) ), }), }; </script> ``` ## Dynamically assign promise ```vue <template> <div> <VAsync :await="waitForIt"> <template v-slot:pending> <p>just...a bit...more...</p> </template> <template v-slot:resolved="results"> <p>{{ results }}</p> </template> </VAsync> <button @click="onClick">Call new promise</button> </div> </template> <script> export default { data: () => ({ waitForIt: null, }), methods: { onClick() { this.waitForIt = new Promise(resolve => { setTimeout(() => { resolve('Ok, we\'re done now.'); }, 500); }); }, }, }; </script> ``` ## Call promise using refs ```vue <template> <div> <VAsync ref="async"> <template v-slot:pending> <p>just...a bit...more...</p> </template> <template v-slot:resolved="results"> <p>{{ results }}</p> </template> </VAsync> <button @click="onClick">Call promise</button> </div> </template> <script> export default { methods: { onClick() { const promise = new Promise((resolve) => { setTimeout(() => { resolve('Ok, we\'re done now.'); }, 500); }); this.$refs.async.awaitOn(promise); }, }, }; </script> ```