RN开发积累

这篇博客详细介绍了React Native开发中的一些关键知识点,包括组件导入方式、PureComponent的使用、即将更改的生命周期方法、React上下文、PanResponder的事件处理、flex布局以及Redux的状态管理。还涉及到JSX语法、渐变色、定时器的使用和对象赋值等实用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、React组件可以通过两种方式导入另一个组件

https://www.cnblogs.com/soyxiaobi/p/9573897.html
1、import(ES6)
最终通过Babel转换成CommonJS

export default component... 导出方式

import component from './component'

如果需要通过动态路径动态加载组件,在class里面(ES6)语法使用import会报下面错误:
Module build failed: SyntaxError: ‘import’ and ‘export’ may only appear at the top level
这时候使用require方法能很好解决 var xxx = require(‘xxx’)

2、require(CommonJS)

module.exports = component  导出方式

const component = require('./component')

在这里插入图片描述

2、组件引用方式
1、
 <FlatList   ref = { flatList => this.sectionList = flatList} />

this.sectionList

2、
 <FlatList  ref=‘sectionList’ />

this.refs.sectionList

3、PureComponent

继承PureComponent时,不能再重写shouldComponentUpdate,否则会引发警告;
继承PureComponent时,进行的是浅比较,也就是说,如果是引用类型的数据,只会比较是不是同一个地址,而不会比较具体这个地址存的数据是否完全一致;
将 const words = this.state.words; 改为const words = this.state.words.slice(0); 重新渲染

4、即将更改的生命周期

https://www.imooc.com/article/27954?block_id=tuijian_wz

(1) UNSAFE_componentWillMount
(2) UNSAFE_componentWillReceiveProps
(3) UNSAFE_componentWillUpdate。
getDerivedStateFromProps
getSnapshotBeforeUpdate

5、 React 上下文(Context)

getChildContext 定义在父组件中,指定子组件可以使用的信息
childContextTypes 定义在父组件中,getChildContext 指定的传递给子组件的属性需要先通过 childContextTypes 来指定,不然会产生错误
子组件需要通过 contextTypes 指定需要访问的元素。 contextTypes 没有定义, context 将是一个空对象。

父组件
getChildContext() {
    var skuId = "";
    var questionId = "";
    if (this.props.skuId) {
      skuId = this.props.skuId;
    }
    if (this.props.questionId) {
      questionId = this.props.questionId;
    }
    return {
      skuId: skuId,
      questionId: questionId,
    }
  }


JDTHReactCustomerQA.childContextTypes = {
  skuId: PropTypes.string,
  questionId: PropTypes.string,
}


子组件
  static contextTypes = {
        skuId: PropTypes.string,
    };


this.context.skuId

6、PanResponder
componentWillMount(evt, gestureState){

    this._panResponder=PanResponder.create({

      onStartShouldSetPanResponder:this.onStartShouldSetPanResponder,
      onMoveShouldSetPanResponder:this.onMoveShouldSetPanResponder,
      onPanResponderGrant:this.onPanResponderGrant,
      onPanResponderMove:this.onPanResponderMove,
      onPanResponderRelease:this.onPanResponderEnd,
      onPanResponderTerminate:this.onPanResponderEnd,

    });
  }

onStartShouldSetPanResponder:用户开始触摸屏幕的时候,是否愿意成为响应者;默认返回false,无法响应,当返回true的时候则可以进行之后的事件传递。

onMoveShouldSetPanResponder:在每一个触摸点开始移动的时候,再询问一次是否响应触摸交互;

onPanResponderGrant:开始手势操作,也可以说按下去。给用户一些视觉反馈,让他们知道发生了什么事情!(如:可以修改颜色)

onPanResponderMove:最近一次的移动距离.如:(获取x轴y轴方向的移动距离 gestureState.dx,gestureState.dy)

onPanResponderRelease:用户放开了所有的触摸点,且此时视图已经成为了响应者。

onPanResponderTerminate:另一个组件已经成为了新的响应者,所以当前手势将被取消。

  //用户开始触摸屏幕的时候,是否愿意成为响应者;
  onStartShouldSetPanResponder(evt, gestureState){
   		return true;
  }
  //在每一个触摸点开始移动的时候,再询问一次是否响应触摸交互;
  onMoveShouldSetPanResponder(evt, gestureState){
   return true ;
  }

//开始手势操作。
onPanResponderGrant(evt, gestureState){
    console.log('onPanResponderGrant...');
  
  }

这三个点其实就是对象的扩展运算符,说白了就是把panHandlers对象里面所有的属性填充到View中。
<View {…this._panResponder.panHandlers} />

7、 布局篇flex在这里插入图片描述


//位置
position:‘absolute’ ‘relative’

left | right | top | bottom | width | height
max< Width | Height >
min< Width | Height >

//内边距
padding:10
padding< Vertical | Horizontal |Top | Left | Bottom | Right |>

//外边距
margin:10
margin< Vertical | Horizontal |Top | Left | Bottom | Right |>

//边框
borderWidth:10
border< Top | Left | Bottom | Right |>Width

//flex
flexDirection : row | row-reverse | column | column-reverse
flexWrap : wrap | nowrap
justifyContent : flex-start | flex-end | center | space-between | space-around
alignItems : flex-start | flex-end | center | stretch
alignSelf: auto | flex-start | flex-end | center | stretch
flex : 1 | 2 | 3

//边框颜色
borderColor :‘red’
border<Bottom | Left | Right | Top>Color

8、 JSX中的{}

export default class Bananas extends Component {
  render() {
    let pic = {
      uri: 'https://upload.wikimedia.org/wikipedia/commons/d/de/Bananavarieties.jpg'
    };
    return (
      <Image source={pic} style={{width: 193, height: 110}} />
    );
  }
}


请注意{pic}外围有一层括号,我们需要用括号来把pic这个变量嵌入到 JSX 语句中。括号的意思是括号内部为一个 js 变量或表达式,需要执行后取值。因此我们可以把任意合法的 JavaScript 表达式通过括号嵌入到 JSX 语句中。

9、渐变色
<LinearGradient
                start={{x: 0, y: 0}} 
                end={{x: 1, y: 0}}
                colors = {['#F20000', '#FF4F18']}
                style ={styles.drawButton}
                >
                <JDText style={styles.buttonText}>{this.props.buttonText}</JDText>
                </LinearGradient>
10、setTimeout 和 setInterval
  • setTimeout(fn,t),超时调用,超过时间t,就执行fn。
  • setInterval(fn,t),间歇调用,调用周期t,执行fn。

二者调用后,均返回一个数值ID,此ID是代码的唯一标识符,可以通过它来取消尚未执行的调用。

  • clearTimeout(id)
  • clearInterval(id)。

取消间歇调用的重要性要远远高于取消超时调用,因为在不加干涉的情况下,间歇调用将会一直执行到页面卸载。

1、setTimeout(fn,t)中t告诉JS再过多久把当前任务添加到队列中。并不是执行的到setTimeout就添加任务。如果队列是空,那么添加的代码会立即执行;如果队列不空,那么它就要等前面的代码执行完了以后在执行。

2、setInterval(fn,t),在间歇调用时,会出现一些意外。

触发下一个func函数时,上一个func还没有执行完,那么此时第二个func会在队列(event loop)中等待,直到第一个函数执行完,第二个func立即执行;

当第一个函数的执行时间特别长,以致于在执行过程中出发了多个func时,就会导致第3个func及以后的函数被忽视。

因为任务队列中不会有两个及以上同一个定时器的回调函数

如何保证每次执行的间隔一样呢,可以使用setTimeout代替setInterval。

var timer = setTimeout(function() { 
   执行内容....
    timer = setTimeout(arguments.callee, 2000)//再次调用
  }, 2000)

11、Object.assign()

Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
Object.assign(target, source);

12、函数立即执行

(function () {
alert(1);
})()

13、模态
  <Modal animationType={'none'}
                transparent={true}
                visible={this.isShowDeletePopup}
                onrequestclose={() => {
                    this.isShowDeletePopup = false
                }}
                onShow={() => {
                    
                }}>
                </Modal>

14、Redux

http://cn.redux.js.org

在这里插入图片描述

### 如何在 HarmonyOS 中嵌套 React Native #### 背景介绍 HarmonyOS 是华为推出的一款分布式操作系统,支持多种设备形态。而 React Native 则是一种用于构建跨平台移动应用的技术框架。要实现 HarmonyOS 和 React Native 的集成,需要解决两者之间的通信以及组件渲染问题。 --- #### 技术挑战与解决方案 1. **JavaScript 与原生平台的通信** React Native 使用 JavaScript 作为主要编程语言,并通过 TurboModules 实现 JS 层与原生层的高效通信[^2]。然而,HarmonyOS 并未直接提供对 TurboModules 的支持,因此需要自定义适配器以完成两者的桥接功能。 2. **UI 渲染机制** React Native 将 `<View>` 组件映射到不同平台上的本地视图(如 iOS 的 `UIView` 或 Android 的 `android.view.View`)。对于 HarmonyOS 来说,则需将其映射至对应的 UI 控件体系[^1]。 3. **项目结构调整** 在传统的 React Native 项目中,默认会生成 Android 和 iOS 子模块目录[^3]。而在 HarmonyOS 场景下,这些默认配置不再适用,开发者需要重新设计工程结构并引入必要的依赖库。 --- #### 集成步骤概述 以下是将 React Native 嵌入 HarmonyOS 应用的一个可行方案: #### 一、初始化环境准备 确保已安装 Node.js 及 npm/yarn 工具链,并下载最新版本的 React Native CLI 客户端工具包。 ```bash npm install -g react-native-cli ``` 接着克隆官方示例仓库或者新建空白 RN 工程: ```bash react-native init MyHybridApp ``` #### 二、定制化编译流程 由于 HarmonyOS 不兼容标准 Gradle 构建脚本,所以必须调整 build.gradle 文件内容使其适应新的 SDK 版本号及其他参数设置需求。 例如编辑 android/app/build.gradle 添加如下片段: ```groovy defaultConfig { ... ndk { abiFilters 'armeabi-v7a', 'arm64-v8a' } } dependencies { implementation project(':harmonyos-sdk') } ``` 同时记得同步更新 settings.gradle 加载额外插件路径: ```gradle include ':app', ':harmonyos-sdk' project(':harmonyos-sdk').projectDir = new File(rootProject.projectDir, '../path/to/sdk') ``` #### 三、扩展核心能力接口 针对特定业务逻辑场景下的数据交换操作,可通过注册全局事件监听器方式建立双向消息传递渠道: ```javascript import {NativeEventEmitter} from 'react-native'; const emitter = new NativeEventEmitter(RNInstance); emitter.addListener('onMessageFromHarmonyOs', (eventData) => { console.log(`Received message: ${JSON.stringify(eventData)}`); }); ``` 与此同时,在 Java/Kotlin 端也需要暴露相应 API 方法供调用方发起请求: ```java public class MessageBridge extends ReactContextBaseJavaModule implements LifecycleEventListener { private final String MODULE_NAME = "MessageBridge"; public MessageBridge(ReactApplicationContext reactContext){ super(reactContext); this.getReactApplicationContext().addLifecycleEventListener(this); } @Override public String getName(){ return MODULE_NAME; } @ReactMethod public void sendMessageToJs(String payload){ WritableMap params = Arguments.createMap(); params.putString("data",payload); getReactApplicationContext() .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) .emit("onMessageFromHarmonyOs",params); } } ``` 最后别忘了声明该类为可用服务清单项之一以便动态加载实例对象: ```xml <service android:name=".MessageBridge"/> ``` --- #### 总结说明 尽管目前尚无成熟完善的开源案例可供参考学习,但从理论角度出发完全可以借助现有技术手段达成预期目标效果。不过实际开发过程中难免遇到各种未知难题阻碍进度推进速度,建议多查阅相关资料积累经验教训逐步优化完善整体设计方案。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值