一文学会React Native(保姆级教程) 持续更新
React Native 官网如果react基础有些遗忘,可以打开React官网查看介绍React Native 是一个使用React和应用平台的原生功能来构建 Android 和 iOS 应用的开源框架。通过 React Native,您可以使用 JavaScript 来访问移动平台的 API,以及使用 React 组件来描述 UI 的外观和行为:一系列可重用、可嵌套的代码。ReactNativ
如果react基础有些遗忘,可以打开React官网查看
介绍
React Native 是一个使用React和应用平台的原生功能来构建 Android 和 iOS 应用的开源框架。通过 React Native,您可以使用 JavaScript 来访问移动平台的 API,以及使用 React 组件来描述 UI 的外观和行为:一系列可重用、可嵌套的代码。
ReactNative环境搭建相比较繁琐 按照React Native 官网进行安装,就可以了,如果失败可以多试几次,也可以在下方留言,在这里就不再多说了
初始化项目
npx react-native init myApp
安装投影工具
使用方法:
- 下载 scrcpy
- 手机通过usb连接电脑
- 双击打开工具即可
React Native基础
文件目录结构
│ App.js --- 项目的根组件
│ index.js --- 项目的入口文件
│ package.json --- 项目的描述文件
│ .eslintrc.js --- eslint的配置文件
│ .prettierrc.js --- 格式化配置文件
│ android --- 编译安卓相关
│ ios --- 编译ios相关
jsx
jsx(全称是 JavaScript xml
)格式同学们都比较熟悉了,但是为了新来的同学再写一遍
import React from 'react';
import { View, Text } from 'react-native';
const Index = () => <View>
<Text>JSX</Text>
</View>
export default Index;
RN样式与web样式不同之处
flex布局
-
React Native 中使用 flexbox 规则来指定某个组件的子元素的布局,使其可以在不同屏幕尺寸提供一致的布局
-
flexDirection
的默认值是column
而不是row
,而flex
也只能指定一个数字值。 -
flex值越大所占的比例越大
样式继承
背景颜色、字体颜色、字体大小等没有继承,需要单独设置
单位
React Native 中的尺寸都是无单位的,表示的是与设备像素密度无关的逻辑像素点。
- 不能加
px
单位 - 不能加
vw vh
等单位 - 可以加百分比单位
屏幕宽度与高度
import {Dimensions } from "react-native";
const screenWidth = Math.round(Dimensions.get('window').width);
const screenHeight = Math.round(Dimensions.get('window').height);
标签
View
- 相当于以前
web
中的div - 不支持设置字体大小,字体颜色等
- 不能直接放文本内容
- 不支持直接绑定点击事件 (一般使用
TouchableOpacity
来代替)
Text
文本标签
- 文本标签 可以设置字体颜色、大小等
- 支持绑定点击事件
TouchableOpacity
可以绑定点击事件的块级标签
- 相当于块级的容器
- 支持绑定点击事件
onPress
- 可以设置点击时的透明度
<TouchableOpacity activeOpacity={0.5} onPress={this.handleOnPress} >
</TouchableOpacity>
Image
图片标签 引入图片的方式
-
渲染本地图片时
<Image source={require("../girl.png")} />
-
渲染网络图片时,必须加入宽度和高度
<Image source={{uri:"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1590514654506&di=38fa919d4c78fb776536b922bb94eec3&imgtype=0&src=http%3A%2F%2Fimages.ali213.net%2Fpicfile%2Fpic%2F2013%2F03%2F28%2F927_xgzwl%2520%25281%2529.jpg"}} style={{width:200,height:300}} />
-
在 Android 上支持 GIF 和 WebP 格式图片
默认情况下 Android 是不支持 GIF 和 WebP 格式的。你需要在
android/app/build.gradle
文件中根据需要手动添加以下模块:dependencies { // 如果你需要支持Android4.0(API level 14)之前的版本 implementation 'com.facebook.fresco:animated-base-support:1.3.0' // 如果你需要支持GIF动图 implementation 'com.facebook.fresco:animated-gif:2.0.0' // 如果你需要支持WebP格式,包括WebP动图 implementation 'com.facebook.fresco:animated-webp:2.1.0' implementation 'com.facebook.fresco:webpsupport:2.0.0' // 如果只需要支持WebP格式而不需要动图 implementation 'com.facebook.fresco:webpsupport:2.0.0' }
之后 重启项目
ImageBackground
一个可以使用图片当作背景的容器,相当于以前的
div+背景图片
引入图片
<ImageBackground source={...} style={{width: '100%', height: '100%'}}>
<Text>Inside</Text>
</ImageBackground>
TextInput
输入框组件
- 可以通过
onChangeText
事件来获取输入框的值
<TextInput
style={{ height: 40, borderColor: 'gray', borderWidth: 1 }}
onChangeText={text => onChangeText(text)}
value={value}
/>
语法
插值表达式
import React from 'react'
import {View,Text} from 'react-native'
const Index = ()=> <View>
<Text>{'你好'}</Text>
<Text>{55555}</Text>
</View>
export default Index
组件
- 类组件
- 适合复杂的场景
- 有state
- 有生命周期
函数组件
- 函数组件
- 没有state (通过hooks可以有) useState 类似 const [value,change] = useState(‘124’)
- 没有生命周期(通过hooks可以有)
- 适合简单的场景
mobox
mobox 相对于redux更简单易用,更适合react-Native的开发
简单,可扩展的状态管理
mobox使用方法和其他的状态管理工具类似
- 安装依赖
mobx
核心库mobx-react
方便在react中使用mobx技术的库@babel/plugin-proposal-decorators
让rn
项目支持es7
的装饰器语法的库
yarn add mobx mobx-react @babel/plugin-proposal-decorators
- 在
babel.config.js
添加以下配置
plugins: [
['@babel/plugin-proposal-decorators', { 'legacy': true }]
]
- 新建文件
mobx\index.js
用来存放 全局数据
import { observable, action } from "mobx";
class RootStore {
// observable 表示数据可监控 表示是全局数据
@observable name = "hello";
// action行为 表示 changeName是个可以修改全局共享数据的方法
@action changeName(name) {
this.name = name;
}
}
export default new RootStore();
- 在根组件挂载
需通过Provider来挂载和传递
import React, { Component } from 'react';
import { View} from 'react-native';
import rootStore from "./mobx";
import { Provider} from "mobx-react";
class Index extends Component {
// 正常
render() {
return (
<View >
<Provider rootStore={rootStore} >
<Sub1></Sub1>
</Provider>
</View>
);
}
}
- 在其他组件内使用
import React, { Component } from 'react';
import { View, Text } from 'react-native';
import {inject,observer } from "mobx-react";
@inject("rootStore") // 注入 用来获取 全局数据的
@observer // 当全局发生改变了 组件的重新渲染 从而显示最新的数据
class Sub1 extends Component {
changeName = () => {
// 修改全局数据
this.props.rootStore.changeName(Date.now());
}
render() {
console.log(this);
### return (
<View><Text onPress={this.changeName}>{this.props.rootStore.name}</Text></View>
);
}
}
export default Index;
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)