Борьба с использованием zIndex для заказа просмотров

#reactjs #react-native #react-native-maps

Вопрос:

Я пытаюсь загрузить компонент поверх другого. В моей демо-версии у меня есть два экрана, которые условно отображаются с помощью кнопки слайдера(я бы использовал простую текстовую кнопку, но я хочу убедиться, что анимация работает). Экран 1-это просто серый экран, а экран 2-это экран отображаемых карт react native.

Я бы хотел, чтобы кнопка ползунка находилась в верхней части карты. Мне нужно, чтобы карта была на всю страницу. Первоначально я пытался использовать zIndex, но это не работает.

У меня здесь есть рабочая демонстрация

App.js

 export default class Home extends React.Component {
 
  constructor(props) {
    super(props)
    this.state ={
      visible: true,
      whichComponentToShow: 'Screen1'
    };
}

goToMap = () => {
  this.setState({whichComponentToShow: 'Screen2'})
}
goToList = () => {
  this.setState({whichComponentToShow: 'Screen1'})
}

  render(){

    const SliderRender = (
      <Slider
        renderMap={this.goToMap.bind(this)}
          renderList={this.goToList.bind(this)}
          key="slider"
          style={{zIndex: 10}}
         />
      );
    
     if(this.state.whichComponentToShow === 'Screen1'){
      return(
       <View style={{backgroundColor: '#d1cfcf' ,flex: 1}}>  
        
        {SliderRender}

          <ListHome
            renderMap={this.goToMap.bind(this)}
            renderList={this.goToList.bind(this)}
          />
        </View>
      );
    }
    else if(this.state.whichComponentToShow === 'Screen2'){
      return(
       <View style={{backgroundColor: '#d1cfcf' ,flex: 1}}>

        <MapHome
          renderMap={this.goToMap.bind(this)}
          renderList={this.goToList.bind(this)}
          
        />

        {SliderRender}
 
       </View>
      );
    }
 }
 }
 
 

Ответ №1:

Вы можете использовать View с position: absolute , чтобы обернуть кнопки ползунка.

 render() {
  const { whichComponentToShow } = this.state;

  return(
    <View style={{backgroundColor: '#d1cfcf' ,flex: 1}}>
      {whichComponentToShow === 'Screen1' amp;amp; <ListHome />}
      {whichComponentToShow === 'Screen2' amp;amp; <MapHome />}
      <View style={{position: 'absolute', top: 0, left: 0, right: 0}}>
        <Slider
          renderMap={this.goToMap}
          renderList={this.goToList}
        />
      </View>
    </View>
  );
}
 

Комментарии:

1. Однако я все равно хотел бы, чтобы карта занимала всю страницу.

2. Понял. Я обновил ответ.

3. Так что визуально это выглядит идеально. Единственное, что я заметил, это то, что анимация, кажется, перестает работать. Вы можете визуализировать его перед Мафомом, чтобы увидеть анимацию, работающую так, как она должна быть. Есть какие-либо идеи относительно того, почему добавление представления в слайд-шоу приведет к тому, что анимация перестанет работать/повторно визуализироваться?

4. Это связано с тем, что компонент слайдера переназначался между экранами. Так active что государство всегда будет false таким . Причина, по которой это сработало в исходном коде, заключается в том, что React понял, что это одни и те же компоненты, и повторно использовал слайдер, не размонтируя его. Я снова обновил код, чтобы устранить эту проблему.