简体   繁体   English

父组件和子组件都在 react-native 中同时渲染

[英]Both the parent and the child components get rendered simultaneously in react-native

I have a parent component that maps through an array of chapters and renders (an exercise) a child component for every item found and passes an array of exercises to it.我有一个父组件,它映射一系列章节,并为找到的每个项目呈现(一个练习)一个子组件,并将一系列练习传递给它。

class ExercisesScreen extends Component {
  showSelectedItemList = (screenName, text) => {
    Navigation.push("ExercisesStack", {
      component: {
        name: screenName,
        options: navOptionsCreator(text)
      }
    });
  };

  get chapters() {
    return this.props.chapters.map(chapter => (
      <TouchableOpacity key={chapter.id}>
        <ExercisesList
          onPress={() =>
            this.showSelectedItemList(chapter.screenName, chapter.name)
          }
          exercises={chapter.exercises}
        />
      </TouchableOpacity>
    ));
  }

  render() {
    return <View>{this.chapters}</View>;
  }
}

const mapStateToProps = state => ({
  chapters: chaptersSelector(state)
});

When this child component receives the array of exercises, it maps through it and renders a list of exercises.当这个子组件收到练习数组时,它会映射它并呈现练习列表。

class ExercisesList extends Component {
  render() {
    return this.props.exercises.map(exercise => (
      <View key={exercise.id}>
        <TouchableOpacity
          style={styles.button}
          onPress={() =>
            this.props.showSelectedItemList(exercise.screenName, exercise.name)
          }
        >
          <Image source={exercise.icon}/>
          <View>
            <Text>{exercise.name}</Text>
          </View>
          <Image source={arrow} />
        </TouchableOpacity>
        <View />
      </View>
    ));
  }
}

ExercisesList.propTypes = {
  onPress: PropTypes.func,
  exercises: PropTypes.arrayOf(PropTypes.object)
};

The result I get from both components rendered simultaneously:我从同时呈现的两个组件中得到的结果:

在此处输入图片说明

The question is, what should I do in order for them to render themselves separately and show the corresponding ExercisesList for every chapter in ExercisesScreen?问题是,我应该怎么做才能让他们分别渲染自己并在练习屏幕中为每个章节显示相应的练习列表?

Make your child component ExercisesList as functional component that only show the corresponding ExercisesList for every chapter not perform any rendering.将您的子组件练习列表作为功能组件,只显示每章对应的练习列表,不执行任何渲染。

Like below:像下面这样:

const ExercisesList = (props) => {
  const { exercises } = props;
  return({ 
        exercises.map(exercise, index) => renderExcercise(exercise, index)
        })
  }
const renderExcercise = (exercise, index) => {
    return(
      <View key={exercise.id}>
        <TouchableOpacity
          style={styles.button}
          onPress={() =>
            this.props.showSelectedItemList(exercise.screenName, exercise.name)
          }
        >
          <Image source={exercise.icon}/>
          <View>
            <Text>{exercise.name}</Text>
          </View>
          <Image source={arrow} />
        </TouchableOpacity>
        <View />
      </View>
    )
  }
export default ExercisesList;

ExercisesList.propTypes = {
  onPress: PropTypes.func,
  exercises: PropTypes.arrayOf(PropTypes.object)
};

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM