I want to use JSX syntax on render, but it is not recognized if I try to use it on .js
file.
It does render using object notation though.
Using this:
html:
<!DOCTYPE html>
<html>
<head>
<style media="screen">
.demo {
border: 1px solid #ccc;
margin: 1em;
padding: 1em;
}
</style>
<meta charset="UTF-8">
<script src="https://unpkg.com/react@latest/dist/react.js" crossorigin="anonymous"></script>
<script src="https://unpkg.com/react-dom@latest/dist/react-dom.js" crossorigin="anonymous"></script>
<script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js" crossorigin="anonymous"></script>
</head>
<body>
<div id="js"></div>
<div id="react"></div>
<div id="react2"></div>
<script type="text/javascript" src="react-demo.js"></script>
</body>
</html>
Now react-demo.js file:
(function(){
"use strict";
/* global React ReactDOM*/
const render = () => {
const jsContainer = document.getElementById("js");
jsContainer.innerHTML = `
<div class="demo">
Hello JS
<input>
<p>${new Date()}</p>
</div>
`;
const reactContainer = document.getElementById("react");
ReactDOM.render(
React.createElement(
"div",
{ className: "demo" },
"Hello React",
React.createElement('input'),
React.createElement('p', null, new Date().toString())
),
reactContainer
);
ReactDOM.render(<p>Hello Here</p>, document.getElementById('react2'))
}
setInterval(render, 1000)
})();
When I run it, I get this error:
Uncaught SyntaxError: Unexpected token <
And it points to this line: ReactDOM.render(<p>Hello Here</p>, document.getElementById('react2'))
Now I read I need to change script type to text/babel
. But doing that gives me this error:
XMLHttpRequest cannot load file:///home/oerp/js-programs/react-demo/react-demo.js. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.
But I'm merely loading local file. Why does it work that way with babel type?
Though I was able to use JSX syntax directly on html like:
<script type="text/babel">
ReactDOM.render(
<h1>Hello, world!</h1>,
document.getElementById('react2')
);
</script>
But I do want to put rendering on js
file, not on html
file.