ReactNative 自定义标题栏 ReactNative 自定义导航栏

2024-06-03 05:58

本文主要是介绍ReactNative 自定义标题栏 ReactNative 自定义导航栏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

先上代码,配合代码讲解一下使用方法,
github地址:https://github.com/lizhuoyuan/react-native-navigationBar
我这有用到一个屏幕适配工具类,自己写的,使用方法和代码 请点这里

这里写图片描述
这里写图片描述

/*** Created by 李卓原 on 2018/7/6.* email: zhuoyuan93@gmail.com**/import React from 'react';
import {Text,StyleSheet,View,Image,ImageBackground,TouchableOpacity,Platform,StatusBar,ViewPropTypes
} from 'react-native';//ScreenUtil 为屏幕尺寸适配的工具类
import * as ScreenUtil from "../utils/ScreenUtil";
import PropTypes from 'prop-types';const NAV_BAR_HEIGHT_ANDROID = 50;
const NAV_BAR_HEIGHT_IOS = 44;const StatusBarShape = {barStyle: PropTypes.oneOf(['light-content', 'default', 'dark-content']),hidden: PropTypes.bool,backgroundColor: PropTypes.string,
};class NavigationBar extends React.Component {static propTypes = {statusBar: PropTypes.shape(StatusBarShape),showBackgroundIMG: PropTypes.bool,style: ViewPropTypes.style,title: PropTypes.string,titleView: PropTypes.element,titleLayoutStyle: ViewPropTypes.style,showLeft: PropTypes.bool,leftText: PropTypes.string,leftTextStyle: ViewPropTypes.style,showleftImg: PropTypes.bool,leftButton: PropTypes.element,showRight: PropTypes.bool,rightText: PropTypes.string,rightTextStyle: ViewPropTypes.style,rightButton: PropTypes.element,};static defaultProps = {statusBar: {barStyle: 'default',hidden: false,},showLeft: true,showleftImg: true,  //是否显示返回箭头leftText: '',   //返回键位置的文字showRight: false,rightText: '更多',showBackgroundIMG: true  //是否有背景图片};constructor(props) {super(props);}render() {let leftButton = this._renderLeft();let rightButton = this._renderRight();let statusBar = <View><StatusBar {...this.props.statusBar}/></View>;let titleView = this.props.titleView ? this.props.titleView :<Text style={[styles.titleStyle, this.props.titleLayoutStyle]}>{this.props.title}</Text>;let content = <View style={styles.content}>{leftButton}<View style={styles.titleView}>{titleView}</View>{rightButton}</View>;return (<ImageBackground source={this.props.showBackgroundIMG ? require('IMG/app_bar.png') : null}style={[styles.container, this.props.style]}>{statusBar}{content}</ImageBackground>)}_renderLeft() {let {leftButton, leftTextStyle, showLeft, navigation, onLeftClick, leftText, showleftImg} = this.props;if (!showLeft) {return null;}if (leftButton == null) {return (<TouchableOpacity onPress={() => {if (onLeftClick) {onLeftClick();} else {if (navigation) navigation.goBack()}}}><View style={styles.leftContainer}>{showleftImg ?<Image source={require('IMG/back.png')}style={{width: ScreenUtil.scaleSize(25),height: ScreenUtil.scaleSize(25)}}/>: null}<Text style={[styles.leftRightStyle, leftTextStyle]}>{leftText}</Text></View></TouchableOpacity>)}return leftButton;}_renderRight() {let {rightButton, rightTextStyle, showRight, onRightClick, rightText} = this.props;if (!showRight) {return null;}if (rightButton == null) {return (<TouchableOpacity onPress={() => {if (onRightClick) {onRightClick()}}}><View><Text style={[styles.leftRightStyle, rightTextStyle]}>{rightText}</Text></View></TouchableOpacity>)}return rightButton;}
}/*** //selector:这是你自己编写的一个函数。这个函数声明了你的组件需要整个 store 中的哪一部分数据作为自己的 props* 如果用不到redux这个方法可以删除* @param store* @returns {{color: *}}*/
function changeColor(store) {return {color: store.changeColorReducer.color}
}const styles = StyleSheet.create({container: {//backgroundColor:'green',width: ScreenUtil.screenW,height: ScreenUtil.scaleSize(58),justifyContent: 'center',},content: {justifyContent: 'space-between',flexDirection: 'row',alignItems: 'center',height: Platform.OS === 'ios' ? NAV_BAR_HEIGHT_IOS : NAV_BAR_HEIGHT_ANDROID,},titleView: {justifyContent: 'center',alignItems: 'center',position: 'absolute',left: 40,right: 40,top: 0,bottom: 0,},titleStyle: {fontSize: ScreenUtil.setSpText(18),color: 'white'},leftRightStyle: {color: 'white',fontSize: ScreenUtil.setSpText(14)},leftContainer: {marginLeft: ScreenUtil.scaleSize(17),flexDirection: 'row',alignItems: 'center'}
});// 包装 component ,注入 dispatch 和 state 到其默认的 connect(selector)(App) 中;
/*** 把这个组件用connect包裹住就能拿到store。注意export default已经拿到下面来了,上面的class前面的导出要删掉用redux的话需要第一种方法导出,已注释掉*/
//export default connect(changeColor)(withNavigation(NavigationBar));
//用不到redux推荐在定义类的时候直接导出,类定义为 export default class ...//当这个组件拿不到this.props.navigation时,可使用withNavigation
//withNavigation是一个更高阶的组件,它将导航道具传递给一个包装组件。
//当您无法直接将导航道具传递到组件时,或者在深度嵌套子节点的情况下不希望传递导航道具时,它非常有用。
//导出方式:export default withNavigation(NavigationBar);
export default NavigationBar;

关于withNavigation的使用

在页面使用:

常规页面插入
    render() {return (<View style={{flex: 1}}>{this._renderNav()}...</View>)}_renderNav() {return (<NavigationBar
                    title={'Main'}//showLeft={false}onLeftClick={()=>{alert('a')}}leftButton={()=><View><Text>自定义左侧按钮</Text></View>}statusBar={{barStyle: 'dark-content',backgroundColor: 'white',hidden: false,//true则隐藏}}/>)}
配合ReactNavigation使用
const RootStack = createStackNavigator({TaskList: {screen: TaskListPage},TaskDetails: {screen: TaskDetailsPage}
}, {navigationOptions: ({navigation}) => ({header: <NavigationBar title={navigation.state.routeName}showLeft={navigation.state.routeName !== 'TaskList'}navigation={navigation}/>})
});
属性:
PropTypeDefaultDescription
styleViewPropTypes.style-标题栏的样式
showBackgroundIMGbooltrue背景为一个图片
titlestring-标题使用的字符串
titleLayoutStyleViewPropTypes.style-标题文字的样式
titleViewPropTypes.element-替换标题文字的组件
leftButtonPropTypes.element-自定义左侧按钮
leftTextstring-左侧返回按钮的文字
leftTextStyleViewPropTypes.style-替换标题文字的组件
showLeftbooltrue是否显示返回按钮
leftImgsource的参数ImageSourcePropType左侧图片的地址
showleftImgbooltrue是否显示标题的后退按钮,需自行替换成其他Image
showLeftbooltrue是否显示返回按钮
onLeftClickfuncthis.props.navigation.goBack()左侧按钮的点击事件(默认为ReactNavigation的goback)
showRightboolfalse是否显示右侧按钮
rightTextstring更多右侧按钮的文字
rightImgsource的参数ImageSourcePropType右侧图片的地址,默认不传则不显示
rightTextStyleViewPropTypes.style-是否显示返回按钮
rightButtonPropTypes.element-自定义右侧按钮
onRightClickPropTypes.func-右侧按钮的点击事件
statusBar{ barStyle: PropTypes.oneOf([‘light-content’, ‘default’, ‘dark-content’]), hidden: PropTypes.bool, backgroundColor: PropTypes.string,}{ barStyle: ‘default’, hidden: false,}自定义状态栏

可以自己传入statusBar,默认值为:

 statusBar: {barStyle: 'default',hidden: false, //true则隐藏statusBar}

样式大概如此,颜色可以自己定义,
左侧按钮,中间文字,和右侧按钮都可以自己传入一个自己写的布局。
后续会完善功能和方法。

github地址

这篇关于ReactNative 自定义标题栏 ReactNative 自定义导航栏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026172

相关文章

SpringBoot 自定义消息转换器使用详解

《SpringBoot自定义消息转换器使用详解》本文详细介绍了SpringBoot消息转换器的知识,并通过案例操作演示了如何进行自定义消息转换器的定制开发和使用,感兴趣的朋友一起看看吧... 目录一、前言二、SpringBoot 内容协商介绍2.1 什么是内容协商2.2 内容协商机制深入理解2.2.1 内容

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

Oracle type (自定义类型的使用)

oracle - type   type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要特殊的格式, 如将name定义为(firstname,lastname)的形式,我们想把这个作为一个表的一列看待,这时候就要我们自己定义一个数据类型 格式 :create or repla

HTML5自定义属性对象Dataset

原文转自HTML5自定义属性对象Dataset简介 一、html5 自定义属性介绍 之前翻译的“你必须知道的28个HTML5特征、窍门和技术”一文中对于HTML5中自定义合法属性data-已经做过些介绍,就是在HTML5中我们可以使用data-前缀设置我们需要的自定义属性,来进行一些数据的存放,例如我们要在一个文字按钮上存放相对应的id: <a href="javascript:" d

一步一步将PlantUML类图导出为自定义格式的XMI文件

一步一步将PlantUML类图导出为自定义格式的XMI文件 说明: 首次发表日期:2024-09-08PlantUML官网: https://plantuml.com/zh/PlantUML命令行文档: https://plantuml.com/zh/command-line#6a26f548831e6a8cPlantUML XMI文档: https://plantuml.com/zh/xmi

argodb自定义函数读取hdfs文件的注意点,避免FileSystem已关闭异常

一、问题描述 一位同学反馈,他写的argo存过中调用了一个自定义函数,函数会加载hdfs上的一个文件,但有些节点会报FileSystem closed异常,同时有时任务会成功,有时会失败。 二、问题分析 argodb的计算引擎是基于spark的定制化引擎,对于自定义函数的调用跟hive on spark的是一致的。udf要通过反射生成实例,然后迭代调用evaluate。通过代码分析,udf在

鸿蒙开发中实现自定义弹窗 (CustomDialog)

效果图 #思路 创建带有 @CustomDialog 修饰的组件 ,并且在组件内部定义controller: CustomDialogController 实例化CustomDialogController,加载组件,open()-> 打开对话框 , close() -> 关闭对话框 #定义弹窗 (CustomDialog)是什么? CustomDialog是自定义弹窗,可用于广告、中

mybatis框架基础以及自定义插件开发

文章目录 框架概览框架预览MyBatis框架的核心组件MyBatis框架的工作原理MyBatis框架的配置MyBatis框架的最佳实践 自定义插件开发1. 添加依赖2. 创建插件类3. 配置插件4. 启动类中注册插件5. 测试插件 参考文献 框架概览 MyBatis是一个优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射,为开发者提供了极大的灵活性和便利性。以下是关于M