Comments (3)
Normally, you'd ask this question in the clojurescript google group. It isn't reagent specific.
Before discussing which of the two is better, note that there is a third variation: don't wrap the render-component
in a function. Just have this code at the bottom of your core.cljs
:
(reagent/render-component [todo-app] (.-body js/document))
Now, there's no longer any need to call run
. When the javascript is loaded, the render-component
will execute.
So now to answer your question about calling the kickoff function: most of the time this is a matter of personal taste, but there is one case where you MUST use an onload
variation. That's when you are using :optimizations :none
(in the cljsbuild section, within project.clj).
In that case, the HTML would need to include a goog.require
:
<script type="text/javascript" src="target/client.js"></script>
<script type="text/javascript">
goog.require('todomvc"); ;; <---- triggers a cascade of <script> to be added to the page
todomvc.run(); ;; fails because the code is not loaded yet (<scripts> are still loading async)
</script>
To work around this failure, you have to wait for the whole page to load before you call run()
. Perhaps you cheat like this:
<script type="text/javascript" src="target/client.js"></script>
<script type="text/javascript">
goog.require('todomvc"); ;; <---- triggers a cascade of <script> to be added to the page
function run() {
todomvc.run();
}
window.addEventListener('load', run); ;; you can't reference todomvc.run directly, because the code isn't laoded.
</script>
Or use the approach in chord where the onload
is burried in the code.
Personally, I like to see the kickoff function called in the HTML.
from reagent.
I consider using directly
(reagent/render-component [todo-app] (.-body js/document))
to be quite dangerous, unless you know for sure that you'll always render to the body.
I myself like to render into inner DIVs, which means that I must call the rendering function after the DIVs themselves are loaded. This is most easily done with the onload
function.
Using todomvc.run();
has the advantage of giving you more control. Because of the way cljs works, you might end up with a single js file for multiple webpage. By calling the functions individually, you can decide which ones are going to be executed on a given page.
In summary:
- Single page app: use
onload
; - Multiple webpage: use
todomvc.run()
for precise control;
from reagent.
Thank you very much, both. @mike-thompson-day8 You're right; I should have asked this on a ClojureScript forum instead. I've not seen this approach anywhere else though.
from reagent.
Related Issues (20)
- Bad react key warning when using false as key
- examples/material-ui not work HOT 1
- examples/material-ui not work HOT 1
- Docs on โChanged?โ inaccurate? HOT 5
- React 18 does not live reload with Shadow-CLJS in non-trivial projects HOT 5
- Prop types
- `TypeError` when using function components with `r/create-class` with `dom.server/render-to-string`
- ReactDOM.render is no longer supported in React 18. Use createRoot instead. HOT 2
- shadow-cljs emits a warning when using with-let HOT 4
- Korean input broken on :input and :textarea HOT 1
- Update docs? HOT 1
- MUI ThemeProvider not working HOT 1
- @@ -62,6 +62,45 @@ class _Config { } } // eslint-disable-next-line valid-jsdoc /** * fetch problem title, level via solved.ac api * @see {@link https://solvedac.github.io/unofficial-documentation/#/operations/getProblemByIdArray} * @param {string[]} pids - list of problem id (up to 100) * @param { ({ problemId, titleKo, level }) => void } callback */ function fetchProblemsFromSolvedAc(pids, callback) { const query = encodeURIComponent(pids.join(',')); console.log(`https://solved.ac/api/v3/problem/lookup?problemIds=${query}`); fetch(`https://solved.ac/api/v3/problem/lookup?problemIds=${query}`) .then((res) => { console.log('fetchProblemsFromSolvedAc', res); return res; }) .then((res) => res.json()) .then(callback) .catch(() => callback(null)); }
- Readme says npm i or add deps to .edn but (in my case at least) needed both HOT 1
- Any interest in being able to replace `react/createElement` with a custom function? HOT 7
- The cursor disappears at the end of a controlled input on Chrome
- Reusable components following HTML semantics of Opional Attributes and Variadic Children HOT 3
- Controlled input loses cursor under ShadowRoot in React 18 HOT 3
- snake_case mentioned instead kebab-case in documentation of create-class function.
- Class name composition is harder than it needs to be
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 reagent.