使用React.createElement时出错

时间:2016-05-01 03:24:57

标签: javascript reactjs react-native jsx

我正在使用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警告:React.createElement:type不能为null,   undefined,boolean或number。它应该是一个字符串(对于DOM   元素)或ReactClass(用于复合组件)。检查渲染   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;

1 个答案:

答案 0 :(得分:1)

我相信绊倒你的是你将组件导出为module.exports = TodoComponent;

这样做更干净:

var TodoItem = require('../lib/components/todo-item');

这样你可以避免使用额外的点符号,并且需要这样。

TodoItem.component

由于你没有这样做,你现在正在处理这个var completedTodoItem = React.cloneElement...事情 - 我认为将它与克隆元素重新分配会导致错误。

相反,只需将其分配给新变量{{1}}

即可