牛骨文教育服务平台(让学习变的简单)
博文笔记

react native开发:实现点击左侧选择项,右侧显示内容的功能

创建时间:2017-03-12 投稿人: 浏览次数:2050

需求:

界面分为左右两部分,左侧为选择栏,右侧为显示的内容,点击左侧选择项,右侧显示内容的功能
如下图:
这里写图片描述

这里写图片描述

思路:

首先思考问题:

****1. 如何实现左侧栏,点击组件改变颜色?
2. 如何实现点击左侧选项,右侧显示想要内容?

如何实现左侧栏,点击组件改变颜色?

在style中通过条件判断改变样式

如何实现点击左侧选项,右侧显示想要内容?

将左侧被选中的标识,作为参数,通过props回调父组件的方法,该回调方法根据左侧标识,在右侧显示对应的内容

代码

左侧选择栏SettingMenu.js


import React, { Component } from "react";
import {
  AppRegistry,
  StyleSheet,
  Dimensions,
  ScrollView,
  Text,
  TouchableOpacity,
  Image,
  View,

} from "react-native";

const window = Dimensions.get("window");


export default class SettingMenu extends Component {


  constructor(props) {
    super(props);

    this.state = {
      itemSelected: "通讯方式",
    };
    this._onClickItem = this._onClickItem.bind(this);

  }


  render() {


    return (
      <ScrollView style={styles.contantStyle}
        showsVerticalScrollIndicator={false}>

        {/*选项菜单*/}
        {this._selectItem("通讯方式")}
        {this._selectItem("设置3G服务IP地址")}
        {this._selectItem("交易地点")}
        {this._selectItem("清空考勤记录")}
        {this._selectItem("初始化设备")}
        {this._selectItem("修改密码")}
        {this._selectItem("关于我们")}
        {this._selectItem("退出")}

      </ScrollView>
    );
  }
  _selectItem(item) {
    return (
      <TouchableOpacity style={styles.itemTextView}
        onPress={() => {
          this._onClickItem(item)
        }}>

        <Text style={[
          styles.itemDefaultColor,
          this.state.itemSelected === item && styles.itemSelectedColor
        ]}  >
          {item}
        </Text>

      </TouchableOpacity>
    )
  }
  _onClickItem(itemTextContant) {
    this.setState({
      itemSelected: itemTextContant,
    });
    //传递数据到右边显示组件
    this.props.onItemSelected(itemTextContant);
  }


};


const styles = StyleSheet.create({

  contantStyle: {
    backgroundColor: "white",
  },
  itemTextView: {
    height: 60,
    width: window.width / 4,
    justifyContent: "center",
    borderBottomColor: "gray",
    borderBottomWidth: 1,
    marginLeft: 10,
    marginRight: 10,

  },
  item: {
    fontSize: 16,
    justifyContent: "center",
    alignItems: "center",
    flexDirection: "row",
  },
  itemDefaultColor: {
    color: "gray",
  },
  itemSelectedColor: {
    color: "#00bfff"
  }
});

父组件Setting.js

import React, { Component } from "react";
import {
    AppRegistry,
    StyleSheet,
    Text,
    TextInput,
    Image,
    Dimensions,
    View,
    Modal,
    Button,
    PixelRatio,
    TouchableOpacity,
} from "react-native";
import NavigationBar from "react-native-navbar";

import LeftMenu from "./SettingMenu.js";//导入 菜单 组件


const window = Dimensions.get("window");


export default class Setting extends Component {
    constructor(props) {
        super(props);
        this.state = {

            selectedItem: "通讯方式",
            showRightContant: "通讯方式",

        };


        this._onMenuItemSelected = this._onMenuItemSelected.bind(this);


    }

    render() {

        return (
            <View style={styles.flex}>

                {/*标题栏*/}
                <NavigationBar tintColor="#00bfff" title={{ title: "设置", tintColor: "white" }} />

                {/*内容*/}
                <View style={[styles.container, styles.flexDirection]}>
                    {/*左侧选择栏*/}
                    <View style={styles.leftMenuStyle}>
                        <LeftMenu onItemSelected={this._onMenuItemSelected} />
                    </View>
                    {/*右侧显示内容*/}
                    <View style={styles.rightContantSyle}>

                        <Text>{this.state.showRightContant}</Text>
                    </View>
                </View>

            </View>
        );
    }

    _onMenuItemSelected(leftContant) {
        this.setState({
            showRightContant: leftContant,
        });

    }
}

const styles = StyleSheet.create({

    flex: {
        flex: 1,
    },
    flexDirection: {
        flexDirection: "row",
    },
    center: {
        justifyContent: "center",
        alignItems: "center",
    },
    leftMenuStyle: {

        borderRightColor: "grey",
        borderRightWidth: 1,
    },
    rightContantSyle: {
        flex: 1,

    },

    container: {
        flex: 1,
        backgroundColor: "#F5FCFF",

    },

});
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。