如何包装React-native CustomComponent,而无需动态映射/渲染数组项?

时间:2019-12-05 15:41:53

标签: reactjs react-native flexbox react-native-android react-native-flexbox

我正在显示问题答案列表,这些列表会在触摸时扩展和关闭,但是为此,我正在对这些值进行硬编码,而不是像这样使用数组:

<TouchableOpacity
                                key={item.heading_category_id}
                                style={{ backgroundColor: 'white', marginHorizontal: wp(2), height: hp(4), flexDirection: 'row', justifyContent: 'space-between', marginTop: hp(2) }}
                                onPress={() => this.setState({ should_heading_expand: !this.state.should_heading_expand })}
                            >
                                <Text style={{ fontSize: wp(4), color: '#515151', fontWeight: 'bold' }}>
                                    {item.category_title}
                                </Text>
                                <Image
                                    source={this.state.should_heading_expand ? require('../../../assets/images/help/up_arrow.png') : require('../../../assets/images/help/down_arrow.png')}
                                    style={{ width: wp(3.5), height: wp(3.5), marginRight: wp(8) }}
                                />
                            </TouchableOpacity>
                            {this.state.should_heading_expand && (
                                <View style={{}}>
                                    {
                                        item.array_of_question_answer_dict.map((i, index) => {
                                            console.log("one item of question array is i = ", i)
                                            return (
                                                <Faq
                                                    key={i.sequence}
                                                    question={i.question}
                                                    answer={i.answer}
                                                />

                                            )
                                        })
                                    }
                                </View>
                            )}

从api获取数据后,我更新了状态并希望通过循环数组来动态呈现它。

我以前的UI(用于硬编码值)是最终结果,但是当我从API获取数据时,我需要将其包装在单个组件/视图中,并将其作为一个组合组件返回。

我正在将this.state.arraylist映射到每个组件中,而不是进行硬编码,但是随后UI样式发生了变化,额外包装视图添加了一些default-css(我想删除),它是在此之后,造成一些额外的填充/边距和整个不需要的UI更改:

 {this.state.heading_record_array.map((item, index) => {

                    return (
                        <View> // this view is giving me problems
                            <TouchableOpacity
                                key={item.heading_category_id}
                                style={{ backgroundColor: 'white', marginHorizontal: wp(2), height: hp(4), flexDirection: 'row', justifyContent: 'space-between', marginTop: hp(2) }}
                                onPress={() => this.setState({ should_heading_expand: !this.state.should_heading_expand })}
                            >
                                <Text style={{ fontSize: wp(4), color: '#515151', fontWeight: 'bold' }}>
                                    {item.category_title}
                                </Text>
                                <Image
                                    source={this.state.should_heading_expand ? require('../../../assets/images/help/up_arrow.png') : require('../../../assets/images/help/down_arrow.png')}
                                    style={{ width: wp(3.5), height: wp(3.5), marginRight: wp(8) }}
                                />
                            </TouchableOpacity>
                            {this.state.should_heading_expand && (
                                <View style={{}}>
                                    {
                                        item.array_of_question_answer_dict.map((i, index) => {
                                            console.log("one item of question array is i = ", i)
                                            return (
                                                <Faq
                                                    key={i.sequence}
                                                    question={i.question}
                                                    answer={i.answer}
                                                />

                                            )
                                        })
                                    }
                                </View>
                            )}
                        </View> // this view is giving me problems
                    )
                })}

如何基于状态值为{this.state.should_heading_expand && (<MyDynamicView>)}来包装我的两个组件以及动态显示的其他组件,而又不影响我想要的当前UI样式(当我为每个代码硬编码值时,效果很好-组件?

我尝试过在不包含额外View的情况下显示它,但是按照react的原理,它应该返回单个组件,最多只能返回一个,

我也尝试将其包装在empty-div中,但这是行不通的:

 <> <TouchableOpacity/>{conditionalView}</>

我想显示它们,但是新的外部包装导致不同的UI位置,我无法更改。

也是faq组件,它具有自己的CSS,并且在对组件进行硬编码之前可以正常工作。

我也知道,硬编码值是非常糟糕的方法:D

0 个答案:

没有答案