Reputation: 4176
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.
Upvotes: 15
Views: 54377
Reputation: 3121
Maybe this will help someone who had the same issue as me...I simply forgot to import the component I was trying to render:
import { Comment } from './comment'
Upvotes: 46
Reputation: 56
Agreed By above answer of Troy Carlson. I faced similar issue in React native project. I have used few built in component(React native) inside but didn't import it. After correctly importing all, error was gone
import {
FlatList,
SafeAreaView,
Text,
View,
...
} from "react-native";
Upvotes: 1
Reputation: 5143
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
}
Upvotes: 10