重新渲染一个ReactJS组件会挂起浏览器
Re-rendering a ReactJS component hangs browser
我一直在尝试使用ReactJS创建一个基于组件的UI,而不是我通常使用的一百万全局函数、变量和不可重用标记的草率方法。到目前为止,我真的很喜欢React,但我遇到了一个绊脚石。
考虑下面的组件布局
EventView
EventViewSidebar
EventViewList
EventViewListRow
EventViewDetail
在此布局中,每个唯一键都出现多次EventViewListRow
。单击EventViewListRow
的一个实例应该会用该项目的详细信息更新EventViewDetail
。
这是顶级EventView
组件的render
函数:
render: function () {
return (
<div className="event-view row-fluid">
<div className="event-view__sidebar col-md-4">
<EventViewSidebar projectId={this.state.projectId} />
</div>
<div className="event-view__content col-md-8" id="eventDetail">
</div>
</div>
);
}
这是EventViewDetail
组件
var EventViewDetail = React.createClass({
getInitialState: function () {
return { eventId: 0 };
},
render: function () {
if (this.state.eventId === 0) {
return (<h3>Nothing selected</h3>);
}
else {
return (
<div>
{this.state.eventId}
</div>
);
}
}
});
为了在单击EventViewListRow
时更新EventViewDetail
,我在EventViewListRow
中定义了以下事件处理程序handleClick: function (event) {
event.preventDefault();
React.render(
React.createElement(EventViewDetail, { eventId: this.props.id }),
document.getElementById("eventDetail")
).setState({ eventId: this.props.id });
},
这一切似乎都工作得很好(除了上面的setState
调用,我不得不添加否则点击不同的EventViewListRow
似乎没有任何效果-毫无疑问,这是我的第一个问题)。实际的关键问题是,如果我将默认html添加到EventView
中定义的eventDetail
div中,那么当我单击EventViewListRow
中的链接时,控制台将显示以下消息,并且浏览器挂起。
警告:React试图在容器中重用标记,但校验和无效。这通常意味着您使用的是服务器呈现,而在服务器上生成的标记并不是客户机所期望的。React注入了新的标记来弥补它的工作,但你已经失去了许多服务器渲染的好处。相反,要弄清楚为什么在客户机或服务器上生成的标记不同:
(client)
没有选择
(server)
选择偶数
一旦浏览器选项卡(Chrome 43)挂起,我必须使用任务管理器终止它。
最初,我直接调用EventViewDetail
的实例,例如
<div className="event-view__content col-md-8" id="eventDetail">
<EventViewDetail />
</div>
但是如果我使用普通的HTML
它也会挂起 <div className="event-view__content col-md-8" id="eventDetail">
<h3>Select an event to view</h3>
</div>
显然我做了一些非常错误的事情,但我有点不熟悉React,所以我不知道那是什么。我读到我应该在顶层EventView
组件上有状态,但我没有访问权限,React似乎没有提供回到组件链的能力。除非你应该将EventView
实例作为属性传递给每个子组件?
哦,我还应该添加-我还尝试从EventViewListRow
单击处理程序中删除setState
调用,以防这是原因,但它没有效果。
有谁能告诉我我做错了什么吗?EventView
是否具有子组件的所有状态,如果是这样,我如何从嵌套的子组件引用父组件-我是否必须将EventView
的实例作为prop传递给每个子组件?
抱歉,如果这些是白痴的问题!
你不应该调用React。在handleClick函数中渲染。就叫它。setState和React会自动重新渲染
- 拨打'父亲'函数形式a'儿童'ReactJS中的组件
- 如何更改reactjs中外部/独立组件的状态或属性
- 如何在ReactJs中渲染子组件时重新加载子组件的数据
- 在reactjs组件中预加载数据
- ReactJS-在加载时渲染顶级组件
- 组件未使用ReactJS和React Router进行渲染
- ReactJS中未定义组件
- 我不知道如何正确地将REST响应对象传递给ReactJS子组件
- reactjs-redux,是否可以有一个由2个组件使用的状态
- ReactJS组件中显示的视频未更新
- 组件中的ReactJS意外令牌
- 当写入“;函数“;在ReactJS组件中
- 将可重复使用的组件与ReactJs和Flux一起用于多个存储
- ReactJS中的子-父组件通信
- 如何在reactjs中动态加载组件
- 从子窗体组件ReactJS中获取道具
- 可以't重新渲染子组件reactjs
- React 在点击时渲染其他组件.ReactJS中的最优模式
- 正在更新不工作的组件ReactJs
- 父组件多次重新渲染子组件ReactJS