Why do my Next.JS pages not re-run javascript when the page is viewed again? - reactjs

I have a next.js app set up and written entirely in react, currently including the homepage, which is just a temporary placeholder using react components.
The real homepage was delivered to me in the form of a static site with an HTML file and several CSS+JS files. I can't just display the static HTML files right out of the public directory because I need the 'real' React navigation component to be displayed. I converted the HTML files to .js files, chopped off their static nav, and wrapped them in an export default so that I could import them into the appropriate route file in /pages, displaying them using return <div dangerouslySetInnerHTML={{ __html: homepage }} />; which allows my _app.tsx file to wrap it in all the usual stuff that applies the nav to the pages, context, providers, etc etc.
This seems to work great, however when I navigate away to one of my real pages and navigate back to the homepage it doesn't seem to re-run the javascript files the way a regular webpage would. Animations don't start, hero slider images are displayed one under the other, basically as if none of the JS is happening.
Am I approaching this from entirely the wrong angle, or is there just something I'm missing? I would prefer not to convert the HTML file I was given into React components at this time, so priority would be given to whatever solution keeps the original HTML file in its closest form so that the original programmers can update it without hassle. Why is none of my JS re-running?

Related

Multiple Inline stylesheets

enter image description hereI am using React, Typescript and Styled components. Everything looks fine but I am seeing multiple styles tag under my head tag. I would like to know why it is creating multiple styles tag and is there any way to combine all styletags into one.
For example , I am creating a dropdown in a loop and it has 3 values and it generates 3 style tag under my head tag
Thanks all
From what I understand, I believe this is expected behavior assuming you're utilizing style partials for each component. React (and other front end frameworks like Angular) is importing the styles that apply to the current view. It does this by importing them individually as the page renders different views.
This isn't always ideal, though. I often create CSS partials in a global styles folder if I want to share styles across components. The only styles I put in the component specific CSS file are styles that are 100% specific to that component and I don't ever want to share.
You could also always create a shared CSS file that you import once - ie - dropdown.css (or .scss etc if you're using a pre-processor) and delete the react component specific CSS files that you will be replacing with this new global version. The downside being that whatever CSS you have in there will always be imported even if the dropdown isn't being rendered or viewed.

React ignores layout style whenever I navigate to another page

I am building a website using React.
I am using Router from 'react-router-dom' to navigate between pages (urls).
Everything seems to work ok, but if I navigate between pages the layout style sometimes changes. For instance, the workouts page layout seems good and as I want, however, if I navigate from there to Gallery page and back, it looks different. Same goes for other pages.
I am adding a link to my Github page (the updated code is under 'main' branch). Also, you'll find beneath two pictures that demonstrate the different layout of the Workout page.
My Github repository Link.
Notice that sometimes it doesn't change the style, perhaps you will need to register, login, and logout.
Any Help will be appreciated!!
From peeking at your repo, my first guess would be that the problem is your css classes aren't scoped and are overruling each other when you render different components. When you import a css file like you do, it applies the rules globally, so depending on the order of the components you render, the rules are applied to all components in a different order. What you should do is:
Change your CSS file names to include module , for example Workouts.css should be become Workouts.module.css
Make your CSS imports act like a module, for example import styles from '../css/Workouts.module.css'
Change all your classes in the component to be from styles, for example replace <div className="row"> with <div className={styles.row}>
This way, if you have more than one component with the same class name, the rules of the class apply only to this specific component (i.e. scoped css)
That's my guess

Gatsby how to share React header between React components and previously generated static HTML content

I am building a Gatsby site. The site consists of multiple React "page-components", all of which get wrapped in a React header component and a React footer component.
I have some pre-existing static HTML (think things like Privacy Policy &c). I was planning to just publish them in the /public gatsby folder. But then the won't have the React header component and footer component.
How can I publish my static HTML content AND give them the React header/footer?
I imagine that if I "translate" my static HTML to JSX then of course that would work. Just want to understand if that is the only way, the right way, or whether there is an easier way?
You can add the header/footer components into src/layouts/index.js while the page content will be rendered through the <div>{children()}</div> based on the pages you add to src/pages
Gatsby will create the static public files for you at build time (I recommend Netlify). You 'should' be creating react components which means using JSX, either in the pages folder or the components folder. The header is actually already part of the layouts folder so you don't have to do anything on that count.
Based on what I am understanding, if you just create new page files or modify the existing page files to display your content you will get the behaviour you're after. Then it's just a matter of customizing things i.e. the pages and the header content and styles, to your liking.

How to reinitialise init(); in React to allow Adobe Animate SVG file to rerun upon route change?

I have set up a simple react project that has a reusable component called 'cover'. Within the 'cover' component, I have an animated SVG I created from Adobe Animate and have it exported into HTML, JS and SVG. This works fine on first load as the JS is in the public/index.html file and initialised in the tag. However, when I change routes, the init isn't retriggered (which is correct since React isn't meant to reload the page), so now I have the dilemma of not being able to see the SVG upon route changes.
See example here: https://react-sfj7qx.stackblitz.io
Editor version: https://stackblitz.com/edit/react-sfj7qx
Note that the init() function on the tag doesn't seem to render within Stackblitz...
Since I don't know Adobe Animation too much, I edited your stackblitz, I break your code a little bit, but you have all it needs to succeed in this code. What you was not aware of, is that you need to import and export function and variable between files in react. So you'll see how I've done it in the stackblitz example.
Good luck!

Server side rendering with React, would the browser still need to load in React?

If I were to render all of my content for React on the server, would I still need to import React in the browser? I don't plan on using React-Router, and I know React is a bigger file, so it would be nice if I didn't have to load it each time.
You can skip loading React in browser only when you don't need what react gives - extended interaction. Your HTML will work as always. If you have links (a tag) they will work, if you have html form (form tag) with standard submit buttons - it will work as well.
What will not work is all stuff written in react components, like you click on button/div/image... and some state changes.
All things which is not in basic HTML & basic HTML events, won't work.
No matter how you render html on server side if it's react, pure js, php, asp, .net, python or even C. Browser gets HTML and displays it, binds default events, applies default browser styling, then override stuff with your css/js code.
You do need it if you are planning to allow the user to interact with the components or your app, if you are just rendering text without any button or any other interaction, then I guess it would not be required.

Resources