ReactNative自定义组件

2024-08-24 08:48

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

文章目录

  • ReactNative自定义组件
    • 组件
    • 例子
      • 标题组件
      • LinearLayout组件
    • 性能优化
      • 渲染优化

ReactNative系列-文章

ReactNative自定义组件

组件

一个ReactNative的APP界面其实是各种组件的组合,但是官方给我们提供的组件或许在样式或功能上不能满足实际的需求,所以在开发过程中,我们不可避免的需要写一些新的组件以满足项目需求。那么,它的自定义组件会有什么类型区别呢?例如说,这个组件的主要作用是“部件(widget)”还是“布局(layout)”。本人从ReactNative自定义组件上的思考多数来自于安卓的自定义控件思想。

以安卓的自定义控件为例,安卓上的自定义控件主要是继承View或ViewGroup来具体实现,前者的作用主要是提供部件(widget)的功能,后者主要是提供布局(layout)的功能。再举个例子,我们可能需要针对具体样式去实现一个标题栏,这个标题栏不需要作为容器去承载其它的控件,它仅仅只是一个最基本的标题view,所以它主要是提供部件(widget)的功能。

而ReactNative中的自定义组件,假设从功能属性大致也可以区分为widget和layout,那么我们在编写组件的时候,主要的区别即是在于this.props.children。当然,React的核心思想还是component组件,这个分类仅在于我的理解。如果不了解this.props.children,可以去看我的这篇props详解。

一个ReactNative自定义组件基本流程如下:

  1. 继承Component或PureComponent实现render()方法。
  2. 定义组件属性字段及其类型,以及是否必须,如不必须则默认字段值是什么。
  3. 绑定点击或者触摸等事件方法,执行前需要判空。

例子

标题组件

以一个标题组件为例,它主要功能是部件(widget),所以我们不需要去定义this.props.children。

模拟器使用安卓。

import React from 'react';
import { View, StatusBar, Image, Text, TouchableOpacity, StyleSheet } from 'react-native';
import PropTypes from 'prop-types';export default class Title extends React.Component {static propTypes = {title: PropTypes.string,onBackPress: PropTypes.func,onMenuPress: PropTypes.func}// 定义属性字段的默认值static defaultProps = {title: '',onBackPress: undefined,onMenuPress: undefined}constructor(props) {super(props);// 左边:创建了this.backPress变量。右边:创建一个与backPress()相同的函数,它将绑定到这个组件,然后赋值给this.backPress变量this.backPress = this.backPress.bind(this); this.menuPress = this.menuPress.bind(this);}backPress() {if(this.props.onBackPress) {// 判断属性onBackPress是否传入函数,传了就执行它this.props.onBackPress();}}menuPress() {if(this.props.onMenuPress) {this.props.onMenuPress();}}render() {return(<View style={styles.container}><StatusBar backgroundColor="#008577" barStyle="light-content"/><TouchableOpacity style={styles.back}onPress={this.backPress}><Image source={require('../../static/images/back.png')}style={{marginStart: 12}}/></TouchableOpacity><Text style={styles.title}>{this.props.title}</Text><TouchableOpacity style={styles.menu}onPress={this.menuPress}><Image source={require('../../static/images/menu.png')}style={{marginEnd: 12}}/></TouchableOpacity></View>)}
}const styles = StyleSheet.create({container: {flexDirection: 'row',alignItems: 'center',backgroundColor: '#008577',height: 50},back: {justifyContent: 'center',alignItems: 'flex-start',height: 50,width: 50},title: {flexGrow: 1,textAlign: 'center',color: '#ffffff',fontSize: 18},menu: {justifyContent: 'center',alignItems: 'flex-end',height: 50,width: 50}
})

具体解释请看注释。在其它组件中对于该组件的调用:

<Title title="标题"onBackPress={()=>{ToastAndroid.show('back', ToastAndroid.SHORT);}}onMenuPress={()=>{ToastAndroid.show('menu', ToastAndroid.SHORT);}}/>

演示:

LinearLayout组件

前一个例子不需要去定义this.props.children,而LinearLayout组件是模仿安卓原生平台的LinearLayout,它的主要功能是布局layout,所以这是它们两者之间最大的区别。这里的LinearLayout组件当然没有安卓原生那么完备,仅简单示例。

import React, { Component } from 'react';
import { View, StyleSheet } from 'react-native';
import PropTypes from 'prop-types';export default class LinearLayout extends Component {static propTypes = {orientation: PropTypes.string,gravity: PropTypes.string,}static defaultProps = {orientation: 'vertical',gravity: undefined,}render() {return(<View style={{flexDirection: (this.props.orientation === 'horizontal') ? 'row' : 'column'}}>{this.props.children}</View>)}
}

其它组件对于该组件的调用:

import React, { Component } from 'react';
import { View, ToastAndroid, Button, Text } from 'react-native';
import Title from './Title';
import LinearLayout from './LinearLayout';export default class App extends Component {constructor(props) {super(props);this.state = {orientation: 'vertical'}}render() {return (<View style={{ flexDirection: 'column', flex: 1 }}><Titletitle='标题'onBackPress={() => {ToastAndroid.show('back', ToastAndroid.SHORT);}}onMenuPress={() => {ToastAndroid.show('menu', ToastAndroid.SHORT);}} /><Button title='切换' onPress={() => {if (this.state.orientation === 'vertical') {this.setState({orientation: 'horizontal'})} else {this.setState({orientation: 'vertical'})}}} /><LinearLayout orientation={this.state.orientation}><Text>1</Text><Text>2</Text><Text>3</Text></LinearLayout></View>);}
}

演示:

性能优化

渲染优化

渲染优化在这里主要还是针对组件树的渲染,我们可以有两种办法来实现,二选一:1. 继承PureComponent实现组件;2. 实现shouldComponentUpdate()方法。不了解看以看我的这两篇:Component与PureComponent的区别/ shouldComponentUpdate机制。

更多的请查看这里ReactNative性能优化总结。

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



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

相关文章

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

基于Spring实现自定义错误信息返回详解

《基于Spring实现自定义错误信息返回详解》这篇文章主要为大家详细介绍了如何基于Spring实现自定义错误信息返回效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录背景目标实现产出背景Spring 提供了 @RestConChina编程trollerAdvice 用来实现 HTT

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

Spring组件初始化扩展点BeanPostProcessor的作用详解

《Spring组件初始化扩展点BeanPostProcessor的作用详解》本文通过实战案例和常见应用场景详细介绍了BeanPostProcessor的使用,并强调了其在Spring扩展中的重要性,感... 目录一、概述二、BeanPostProcessor的作用三、核心方法解析1、postProcessB

kotlin中的行为组件及高级用法

《kotlin中的行为组件及高级用法》Jetpack中的四大行为组件:WorkManager、DataBinding、Coroutines和Lifecycle,分别解决了后台任务调度、数据驱动UI、异... 目录WorkManager工作原理最佳实践Data Binding工作原理进阶技巧Coroutine

SpringBoot自定义注解如何解决公共字段填充问题

《SpringBoot自定义注解如何解决公共字段填充问题》本文介绍了在系统开发中,如何使用AOP切面编程实现公共字段自动填充的功能,从而简化代码,通过自定义注解和切面类,可以统一处理创建时间和修改时间... 目录1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3

dubbo3 filter(过滤器)如何自定义过滤器

《dubbo3filter(过滤器)如何自定义过滤器》dubbo3filter(过滤器)类似于javaweb中的filter和springmvc中的intercaptor,用于在请求发送前或到达前进... 目录dubbo3 filter(过滤器)简介dubbo 过滤器运行时机自定义 filter第一种 @A