我使用react-native-collapsible创建手风琴。我为每个手风琴部分设计了标题样式,看起来有点像带有一些图标的列表项目,包括雪佛龙。当我点击每个部分时,我想将该部分的标题雪佛龙从右向下更改。
我对来自" Direct Manipulation"的一些样品感到困惑。 RN文档中的页面,并尝试使用状态变量,但我没有运气。
这就是我所得到的,它告诉我onChange(),这个。反射['第一个']是未定义的,尽管是第一个人字形&#39 ; s icon ref是" First"。
class AccordionView extends React.Component {
constructor(props) {
super(props);
//console.log(props);
this.state = {
icons: "chevron-right",
};
}
_renderHeader(section) {
return (
<View style={styles.accHeader}>
<View style={{flex: 1, flexDirection:'row', alignItems: 'center', justifyContent:'flex-start'}}>
<View style={{flex:.5,flexDirection:'row',alignItems:'center',justifyContent:'flex-start'}}>
<Text style={styles.accHeaderText}>{section.title}</Text>
</View>
<View style={{flex:.5,flexDirection:'row',alignItems:'center',justifyContent:'flex-end'}}>
<FontAwesome name="link" size={24} color="#666" style={{paddingHorizontal:6}} onPress={() => alert('link!')} />
<MaterialIcons name="place" size={24} color="#666" style={{paddingHorizontal:6}} />
<FontAwesome name="phone" size={24} color="#666" style={{paddingHorizontal:6}} />
<FontAwesome name="chevron-right" size={24} color="#999" style={{paddingHorizontal:8}} ref={section.title} />
</View>
</View>
</View>
)
};
_renderContent(section) {
return (
<View style={styles.accContent}>
<Text>{section.content}</Text>
</View>
);
};
_onChange(index) {
this.refs['First'].setNativeProps({name:"chevron-down"});
};
render() {
return (
<Accordion
sections={sections}
renderHeader={this._renderHeader}
renderContent={this._renderContent}
underlayColor="#0972CE"
onChange={this._onChange}
/>
);
} }
答案 0 :(得分:1)
您应该将活动索引存储在状态中,并在其他部分变为活动状态时更新状态。然后在图标上,检查状态中的索引是否与正在渲染的部分的索引匹配,并设置相关图标。
(我无法测试下面的代码,所以我不能保证它有效,但它应该让你大致了解它是如何工作的。)
class AccordionView extends React.Component {
constructor(props) {
super(props);
//console.log(props);
this.state = {
activeIndex: 0,
};
}
_renderHeader(section, index) {
return (
<View style={styles.accHeader}>
<View style={{flex: 1, flexDirection:'row', alignItems: 'center', justifyContent:'flex-start'}}>
<View style={{flex:.5,flexDirection:'row',alignItems:'center',justifyContent:'flex-start'}}>
<Text style={styles.accHeaderText}>{section.title}</Text>
</View>
<View style={{flex:.5,flexDirection:'row',alignItems:'center',justifyContent:'flex-end'}}>
<FontAwesome name="link" size={24} color="#666" style={{paddingHorizontal:6}} onPress={() => alert('link!')} />
<MaterialIcons name="place" size={24} color="#666" style={{paddingHorizontal:6}} />
<FontAwesome name="phone" size={24} color="#666" style={{paddingHorizontal:6}} />
<FontAwesome name={this.state.activeIndex === index ? "chevron-down" : "chevron-right"} size={24} color="#999" style={{paddingHorizontal:8}} />
</View>
</View>
</View>
)
};
_renderContent(section) {
return (
<View style={styles.accContent}>
<Text>{section.content}</Text>
</View>
);
};
_onChange(index) {
this.setState({
activeIndex: index,
})
};
render() {
return (
<Accordion
sections={sections}
renderHeader={this._renderHeader}
renderContent={this._renderContent}
underlayColor="#0972CE"
onChange={this._onChange}
/>
);
}
}
答案 1 :(得分:0)
有一个道具isActive
只是在标头或内容组件中传递道具,如下所示
_renderHeader(section, index, isActive) {
return(
{isActive ? <Text>icon 1 </Text> : <Text>icon 2 </Text> }
)
}
答案 2 :(得分:0)
React Native可折叠包的“ isActive”道具可用于实现此目的。实现方法如下;
class AccordionView extends React.Component {
constructor(props) {
super(props);
//console.log(props);
this.state = {
icons: "chevron-right"
};
}
_renderHeader(section, index, isActive) {
return (
<View style={styles.accHeader}>
<View
style={{
flex: 1,
flexDirection: "row",
alignItems: "center",
justifyContent: "flex-start"
}}
>
<View
style={{
flex: 0.5,
flexDirection: "row",
alignItems: "center",
justifyContent: "flex-start"
}}
>
<Text style={styles.accHeaderText}>{section.title}</Text>
</View>
<View
style={{
flex: 0.5,
flexDirection: "row",
alignItems: "center",
justifyContent: "flex-end"
}}
>
<FontAwesome
name="link"
size={24}
color="#666"
style={{ paddingHorizontal: 6 }}
onPress={() => alert("link!")}
/>
<MaterialIcons
name="place"
size={24}
color="#666"
style={{ paddingHorizontal: 6 }}
/>
<FontAwesome
name="phone"
size={24}
color="#666"
style={{ paddingHorizontal: 6 }}
/>
{isActive ? (
<FontAwesome
name="chevron-right"
size={24}
color="#999"
style={{ paddingHorizontal: 8 }}
ref={section.title}
/>
) : (
<FontAwesome
name="chevron-down"
size={24}
color="#999"
style={{ paddingHorizontal: 8 }}
ref={section.title}
/>
)}
</View>
</View>
</View>
);
}
_renderContent(section) {
return (
<View style={styles.accContent}>
<Text>{section.content}</Text>
</View>
);
}
_onChange(index) {
this.refs["First"].setNativeProps({ name: "chevron-down" });
}
render() {
return (
<Accordion
sections={sections}
renderHeader={this._renderHeader}
renderContent={this._renderContent}
underlayColor="#0972CE"
onChange={this._onChange}
/>
);
}
}