Comments (4)
Yes, functional components are pure, synchronous functions where props go in, and vnodes come out.
For what "simple operation" do you want to use a async functional component,? You haven't provided a use case for your feature request
from rfcs.
My use case is to submit a form to the backend as part of vue router that would route to another page. So I used ChatGPT to convert a template-less component
export default defineComponent({
setup() {
const router = useRouter();
const {
executeRecaptcha,
recaptchaLoaded,
instance: recaptchaInstance,
} = useReCaptcha();
const waitForRecaptcha = () => {
return new Promise<void>(async (resolve, reject) => {
const timeoutId = setTimeout(() => {
reject(new Error("recaptchaLoaded() took longer than 5 seconds"));
}, 5000);
while (true) {
const loaded = await recaptchaLoaded();
if (loaded) {
clearTimeout(timeoutId);
resolve();
break;
}
await new Promise((resolve) => setTimeout(resolve, 100));
}
});
};
onMounted(async () => {
let recaptchaToken: string | null = null;
try {
if (recaptchaInstance) {
await waitForRecaptcha();
recaptchaToken = await executeRecaptcha("submitAssessment");
}
const userProfileStore = useUserProfileStore();
if (recaptchaToken) {
const assessmentPayload: AssessmentPayload = {
assessment: userProfileStore.assessmentToSendToBackend,
recaptchaToken,
};
if (userProfileStore.isRandomized) {
console.info(
"Assessment payload was not sent as it is randomized",
assessmentPayload
);
} else {
await submitAssessment(assessmentPayload);
}
}
} catch (err: unknown) {
console.error(err);
}
router.replace("/report");
});
return {};
},
render: () => null,
});
what I would rather have had was something like this (where I take out some of the boiler plate parts like onMounted, defineComponent etc.
const Submit = async ()=> {
const router = useRouter(); // note this line won't actually work since `useRouter()` does not work in a FunctionalComponent but usePinia does.
const {
executeRecaptcha,
recaptchaLoaded,
instance: recaptchaInstance,
} = useReCaptcha();
const waitForRecaptcha = () => {
return new Promise<void>(async (resolve, reject) => {
const timeoutId = setTimeout(() => {
reject(new Error("recaptchaLoaded() took longer than 5 seconds"));
}, 5000);
while (true) {
const loaded = await recaptchaLoaded();
if (loaded) {
clearTimeout(timeoutId);
resolve();
break;
}
await new Promise((resolve) => setTimeout(resolve, 100));
}
});
};
let recaptchaToken: string | null = null;
try {
if (recaptchaInstance) {
await waitForRecaptcha();
recaptchaToken = await executeRecaptcha("submitAssessment");
}
const userProfileStore = useUserProfileStore();
if (recaptchaToken) {
const assessmentPayload: AssessmentPayload = {
assessment: userProfileStore.assessmentToSendToBackend,
recaptchaToken,
};
if (userProfileStore.isRandomized) {
console.info(
"Assessment payload was not sent as it is randomized",
assessmentPayload
);
} else {
await submitAssessment(assessmentPayload);
}
}
} catch (err: unknown) {
console.error(err);
}
router.replace("/report");
};
Setup.props = []
Setup.emits = []
export default Setup;
from rfcs.
That doesn't look like a component, it looks like a VueRouter Navigation Guard? Is there a reason this could not be a guard?
from rfcs.
If it was a navigation guard then it will be triggered per entry of the /report
which I want to avoid
I could make it a
{
path: '/submit'
beforeEnter: (...)
}
But that means my route configuration would be larger I'd rather simply put components to keep it consistent with the rest of the routes.
{
path: '/submit'
component: Submit
}
from rfcs.
Related Issues (20)
- Adding a .v shortcut for .value HOT 4
- [FEAT] Required slots HOT 1
- Add abstraction for System Modifier Key: ctrl+c on Windows equals cmd+c on macOS HOT 1
- Pure TypeScript props declaration for the Options API, like we have defineProps() for the Composition API? HOT 4
- <script setup> : Make it possible to call defineProps many times HOT 10
- All Transition and TransitionGroup JavaScript hooks should be async
- unReadonly API proposal HOT 2
- Make runtime Props validation optional HOT 5
- Teleport as a composable/function
- An option to generate scoped styles using `:where` HOT 6
- Provide/inject for EffectScope
- Compiler: whitelist `import` global in template HOT 2
- Native CSS Modules
- Add impassive event modifier !passive HOT 2
- Stop script setup from executing any further HOT 1
- Add a '.noinherit' modifier HOT 2
- Feature Request: `$emit` to return a Promise notifying when the event handler has run HOT 5
- Vue SSR app renderToString catch errors/warnings
- [Warnings] Silence Vue warnings in DEV
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from rfcs.