I have a home.jsp where within body
<body>
<script type="text/babel" src="../resources/scripts/example.js"></script>
<a href="javascript:Comment();">News</a>
</body>
In a separate example.js, I have the following
alert("I am coming here ... BEEP");
var Comment = React.createClass({
loadCommentsFromServer: function() {
$.ajax({
url: this.props.url,
dataType: 'json',
cache: false,
success: function(data) {
this.setState({data: data});
}.bind(this),
error: function(xhr, status, err) {
console.error(this.props.url, status, err.toString());
}.bind(this)
});
},
getInitialState: function() {
return {data: []};
},
componentDidMount: function() {
this.loadCommentsFromServer();
setInterval(this.loadCommentsFromServer, this.props.pollInterval);
},
render: function() {
return (
<div className="comment">
<Comment data={this.state.data} />
<span dangerouslySetInnerHTML={{__html: data}} />
</div>
);
}
});
ReactDOM.render(
<Comment url="/workingUrl" pollInterval={2000} />,
document.getElementById('content')
);
I am getting the following error in Chrome console.
Uncaught TypeError: Failed to construct 'Comment': Please use the 'new'
operator, this DOM object constructor cannot be called as a function.
I have added React js tags in home.jsp file.
How to fix this? Please help me.
Maybe this will help someone who had the same issue as me...I simply forgot to import the component I was trying to render (using ES6):
import { Comment } from './comment'
You cannot call React Component <Comment/>
by Comment()
. The error requests you to create an instance of the Comment
class i.e. something like this var comment = new Comment()
. However, in your problem we do not need this.
<body>
<a href="javascript:RenderComment();">News</a>
<div id="content"> </div>
</body>
Your React Component <Comment/>
should be independent and will be used as an argument to ReactDOM.render(...)
. Hence the Comment
should not have ReactDOM.render(...)
function inside it. Also, the anchor element click must not call Comment()
as it is not a function which does rendering but rather a Class
whose instance
is mounted on the DOM
. On clicking the <a/>
tag, a RenderComment()
should be called which will in turn render the <Comment/>
component.
var RenderComment = function RenderComment() {
ReactDOM.render(React.createElement(
"div", null, " ", Comment, " "
), document.getElementById("content"));
};
Here, we are rendering your <Comment/>
component which you defined using React.createClass
.
var Comment = React.createClass({
// Your component functions and render() method
// No ReactDOM.render() method here
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With