我目前正在反应原生版本 0.7.1
上编写应用程序。我试图写一个聊天组件。
通过聊天,您通常会在底部输入文本,并将消息从屏幕的底部推送到屏幕顶部。此外,当聊天屏幕初始化时,它在屏幕底部初始化并允许用户向上滚动。我想在react-native中实现相同的行为。 ScrollView的当前行为将项目从顶部推送到底部。我尝试了几种不同的解决方案:
this.refs.messages.scrollTo(contentHeight)
。有些人提到了以下功能:this.refs.messages.measure(callbackWithTheseParams((a, b, width, height, px,py ))
。但是测量功能结果未定义。 scrollTo(0,0)
。但是,似乎此功能仅在0.8.0-rc中可用。我不确定哪个是稳定的(或者相当稳定)。编辑 - 添加示例
我的构造函数:
componentDidMount() {
this.measureComponent()
}
// measureComponent
measureComponent() {
console.log('this gets called');
this.refs.messages.measure((ox, oy, width, height) => {
console.log(height); // does not get called.
});
}
我的渲染功能是:
return (
<ScrollView
scrollEventThrottle={200}
ref="messages"
style={styles.container}>
<View style={styles.messages}>
{messages.map(this.renderMessage)}
</View>
<TextInput
style={styles.newMessage}
value={this.state.message}
onSubmitEditing={this.sendMessage}
onChangeText={(text) => this.setState({message: text})} />
</ScrollView>
);
答案 0 :(得分:0)
我不确定是否有更简单的方法来获取ScrollView的高度,但我确实在ListView(/Libraries/CustomComponents/ListView/ListView.js
)的React Native源代码中注意到了这一点:
_measureAndUpdateScrollProps: function() {
var scrollComponent = this.getScrollResponder();
...
RCTUIManager.measureLayout(
scrollComponent.getInnerViewNode(),
React.findNodeHandle(scrollComponent),
logError,
this._setScrollContentLength
);
...
},
_setScrollContentLength: function(left, top, width, height) {
this.scrollProperties.contentLength = !this.props.horizontal ?
height : width;
},
取决于是否设置了horizontal
属性,可以获得高度或宽度。 RCTUIManager
是本机模块模块(require('NativeModules').UIManager
)的一部分。
答案 1 :(得分:0)
this.refs.messages.measure(callbackWithTheseParams((a, b, width, height, px,py )).
尝试类似:
_measureFunc() {
this.refs.MESSAGES.measure((ox, oy, width, height) => {
setState ({ h: height });
});
}
例如,这将是您的消息组件:
<View ref='MESSAGES' ></View>
然后添加bind(放置在构造函数中):
this._measureFunc = this._measureFunc.bind(this);