开发者问题收集

未捕获的类型错误:无法读取未定义反应状态项的属性“toUpperCase”

2015-06-04
64729

我是 React 和 Javascript 的新手,我正在尝试呈现以下 React 组件:

'use strict';
var React = require('react');
import ToReadList from './toreadlist.js';

var ToRead = React.createClass({
getInitialState: function() {
    return { bookTitles: [] };
},
handleSubmit: function(e) {
    e.preventDefault();
    this.state.bookTitles.push(React.findDOMNode(this.refs.bookTitleInput).value.trim());
    this.setState({items: this.state.bookTitles});
},
render: function() {
    return (<div>
        <form onSubmit={this.handleSubmit}><input type="text" ref="bookTitleInput"></input>
            <input type="submit"></input></form>
            <ToReadList bookTitles={this.state.bookTitles} />
    </div>
           );
}
});

module.exports = ToRead;

但是我的控制台上出现以下错误:“ Uncaught TypeError:无法读取未定义的属性‘toUpperCase’

我尝试调试(因为错误对我来说很模糊并且我的代码中没有指示任何行)并注意到这一行:

this.state.bookTitles.push()

导致错误。

请帮忙!

编辑 错误是由 webpack var 注入函数引起的:

function autoGenerateWrapperClass(type) {
      return ReactClass.createClass({
        tagName: type.toUpperCase(),
        render: function() {
          return new ReactElement(
            type,
            null,
            null,
            null,
            null,
            this.props
          );
        }
      });
    }
3个回答

findDOMNode() 使用 toUpperCase() 函数,而该函数实际上是在 null 上调用的。

示例

var x = null
x.toUpperCase()// results in this error.

如果您可以发布 findDOMNode() 代码,我们就可以找出错误。

确保在 非 null 对象 上调用 toUpperCase()

Uma Kanth
2015-06-04

对于这篇文章的质量不佳,我深表歉意。

我解决了这个问题。

最后,问题来自所包含的组件:

<ToReadList bookTitles={this.state.bookTitles} />

在调用 this.state.bookTitles.push(React.findDOMNode(this.refs.bookTitleInput).value.trim()); 时出现错误,因为 bookTitles 在组件不为空时会触发组件内部的错误(即 <ToReadList bookTitles={["mastery", "foundation"]} /> 会触发完全相同的错误)

有问题的组件代码如下:

'use strict';
var React = require('react');
import {ToReadListItem} from './todoreadlistitem.js';

var ToReadList = React.createClass({
    render: function() {
        return (<ul>
            {this.props.bookTitles.map(function(bookTitle){ 
                return (<li>
                    <ToReadListItem bookTitle={bookTitle} isChecked={false}/>
                </li>);
            })}
        </ul>);
    }

});

module.exports = ToReadList;

更改此行:

import {ToReadListItem} from './todoreadlistitem.js';

这个:

import ToReadListItem from './todoreadlistitem.js';

我知道,将 es6 语法与平面语法混合不是一个好主意,但我允许自己这样做,因为该应用程序用于实验目的。

我希望我能够帮助让事情变得更清楚。

Mayas
2015-06-04

我猜问题出在你尝试直接修改状态。试试这个:

var newBookTitles = this.state.bookTitles;
var value = React.findDOMNode(this.refs.bookTitleInput).value.trim();
newBookTitles.push(value);
 this.setState({bookTitles: newBookTitles});

我希望它能解决你的问题。

Phi Nguyen
2015-06-04