Comments (6)
I don't have a good idea about what's going wrong in your code. I don't think purely accessing the val
property of a State
object would cause an infinity loop. I suspect there could be other parts of the code that cause the infinity loop. I would suggest that you can start with some profiling tool (e.g.: https://developer.chrome.com/docs/devtools/memory-problems/allocation-profiler) to see what's going wrong in the web page.
from van.
@Tao-VanJS From the profile, and some logging, I think that's what's happening. The profiler shows an unending series of the calls setVal
-> derive
-> runAndCaptureDeps
from van.
However, if I move the state and Firebase auth callback outside the component, it works as expected.
AuthGuard
const authenticating = van.state(true);
const authenticated = van.state(false);
auth.onAuthStateChanged((user) => {
console.log(user)
if (user) authenticated.val = true;
else navigate(LOGIN_ROUTE);
authenticating.val = false;
});
export function AuthGuard(child: HTMLElement) {
if (authenticating.val || !authenticated.val) {
return div(
{ className: "w-full h-full grid place-items-center" },
Text({ align: "center" }, "Authenticating. Please wait...")
);
} else return child;
}
App
export default function App() {
return Router({
className: "w-screen h-screen",
routes: [
{ path: HOME_ROUTE, component: () => AuthGuard(HomePage()) },
{ path: LOGIN_ROUTE, component: LoginPage },
{ path: SIGNUP_ROUTE, component: SignupPage }
]
});
}
Currently using version
1.2.7
ofvanjs-core
from van.
Can you try
export function AuthGuard(child: HTMLElement) {
const authenticating = van.state(true);
const authenticated = van.state(false);
auth.onAuthStateChanged((user) => {
if (user) {
authenticated.val = true;
} else navigate(LOGIN_ROUTE);
authenticating.val = false;
});
return () => {
if (authenticating.val || !authenticated.val) {
return div(
{ className: "w-full h-full grid place-items-center" },
Text({ align: "center" }, "Authenticating. Please wait...")
);
} else return child;
}
}
export default function App() {
return Router({
className: "w-screen h-screen",
routes: [
{ path: HOME_ROUTE, component: AuthGuard(HomePage()) },
{ path: LOGIN_ROUTE, component: LoginPage },
{ path: SIGNUP_ROUTE, component: SignupPage }
]
});
}
from van.
Unfortunately, this doesn't work since this calls the AuthGuard
function instead of passing it as the component function to the router...
from van.
https://jsfiddle.net/Sirenko/jv29wexf/55/
Here's an example, + fixed a bug with the garbage collector for the HomePage (if there was reactivity on it, it would not work correctly after switching)
from van.
Related Issues (20)
- TS Typings improvement HOT 4
- expose isProps HOT 2
- Adding TypeScript support VanCone HOT 1
- Deeply nested state objects and arrays HOT 1
- Include comparison to Preact HOT 1
- Refactor Van State to remove prototype to do reactive updates HOT 1
- Introduce some way how to extend state with custom API? HOT 1
- How to get access to DOM elements (like refs in React) HOT 2
- VanJS Router? HOT 5
- State change in setInterval HOT 6
- Reactivity is broken when the context is quickly switched HOT 5
- It doesn't work. Did I do something wrong? HOT 9
- Update Van JSX HOT 5
- Abnormal behavior under the input box. HOT 4
- vanX.list also looping empty values HOT 2
- Add a callback with just created element HOT 2
- Lifecycle event: mount and unmount HOT 1
- Error on when using method for Date data in VanX reactive (and possibly all class instance). HOT 4
- Download table broken HOT 2
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 van.