Встроенная навигация WIX React: показать боковой ящик в приложении на основе вкладок

#react-native #wix-react-native-navigation

#react-native #wix-react-native-navigation

Вопрос:

Я использую React Native Navigation v2 от WIX в своем проекте RN. Для стека Dashboard (goToDahboard) мне нужно отобразить значок гамбургера слева при нажатии «Показать боковой ящик». Как это можно реализовать?

После обновления с версии v1 параметры бокового меню изменились, и документы недостаточно понятны.

 export const goToDashboard = () =>
  Promise.all([
    Icon.getImageSource('home', 22, '#272727'),
    Icon.getImageSource('th-list', 22, '#272727'),
  ]).then(sources => {
    Navigation.setRoot({
      root: {
        bottomTabs: {
          children: [
            {
              stack: {
                children: [
                  {
                    component: {
                      name: 'Dashboard',
                    },
                  },
                ],
                options: {
                  bottomTab: {
                    icon: sources[0],
                    text: 'Dashboard',
                  },
                },
              },
            },
            {
              stack: {
                children: [
                  {
                    component: {
                      name: 'Settings',
                    },
                  },
                ],
                options: {
                  bottomTab: {
                    icon: sources[1],
                    text: 'Settings',
                  },
                },
              },
            },
          ],
          id: 'bottomTabs',
        },
      },
    });
  });

export const goToAuth = () =>
  Navigation.setRoot({
    root: {
      stack: {
        id: 'Login',
        children: [
          {
            component: {
              name: 'Login',
            },
          },
        ],
      },
    },
  });
  

Ответ №1:

Я использую вот так, это мой код;

 Navigation.setRoot({
    root:{
        sideMenu:{
            left:{
                component:{
                    name:'app.Main.SideDrawer'
                }
            },
            center:{
                bottomTabs:{
                    id: 'MainAppBottomTab',
                    children:[
                        {
                            stack:{
                                children:[
                                    {
                                        component:{
                                            name: 'app.Main.Bottom_1',
                                            options:{
                                                bottomTab:{
                                                    text: "Bottom 1",
                                                    icon: require('./../../assets/images/Bottom_1.png'),
                                                }
                                            },
                                        }
                                    }
                                ],
                                options: {
                                    bottomTab: {
                                        text: 'Bottom 1',
                                    },
                                    bottomTabs:{
                                        backgroundColor: ColorTable.orange,
                                        animate:false,
                                    },
                                    topBar:{
                                        title:{
                                            text: 'Bottom 1',
                                        },
                                        leftButtons:[
                                            {
                                                id: 'btn_toggle_drawer',
                                                name: 'BTN_TOGGLE_DRAWER',
                                                icon: require('./../../assets/images/hamburger_icon.png'),
                                            }
                                        ],
                                    }
                                }
                            }
                        }
                    ]
                }
            }
        }
    }
});
  

Теперь нам нужно использовать жизненный цикл wix.

Если вы хотите закрыть его в SideDrawer, вам следует использовать следующий код;

 Navigation.mergeOptions(this.props.componentId, {
    sideMenu: {
        left: {
            visible: false
        }
    }
});
  

this.props.componentID равен app.Main.SideDrawer. Из-за того, что мы находимся в компоненте app.Main.SideDrawer.

Если вы хотите открыть со значком гамбургера, перейдите на любую страницу, которую вы хотите использовать для нижней вкладки, в нашем примере я сказал Bottom_1.

Не забудьте ввести Navigation.events().bindComponent(this) в метод конструктора. Это позволяет вам устанавливать ссылки на собственные.

Будет работать только следующая команда;

 navigationButtonPressed({buttonId}) {
    if (buttonId === "btn_toggle_drawer") {

        Navigation.mergeOptions(this.props.componentId, {
            sideMenu: {
                left: {
                    visible: true
                }
            }
        });
    }
}
  

Приведенный выше код работает, но является проблематичным. Вы собираетесь сказать мне, что мне придется дважды нажать, чтобы отключить его =)

Решение заключается в использовании redux. Или mobx, как вам больше нравится.

Чтобы решить эту проблему, я использовал redux и redux-thunk.

Wix — это жизненный цикл, пожалуйста, изучите его:https://wix.github.io/react-native-navigation/#/docs/Usage?id=screen-lifecycle

С решением redux

Реальная функция;

 navigationButtonPressed({buttonId}) {
        if (buttonId === "btn_toggle_drawer") {
            this.props.toggleDrawer(this.props.isSideDrawerVisible);

            Navigation.mergeOptions(this.props.componentId, {
                sideMenu: {
                    left: {
                        visible: this.props.isSideDrawerVisible
                    }
                }
            });
        }
    }
  

действие toggle_drawer

 export const toggleDrawer = (visible) => {
    return (dispatch) => {
        (visible) ? visible = true : visible = false;

        dispatch({
            type: TOGGLE_DRAWER,
            payload: visible
        });
    }
};
  

редуктор toggle_drawer

 const INITIAL_STATE = {
    isSideDrawerVisible: true
};

export default (state = INITIAL_STATE, action) => {
    switch (action.type) {
        case TOGGLE_DRAWER:
            return {...state, isSideDrawerVisible: action.payload};
        default:
            return state;
    }
}
  

Пример функции подключения;

 import {connect} from "react-redux";

// actions
import {toggleDrawer} from "../../../actions/toggle_drawer";
const mapStateToProps = state => {
    return {
        isSideDrawerVisible: state.toggleDrawer.isSideDrawerVisible,
    }
};

export default connect(mapStateToProps, {toggleDrawer})(Bottom_1_Screen);
  

Не забудьте подключить wix к Redux. https://wix.github.io/react-native-navigation/#/docs/third-party?id=redux

Надеюсь, я смогу вам помочь, я увидел это немного поздно. Хорошего дня..

Ответ №2:

Вы можете использовать

 Navigation.mergeOptions()  

вот так, чтобы запустить и открыть ящик:

 navigationButtonPressed = ({ buttonId }) => {
  const { componentId } = this.props;

  if (buttonId === 'sideMenu') {
    Navigation.mergeOptions(componentId, {
      sideMenu: {
        left: {
          visible: true,
        },
      },
    });
  }
}