我有下面的react组件,它实际上是一个聊天框
render(){ const messages = this.props.messages; return( <div id="project_chat"> <h1>{this.props.project[0].project}</h1> <div className="chat_room"> <div className="messages" ref="messages"> <Waypoint onEnter={this.activateWayPoint}/> <ul> {messages.map((message) => { return( <Message key={uuid.v4()} message={message}/> ) })} </ul> </div> <div className="chat_message_box"> <input type='text' onChange={this.handleChange} value={this.state.message} className="message_box" placeholder="enter message"/> <button className="submit_message" onClick={this.handleSubmit}>Submit</button> </div> </div> </div> ) }
我面临的问题是,聊天消息框从容器的最高位置开始(滚动位置从顶部开始)。我希望滚动位置像普通聊天室一样位于底部。
所以我尝试这样做:
componentDidMount(){ this.refs.messages.scrollTop = this.refs.messages.scrollHeight }
这将在组件安装后触发,即-消息框滚动位置最初从顶部开始,并在渲染时强制其到达底部。
这通常很好,但是我正在使用一个名为的库react-waypoint,它将帮助我分页聊天消息。每当我在容器顶部时,就会触发此事件。
react-waypoint
不幸的结果是,由于消息框最初在安装时从顶部开始,所以航路点也总是在安装时触发。
我的问题是我是否可以强制消息组件从底部开始而不是从顶部开始到底部开始
我尝试这样做
componentWillMount(){ this.refs.messages.scrollTop = this.refs.messages.scrollHeight }
问题是在组件安装之前我没有访问引用。还有其他办法吗?
您想要的是this.activateWayPoint在设置之前避免开火scrollTop。
this.activateWayPoint
scrollTop
您可以通过将状态变量设置waypointReady为false初始来实现。在中将其设置为true componentDidMount。
waypointReady
false
componentDidMount
然后,您可以修改this.activateWayPoint为check this.state.waypointReady,如果为false,则立即返回。
this.state.waypointReady
// inside component getInitialState() { return { waypointReady : false } } componentDidMount() { this.refs.messages.scrollTop = this.refs.messages.scrollHeight; this.setState({ waypointReady : true}); } activateWayPoint() { if (! this.state.waypointReady) return; // Your code here! // ... }
您可能必须this在render函数内部进行绑定:
this
render
// ... <Waypoint onEnter={this.activateWayPoint.bind(this)}/> // ...
或者,this.activateWayPoint您可以在render 内部执行检查,而不是在内部执行检查:
// ... <Waypoint onEnter={ this.state.waypointReady ? this.activateWayPoint : null }/> // ...
这假设您的组件每次都重新渲染setState。
setState