使用 React.createElement 时出错
Error while using React.createElement
我正在使用 reactJS,下面的文件是我稍后使用 browserify 捆绑的客户端代码。
我能够创建诸如复选框输入等元素,但我在为路由器创建元素时遇到问题。
这没关系 -
React.createElement('input', { ref: 'done', type: 'checkbox', defaultChecked: this.state.done, onChange: this.onChange })
我在使用以下代码时遇到问题 -
var React = require('react');
var ReactDOM = require('react-dom');
var TodoItem = require('../lib/components/todo-item');
var Router = require('react-router').Router;
var Route = require('react-router').Route;
var browserHistory = require('react-router').browserHistory;
var renderTarget = document.getElementById('content');
TodoItem.component = React.cloneElement(TodoItem.component, {done: false, name: 'Write Tutorial'});
var TodoItemFactory = React.createFactory(TodoItem.component);
ReactDOM.render(
React.createElement(
Router,
{ history: browserHistory },
React.createElement(Route, {path: "/", component: TodoItemFactory })
),
renderTarget);
在浏览器中 ReactDOM.render ...错误报告为 -
warning.js:45 Warning: React.createElement: type should not be null,
undefined, boolean, or number. It should be a string (for DOM
elements) or a ReactClass (for composite components). Check the render
method of bound
.
供参考 - lib/components/todo-item.js -
'use strict';
var React = require('react');
var TodoComponent = React.createClass({
displayName: 'TodoItem',
/**
* Lifecycle functions
**/
getInitialState: function getInitialState() {
return { done: this.props.done };
},
componentDidMount: function componentDidMount() {},
render: function render() {
return React.createElement(
'label',
null,
React.createElement('input', { ref: 'done', type: 'checkbox', defaultChecked: this.state.done, onChange: this.onChange }),
this.props.name
);
},
/**
* Event handlers
**/
onChange: function onChange(event) {
this.setDone(event.target.checked);
},
/**
* Utilities
**/
setDone: function setDone(done) {
this.setState({ done: !!done });
}
});
module.exports.component = TodoComponent;
我相信让您感到困惑的是您将组件导出为 module.exports.component = TodoComponent
。
这样做更干净:
module.exports = TodoComponent;
这样你就可以避免额外的点符号并像这样要求它。
var TodoItem = require('../lib/components/todo-item');
因为你没有这样做,你现在正在处理这个 TodoItem.component
东西 - 我认为用克隆元素重新分配它会导致错误。
相反,只需将其分配给一个新变量 var completedTodoItem = React.cloneElement...
我正在使用 reactJS,下面的文件是我稍后使用 browserify 捆绑的客户端代码。
我能够创建诸如复选框输入等元素,但我在为路由器创建元素时遇到问题。
这没关系 -
React.createElement('input', { ref: 'done', type: 'checkbox', defaultChecked: this.state.done, onChange: this.onChange })
我在使用以下代码时遇到问题 -
var React = require('react');
var ReactDOM = require('react-dom');
var TodoItem = require('../lib/components/todo-item');
var Router = require('react-router').Router;
var Route = require('react-router').Route;
var browserHistory = require('react-router').browserHistory;
var renderTarget = document.getElementById('content');
TodoItem.component = React.cloneElement(TodoItem.component, {done: false, name: 'Write Tutorial'});
var TodoItemFactory = React.createFactory(TodoItem.component);
ReactDOM.render(
React.createElement(
Router,
{ history: browserHistory },
React.createElement(Route, {path: "/", component: TodoItemFactory })
),
renderTarget);
在浏览器中 ReactDOM.render ...错误报告为 -
warning.js:45 Warning: React.createElement: type should not be null, undefined, boolean, or number. It should be a string (for DOM elements) or a ReactClass (for composite components). Check the render method of
bound
.
供参考 - lib/components/todo-item.js -
'use strict';
var React = require('react');
var TodoComponent = React.createClass({
displayName: 'TodoItem',
/**
* Lifecycle functions
**/
getInitialState: function getInitialState() {
return { done: this.props.done };
},
componentDidMount: function componentDidMount() {},
render: function render() {
return React.createElement(
'label',
null,
React.createElement('input', { ref: 'done', type: 'checkbox', defaultChecked: this.state.done, onChange: this.onChange }),
this.props.name
);
},
/**
* Event handlers
**/
onChange: function onChange(event) {
this.setDone(event.target.checked);
},
/**
* Utilities
**/
setDone: function setDone(done) {
this.setState({ done: !!done });
}
});
module.exports.component = TodoComponent;
我相信让您感到困惑的是您将组件导出为 module.exports.component = TodoComponent
。
这样做更干净:
module.exports = TodoComponent;
这样你就可以避免额外的点符号并像这样要求它。
var TodoItem = require('../lib/components/todo-item');
因为你没有这样做,你现在正在处理这个 TodoItem.component
东西 - 我认为用克隆元素重新分配它会导致错误。
相反,只需将其分配给一个新变量 var completedTodoItem = React.cloneElement...