【问题标题】:React native action bar and react native menu反应原生操作栏和反应原生菜单
【发布时间】:2017-08-02 03:48:00
【问题描述】:

我是 React-Native 的新手,到目前为止我很喜欢它。我正在尝试使用右上角的菜单图标创建一个屏幕(用于跨平台应用程序),单击时,我想打开一个菜单,希望使用 react-native-menu 显示“退出”和“帐户”菜单选项。在此之后很难弄清楚如何调用菜单。感谢任何帮助。

 import React, { Component } from 'react';
 import {
       AppRegistry,
       StyleSheet,
       View, 
 } from 'react-native';
 import ActionBar from 'react-native-action-bar';


export test class Main extends Component {

render() {

    return (
            <View style={styles.screen}>
            <ActionBar
            containerStyle={styles.bar}
            backgroundColor='#33cc33'
            rightIcons={[
                         {
                         name: 'menu',
                         onPress: () => console.log('menu clicked'),
                         },
                         ]}
             />
            </View>



                               );
   }
   }


 const styles = StyleSheet.create({
                             screen: {
                             backgroundColor: '#33cc33',
                             flex: 1,
                             paddingTop: 10,
                             alignItems: 'center',
                             //padding: 10
                             },

                             });

AppRegistry.registerComponent('Main', () => Main);

【问题讨论】:

  • 嗨,我使用this libraryReactNative 上创建组件菜单。也许你也可以试试。

标签: react-native


【解决方案1】:

我尝试完成您的案例,我添加库 react-native-drawer-layout 以创建菜单抽屉布局。可以在this找到安装。

第 1 步 - 创建菜单列表(我创建了一个单独的列表,以便在我想添加另一个菜单时更容易),它只是 ArrayList 的内容。我把那个文件叫做Constants,你可以写Constants.js,比如:

export const MENU_LIST = [
  { index: 1, name: 'Action' },
  { index: 2, name: 'Sign Out' },
]

第 2 步 - 我创建了菜单组件来显示菜单列表。在Menu.js 中,您可以这样写:

import React, { Component } from 'react';
import { View, ScrollView, Text, TouchableOpacity } from 'react-native';

const menuList = require('./Constants.js');

export default class Menu extends Component {
  render() {
    return (
      <View style={{ flex:1, backgroundColor: '#33cc33'}}>
        <ScrollView>
          {menuList.MENU_LIST.map(item => (
            <TouchableOpacity
              key={item.index}
              onPress={() => console.log('entered menu')}
            >
              <Text style={{color: 'white', fontSize: 16, paddingLeft: 20, paddingTop: 16}}>{item.name}</Text>
            </TouchableOpacity>
          ))}
        </ScrollView>
      </View>
    );
  }
}

第 3 步 - 重构主要组件,如:

import React, { Component } from 'react';
import { AppRegistry, StyleSheet, View } from 'react-native';
import ActionBar from 'react-native-action-bar';
import DrawerLayout from 'react-native-drawer-layout';

import Menu from './Menu';

export default class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      drawerClosed: true,
    };
    this.toggleDrawer = this.toggleDrawer.bind(this);
    this.setDrawerState = this.setDrawerState.bind(this);
  }

  setDrawerState() {
    this.setState({
      drawerClosed: !this.state.drawerClosed,
    });
  }

  toggleDrawer = () => {
    if (this.state.drawerClosed) {
      this.DRAWER.openDrawer();
    } else {
      this.DRAWER.closeDrawer();
    }
  }

  render() {
    return (
      <DrawerLayout
        drawerWidth={300}
        ref={drawerElement => {
          this.DRAWER = drawerElement;
        }}
        drawerPosition={DrawerLayout.positions.left}
        onDrawerOpen={this.setDrawerState}
        onDrawerClose={this.setDrawerState}
        renderNavigationView={() => <Menu />}
      >
        <ActionBar
          containerStyle={styles.bar}
          backgroundColor="#33cc33"
          leftIconName={'menu'}
          onLeftPress={this.toggleDrawer}/>

      </DrawerLayout>
    );
  }
}

const styles = StyleSheet.create({
  screen: {
    backgroundColor: '#33cc33',
    flex: 1,
    paddingTop: 10,
    alignItems: 'center',
    //padding: 10
  },
});

AppRegistry.registerComponent('Main', () => App);

在我的模拟器中,会显示如下:

当我点击菜单图标时,会显示如下:

UPDATE-1

如果你想让组件抽屉菜单不填充到底部,你可以在组件&lt;Menu /&gt; 中播放样式,我给包装器留出边距,例如:

const styles = StyleSheet.create({
  wrapper: {
    backgroundColor: '#33cc33',
    marginTop: 50,

  },

  listMenu: {
    color: 'white', 
    fontSize: 16, 
    paddingLeft: 20, 
    paddingTop: 12,
    paddingBottom: 12,
  }

});

并在&lt;Menu /&gt; 中为组件添加样式,例如:

export default class Menu extends Component {
  render() {
    return (
      <View style={styles.wrapper}> //add style wrapper
        <ScrollView>
          {menuList.MENU_LIST.map(item => (
            <TouchableOpacity
              key={item.index}
              onPress={() => console.log('entered menu')}
            >
              <Text style={styles.listMenu}>{item.name}</Text> //add style menu
            </TouchableOpacity>
          ))}
        </ScrollView>
      </View>
    );
  }
}

Menu.js 中的完整代码如下:

import React, { Component, PropTypes } from 'react';
import { View, ScrollView, Text, TouchableOpacity, Image, StyleSheet } from 'react-native';
import Icon from 'react-native-vector-icons/MaterialIcons';

const menuList = require('./Constants.js');

export default class Menu extends Component {
  render() {
    return (
      <View style={styles.wrapper}>
        <ScrollView>
          {menuList.MENU_LIST.map(item => (
            <TouchableOpacity
              key={item.index}
              onPress={() => console.log('entered menu')}
            >
              <Text style={styles.listMenu}>{item.name}</Text>
            </TouchableOpacity>
          ))}
        </ScrollView>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  wrapper: {
    backgroundColor: '#33cc33',
    marginTop: 50,

  },

  listMenu: {
    color: 'white', 
    fontSize: 16, 
    paddingLeft: 20, 
    paddingTop: 12,
    paddingBottom: 12,
  }

});

结果如下:


UPDATE-2

根据您在 cmets 中的情况,如果您想将位置 menu 向右更改。你必须先改变抽屉的位置。

其实:

  • 我将抽屉设置为屏幕的一半,并将位置设置在左侧。您可以在main 文件中看到:

 render() {
    return (
      <DrawerLayout
       
        /* This for set width drawer */
        
        drawerWidth={300}

        /* end */

        ref={drawerElement => {
          this.DRAWER = drawerElement;
        }}

        /* This for set position drawer */

        drawerPosition={DrawerLayout.positions.left}

        /* end */

        onDrawerOpen={this.setDrawerState}
        onDrawerClose={this.setDrawerState}
        renderNavigationView={() => <Menu />}
      >
        <ActionBar
          containerStyle={styles.bar}
          backgroundColor="#33cc33"
          leftIconName={'menu'}
          onLeftPress={this.toggleDrawer}
          
        />

      </DrawerLayout>
    );
  }

希望:

  • 我将菜单选项设置在右侧。您只需更改位置抽屉,例如:

 render() {
    return (
      <DrawerLayout
        drawerWidth={300}
        ref={drawerElement => {
          this.DRAWER = drawerElement;
        }}
        
        // i change the position to the right.
        drawerPosition={DrawerLayout.positions.Right}
        
        onDrawerOpen={this.setDrawerState}
        onDrawerClose={this.setDrawerState}
        renderNavigationView={() => <Menu />}
      >
        <ActionBar
          containerStyle={styles.bar}
          backgroundColor="#33cc33"
          rightIcons={[
            {
              name: 'menu',
              onPress: this.toggleDrawer,
            },
          ]}
        />

      </DrawerLayout>
    );
  }

如果您想了解 Android 上的 DrawerLayout,可以阅读文档。

对于这种情况,我的模拟器显示如下:


我希望我的回答能对您有所帮助,并为您提供开发应用程序的另一个想法。战斗... ;))

【讨论】:

  • 非常感谢。好例子!由于抽屉从上到下填满并且看起来不像菜单,是否可以使用看起来像一个不错的菜单的 react-native-menu。感谢任何帮助。
  • 有可能...但也可以使用react-native-drawer-layout。您只需为组件抽屉菜单添加样式。你可以在我的回答中看到,我更新它..
  • 再次感谢。但为什么我不能在右边有“菜单”?当我向右转时,它消失了。对于菜单,我可以使用 TouchableHighlight 并仍然从常量中提取文本吗?
  • yaapz.. 因为你必须设置抽屉。对于第一种情况,我将其设置为屏幕的一半并位于左侧。如果你想向右改变,你可以通过正确的位置来设置它。我更新了我的答案,向您展示 react-native-drawer-layout 可用于创建菜单选项。 ;)
  • 这看起来很棒!谢谢你的帮助!是否可以在菜单中显示图标而不是文本?如果单击图标,则触发例程?
【解决方案2】:

我使用native-base 库来创建菜单,这是文档。你可以尝试搜索你需要的组件

https://docs.nativebase.io/Components.html#Components

这是我尝试制作菜单的一个示例

/** * 示例 React Native 应用程序 * https://github.com/facebook/react-native * @流动 */

import React, { Component } from 'react';
import { AppRegistry } from 'react-native';
import { Container, Content, Header, Body, Right, Button, Icon, Title, Drawer, Text } from 'native-base';

class SideBar extends Component {
  render(){
    return(
      <Content style={{ backgroundColor: '#FFF' }} >
          <Text>Account</Text>
          <Text>SignOut</Text>
      </Content>
    )
  }
}

export default class App extends Component {
  closeDrawer = () => {
    this.drawer._root.close()
  }
  openDrawer = () => {
    this.drawer._root.open()
  }
  render(){
    return(
      <Drawer
        ref={(ref) => { this.drawer = ref; }}
        content={<SideBar navigator={this.navigator} />}
        onClose={() => this.closeDrawer()} >
          <Container>
            <Header>
              <Body>
                <Title>Header</Title>
              </Body>
              <Right>
                <Button transparent onPress={this.openDrawer} >
                  <Icon name='menu' />
                </Button>
              </Right>
            </Header>
          </Container>
      </Drawer>
    )
  }
}

AppRegistry.registerComponent('Main', () => App);

您可以设计自己的菜单。也许它可以帮助你,谢谢:)

【讨论】:

    【解决方案3】:

    react-native-modal-dropdown 实现这些东西

    +import ModalDropdown from 'react-native-modal-dropdown';
    class FooBar extends PureComponent {
         constructor(props) {
             super(props);
    +        this.dropdownOptions = [{
    +            text: 'Scan',
    +            icon: require('../images/scan.png'),
    +            onPress: this.toScan,
    +        }, {
    +            text: 'Share',
    +            icon: require('../images/share.png'),
    +            onPress: this.toShare,
    +        }];
    
    
    +    adjustDropdownStyle = style => {
    +        return {
    +            width: 110,
    +            height: 96, // calculated from margin and height of renderDropdownItem bellow
    +            right: 0,
    +            top: style.top,
    +        };
    +    }
    +
    +    renderDropdownItem = (item, index, highlighted) => {
    +        return (
    +            <View style={{alignItems: 'center', flexDirection: 'row'}}>
    +                <Image source={item.icon} style={{margin: 10, width: 28, height: 28 }}/>
    +                <Text style={{fontSize: 15}}>
    +                    {item.text}
    +                </Text>
    +            </View>
    +        );
    +    }
    +
    +    onDropdownSelect = (index, item) => item.onPress()
    +
         render() {
            let navs = {
                Center: {
                    text: 'Home',
                },
                Right: {
                    image: require('../images/more.png'),
    +                onPress: () => this.dropdown && this.dropdown.show(),
                },
            };
    
                      <Header navs={navs}/>
    +                <ModalDropdown
    +                    ref={view => {this.dropdown = view;}}
    +                    style={{height: 0}}
    +                    adjustFrame={this.adjustDropdownStyle}
    +                    options={this.dropdownOptions}
    +                    renderRow={this.renderDropdownItem.bind(this)}
    +                    onSelect={this.onDropdownSelect.bind(this)}
    +                />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-11
      • 2018-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-28
      • 2021-11-07
      相关资源
      最近更新 更多