如何在 React Native 中实现可折叠框?
How to implement a collapsible box in react native?
我正在尝试在 React native.Its 中实现一个可折叠框,它可以很好地处理虚拟数据。但是当我试图列出来自服务器的数据响应时,我得到 error.I 在响应中使用 map 方法列出显示错误 evaluating this.state.details.map
的 details.But。我也很困惑放置地图的位置 method.Below 是我 tried.I 将此文档用于 collapsible 框的代码。
例子
class DetailedView extends Component{
constructor(props){
super(props);
this.icons = {
'up' : require('../Images/Arrowhead.png'),
'down' : require('../Images/Arrowhead-Down.png')
};
this.state = {
title : props.title,
expanded : true,
animation : new Animated.Value()
};
}
toggle(){
let initialValue = this.state.expanded? this.state.maxHeight + this.state.minHeight : this.state.minHeight,
finalValue = this.state.expanded? this.state.minHeight : this.state.maxHeight + this.state.minHeight;
this.setState({
expanded : !this.state.expanded
});
this.state.animation.setValue(initialValue);
Animated.spring(
this.state.animation,
{
toValue: finalValue
}
).start();
}
_setMaxHeight(event){
this.setState({
maxHeight : event.nativeEvent.layout.height
});
}
_setMinHeight(event){
this.setState({
minHeight : event.nativeEvent.layout.height
});
}
state = {details: []};
componentWillMount(){
fetch('https://www.mywebsite.com' + this.props.navigation.state.params.id )
.then((response) => response.json())
.then((responseData) =>
this.setState({
details:responseData
})
);
}
render(){
let icon = this.icons['down'];
if(this.state.expanded){
icon = this.icons['up'];
}
return this.state.details.map(detail =>
<Animated.View
style={[styles.container,{height: this.state.animation}]}>
{detail.data.curriculum.map(curr =>
<View onLayout={this._setMinHeight.bind(this)}>
<Card>
<CardSection>
<View style={styles.thumbnailContainerStyle}>
<Text style={styles.userStyle}>
Hii
</Text>
</View>
<TouchableHighlight onPress={this.toggle.bind(this)}
underlayColor="#f1f1f1">
<Image style={styles.buttonImage} source={icon}></Image>
</TouchableHighlight>
</CardSection>
</Card>
</View>
<View style={styles.body} onLayout={this._setMaxHeight.bind(this)}>
{this.props.children}
<Card>
<CardSection>
<Text>{this.props.navigation.state.params.id}</Text>
</CardSection>
</Card>
</View>
)}
</Animated.View>
);
}
}
这是使用虚拟数据工作代码的屏幕截图
1.解决错误:
您正在进行的 API 调用是异步的,一旦 API 被调用,代码会在从 API 获得响应之前继续执行。在有任何细节之前,组件会尝试通过 this.state.details
进行映射。
这里的一个解决方案是,你需要在安装组件时设置一个ActicityIndicator/Loader,一旦你从API得到details/response,状态就会改变,然后你就可以通过 this.state.details
映射
将空的详细信息数组添加到您的初始状态。
state = { details:[] }
然后把你的 return this.state.details.map(detail....
放在这样的 if 条件中
if(this.state.details.length > 0) {
<map here>
} else {
return <ActivityLoader />
}
2。在哪里放置地图 methiod
您需要将它放在一个函数中并从您的渲染方法中调用该函数。
showDetailsFunction() {
return this.state.details.map(detail =>
}
render() {
return(
{this.showDetailsFunction()}
)
}
我正在尝试在 React native.Its 中实现一个可折叠框,它可以很好地处理虚拟数据。但是当我试图列出来自服务器的数据响应时,我得到 error.I 在响应中使用 map 方法列出显示错误 evaluating this.state.details.map
的 details.But。我也很困惑放置地图的位置 method.Below 是我 tried.I 将此文档用于 collapsible 框的代码。
例子
class DetailedView extends Component{
constructor(props){
super(props);
this.icons = {
'up' : require('../Images/Arrowhead.png'),
'down' : require('../Images/Arrowhead-Down.png')
};
this.state = {
title : props.title,
expanded : true,
animation : new Animated.Value()
};
}
toggle(){
let initialValue = this.state.expanded? this.state.maxHeight + this.state.minHeight : this.state.minHeight,
finalValue = this.state.expanded? this.state.minHeight : this.state.maxHeight + this.state.minHeight;
this.setState({
expanded : !this.state.expanded
});
this.state.animation.setValue(initialValue);
Animated.spring(
this.state.animation,
{
toValue: finalValue
}
).start();
}
_setMaxHeight(event){
this.setState({
maxHeight : event.nativeEvent.layout.height
});
}
_setMinHeight(event){
this.setState({
minHeight : event.nativeEvent.layout.height
});
}
state = {details: []};
componentWillMount(){
fetch('https://www.mywebsite.com' + this.props.navigation.state.params.id )
.then((response) => response.json())
.then((responseData) =>
this.setState({
details:responseData
})
);
}
render(){
let icon = this.icons['down'];
if(this.state.expanded){
icon = this.icons['up'];
}
return this.state.details.map(detail =>
<Animated.View
style={[styles.container,{height: this.state.animation}]}>
{detail.data.curriculum.map(curr =>
<View onLayout={this._setMinHeight.bind(this)}>
<Card>
<CardSection>
<View style={styles.thumbnailContainerStyle}>
<Text style={styles.userStyle}>
Hii
</Text>
</View>
<TouchableHighlight onPress={this.toggle.bind(this)}
underlayColor="#f1f1f1">
<Image style={styles.buttonImage} source={icon}></Image>
</TouchableHighlight>
</CardSection>
</Card>
</View>
<View style={styles.body} onLayout={this._setMaxHeight.bind(this)}>
{this.props.children}
<Card>
<CardSection>
<Text>{this.props.navigation.state.params.id}</Text>
</CardSection>
</Card>
</View>
)}
</Animated.View>
);
}
}
这是使用虚拟数据工作代码的屏幕截图
1.解决错误:
您正在进行的 API 调用是异步的,一旦 API 被调用,代码会在从 API 获得响应之前继续执行。在有任何细节之前,组件会尝试通过 this.state.details
进行映射。
这里的一个解决方案是,你需要在安装组件时设置一个ActicityIndicator/Loader,一旦你从API得到details/response,状态就会改变,然后你就可以通过 this.state.details
将空的详细信息数组添加到您的初始状态。
state = { details:[] }
然后把你的 return this.state.details.map(detail....
放在这样的 if 条件中
if(this.state.details.length > 0) {
<map here>
} else {
return <ActivityLoader />
}
2。在哪里放置地图 methiod
您需要将它放在一个函数中并从您的渲染方法中调用该函数。
showDetailsFunction() {
return this.state.details.map(detail =>
}
render() {
return(
{this.showDetailsFunction()}
)
}