我有一个在React和Redux中使用服务器端渲染的应用程序。
在应用程序中,有一个包含在div
标记内的信息网格。我附加了一个'ref'
属性,以便操纵该特定div
的滚动条。
render(){
this.gridPosition()
return (
<div className='m_wrap' ref="scrollbars">
<TimeBar/>
<ChannelInfo info={this.props} />
</div>
)
}
并且gridPosition是:
gridPosition(){
if (this.props.slidePos == "Morning"){
this.refs.scrollbars.scrollLeft = 0;
} else if (this.props.slidePos == "Afternoon") {
this.refs.scrollbars.scrollLeft = 2880;
} else if (this.props.slidePos == "Evening") {
this.refs.scrollbars.scrollLeft = 5280;
} else if (this.props.slidePos == "Night") {
this.refs.scrollbars.scrollLeft = 7200;
}
}
因此滚动条的位置由this.props.slidePos
这在加载应用程序时有效,但它不会在初始渲染上设置正确的位置。
我尝试在componentDidMount()
函数中触发操作,但在服务器呈现后,div
标记似乎没有连接到应用程序。
如果有人能够对此有所了解或指出我正确的方向来解决它,我将非常感激。
答案 0 :(得分:1)
更改componentDidMount
内的滚动位置是正确的方法。当您收到在服务器端呈现的初始html时,事件 会在客户端呈现您的应用程序(ReactDOM.render(....)
仍在此处并被调用),并将比较生成的校验和。如果它们不匹配,React将用刚刚渲染的DOM替换收到的DOM。
在div.scrollbars
调用之前,refs
将在componentDidMount
中提供1> 。它不仅仅是因为它不是组件层次结构的一部分,即它没有被渲染。您可以看到显示滚动服务器呈现内容here的工作示例。
一般情况下,您从this.gridPosition()
函数调用render
的第一个代码剪切实际应该是异常,因为在gridPosition
访问this.refs.scrollbars
时它没有已由render
方法创建。此代码运行的唯一机会是因为首次呈现组件时this.props.slidePos
的值与gridPosition
中列出的任何值都不匹配。
另请注意,使用String Refs
deprecated。