问题描述
我有一个嵌套的React组件。
一个userList
,其中包含userRow
的列表,并让我添加新的userRow
。
当我在chrome中加载此页面时,可以在chrome的React开发工具中看到组件,但是在DOM中什么都看不到。
另一方面,当我在firefox中加载此页面时,我可以看到userRow
元素(这些元素未呈现为html,但仍在DOM中呈现为<userRow>
。在firefox或chrome userRow
不到任何呈现的userRow
。
为什么会这样? 以及如何使它真正呈现?
userList:
render: function() {
var users = this.state.users;
var usersList = [];
for (var i = 0; users.value !== undefined && i < users.value.length; i++) {
usersList.push(<userRow userName={users.value[i].userName} socket={socket} userId={users.value[i].userId}/>);
}
var window =
<div>
<input type="text" id="userNameBox" ref="userNameBox"></input>
<input type="button" onClick={this._addNewUser} value="add user" id="add"/>
{usersList}
</div>;
return (window);
}
userRow:
'use strict';
var React = require('react');
var userRow = React.createClass({
displayName: 'userRow',
propTypes: {},
mixins: [],
getDefaultProps: function() {
return ({
userId: 0,
userName: '',
socket: null
});
},
componentWillMount: function() {
this.setState({
userId: this.props.userId,
userName: this.props.userName,
socket: this.props.socket
});
},
//componentDidMount: function() {
// socket = io.connect();
// socket.on('messageList', function(messages) {
// this.setState({
// messages: messages
// });
// }.bind(this));
//},
getInitialState: function() {
return ({
userId: 0,
userName: '',
socket: null
});
},
_deleteUser: function(){
var socket = this.state.socket;
socket.emit('deleteUser', {userId: this.state.userId});
},
render: function() {
return(
<div>
<span>{this.state.userName}</span>
<input type="button" onClick={this._deleteUser} value="delete user" id="deleteUserButton"/>
</div>
);
}
});
module.exports = userRow;
1楼
noveyak
2
已采纳
2015-07-25 21:37:23
我认为React希望您的班级名称以大写字母开头。
React可以呈现HTML标签(字符串)或React组件(类)。
要呈现HTML标签,只需在JSX中使用小写标签名称:
要渲染React组件,只需创建一个以大写字母开头的局部变量:
所以在你的代码中
var userRow = React.createClass
应该
var UserRow = React.createClass
和
for (var i = 0; users.value !== undefined && i < users.value.length; i++) {
usersList.push(<UserRow userName={users.value[i].userName} socket={socket} userId={users.value[i].userId}/>);
}
最后,我将避免分配给var窗口并选择其他单词,因为该单词在javascript中已经具有含义。