本章将介绍以下配方:
React Native 是一个使用 Javascript 和 React 构建移动应用的框架。许多人认为,使用 React Native,您可以制作一些“移动 web 应用”或“混合应用”(如 Ionic、PhoneGap 或 Sencha),但您可以构建一个本机应用,因为 React Native 将您的 React 代码转换为适用于 Android 的 Java 或适用于 iOS 应用的 Objective-C。React Native 使用大多数 React 概念,例如组件、道具、状态和生命周期方法。
React Native的优点:
对 Windows的要求:
Mac的要求:
在此配方中,我们将构建一个 React-Native 应用,并了解 React 和 React-Native 之间的主要区别。
准备要创建新的 React 本机应用,我们需要安装react-native-cli
包:
npm install -g react-native-cli
怎么做。。。
现在,要创建我们的第一个应用:
react-native init MyFirstReactNativeApp
/usr/bin/ruby -e "$(curl -fsSL
https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew update
brew install watchman
react-native start
Sometimes you can get errors from Watchman, for example,
Watchman error: too many pending cache jobs. Make sure watchman is running for this project.
If you get that error or another, you have to uninstall Watchman by doing:
brew unlink watchman
然后使用以下方法重新安装:
brew update && brew upgrade
brew install watchman
react-native run-ios
or
react-native run-android
现在,我们已经运行了应用,让我们打开代码并稍作修改:
App.js
文件: ...
export default class App extends Component
render() {
return (
console.log
添加到应用中的日志。例如,如果我在我的渲染方法中添加了console.log('==== Debugging my First React Native App! ====');
,我应该看到如下所示:App.js
中看到的代码有点困惑,因为你没有看到标记,或者更糟糕的是,样式是像对象一样创建的,而不是像我们在 React 中那样使用 CSS 文件。我有一些好消息和一些坏消息;坏消息是 React Native 不像 React 那样支持 CSS 和 JSX/HTML 代码。好消息是,一旦您了解到
组件相当于使用、
相当于使用
,并且样式类似于 CSS 模块(对象),其他所有功能都与 React(道具、状态、生命周期方法)相同
- 创建一个新组件(
Home
。为此,我们必须创建一个名为 components 的目录,然后将此文件保存为Home.js
:
// Dependencies
import React, { Component } from 'react';
import { StyleSheet, Text, View } from 'react-native';
class Home extends Component {
render() {
return (
alignItems: 'center',
backgroundColor: '#F5FCFF',
},
home: {
fontSize: 20,
textAlign: 'center',
margin: 10,
}
});
export default Home;
File: components/Home.js
- 在
App.js
中,我们导入Home
组件,并呈现它:
// Dependencies
import React, { Component } from 'react';
import { StyleSheet, Text, View } from 'react-native';
// Components
import Home from './components/Home';
class App extends Component {
render() {
return (
);
}
}
export default App;
File: App.js
它是如何工作的。。。如您所见,创建一个新的 React 本机应用非常简单,但是 React(使用 JSX)和 React 本机(使用带有对象样式的特殊标记)之间存在一些关键区别,即使这些样式也有一些限制,例如,让我们创建一个 flex 布局:
// Dependencies
import React, { Component } from 'react';
import { StyleSheet, Text, View } from 'react-native';
class Home extends Component {
render() {
return (
justifyContent: 'center',
alignItems: 'center'
},
headerText: {
color: 'white'
},
columns: {
flex: 1
},
column1: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
backgroundColor: 'red'
},
column1Text: {
color: 'white'
},
column2: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
backgroundColor: 'blue'
},
column2Text: {
color: 'white'
},
column3: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
backgroundColor: 'orange'
},
column3Text: {
color: 'white'
},
});
export default Home;
File: components/Home.js
您可能不喜欢查看大型文件(我也不喜欢),因此让我们将组件和样式分开:
import { StyleSheet } from 'react-native';
export default StyleSheet.create({
container: {
flex: 1,
height: 100
},
header: {
flex: 1,
backgroundColor: 'green',
justifyContent: 'center',
alignItems: 'center'
},
headerText: {
color: 'white'
},
columns: {
flex: 1
},
column1: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
backgroundColor: 'red'
},
column1Text: {
color: 'white'
},
column2: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
backgroundColor: 'blue'
},
column2Text: {
color: 'white'
},
column3: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
backgroundColor: 'orange'
},
column3Text: {
color: 'white'
},
});
File: components/HomeStyles.js
然后在我们的Home
组件中,我们可以导入样式并以与之前相同的方式使用它们:
// Dependencies
import React, { Component } from 'react';
import { StyleSheet, Text, View } from 'react-native';
// Styles
import styles from './HomeStyles';
...
File: components/Home.js
以下是代码的结果:
但是有一些不寻常的事情。
如您所见,我为
组件(headerText、column1Text 等)创建了样式,这是因为视图组件中不允许使用某些样式。例如,如果您尝试将color: 'white'
属性添加到
组件中,您将看到该属性不起作用,并且标题将包含黑色文本:
使用 React Native 创建待办事项列表在本食谱中,我们将学习如何在 React Native 中处理事件,以及如何通过创建简单的 Todo 列表来处理状态。
怎么做。。。对于这个配方,我创建了一个名为“MySecondReactNativeApp”的新 React 应用:
- 创建一个
src
文件夹并将App.js
文件移到里面。另外,修改此文件以包括我们的待办事项列表:
import React, { Component } from 'react';
import Todo from './components/Todo';
export default class App extends Component {
render() {
return (
);
}
}
File: src/App.js
- 我们的
Todo
组件将是:
import React, { Component } from 'react';
import {
Text,
View,
TextInput,
TouchableOpacity,
ScrollView
} from 'react-native';
import styles from './TodoStyles';
class Todo extends Component {
state = {
task: '',
list: []
};
OnPressAddTask= () => {
if (this.state.task) {
const newTask = this.state.task;
const lastTask = this.state.list[0] || { id: 0 };
const newId = Number(lastTask.id + 1);
this.setState({
list: [{ id: newId, task: newTask }, ...this.state.list],
task: ''
});
}
}
OnPressDeleteTask= id => {
this.setState({
list: this.state.list.filter(task => task.id !== id)
});
}
render() {
const { list } = this.state;
let zebraIndex = 1;
return (
OnChangeText={(value) => this.setState({ task:
value })}
value={this.state.task}
/>
language-jsx"> import { StyleSheet } from 'react-native';
export default StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#F5FCFF',
height: 50
},
list: {
flex: 1
},
header: {
backgroundColor: '#333',
alignItems: 'center',
justifyContent: 'center',
height: 60
},
headerText: {
color: 'white'
},
inputText: {
color: '#666',
height: 40,
borderColor: 'gray',
borderWidth: 1
},
button: {
paddingTop: 10,
paddingBottom: 10,
backgroundColor: '#1480D6'
},
submitText: {
color:'#fff',
textAlign:'center',
paddingLeft : 10,
paddingRight : 10
},
task1: {
flexDirection: 'row',
height: 50,
backgroundColor: '#ccc',
alignItems: 'center',
justifyContent: 'space-between',
paddingLeft: 5
},
task2: {
flexDirection: 'row',
height: 50,
backgroundColor: '#eee',
alignItems: 'center',
justifyContent: 'space-between',
paddingLeft: 5
},
delete: {
margin: 10,
fontSize: 15
},
noTasks: {
flex: 1,
alignItems: 'center',
justifyContent: 'center'
},
noTasksText: {
color: '#888'
}
});
File: src/components/TodoStyles.js
它是如何工作的。。。我们在组件中做的第一件事是设置状态。task
状态用于输入创建新项,list
状态用于保存所有任务项:
state = {
task: '',
list: []
};
TextInput
组件创建了一个输入元素,与 React 中的输入主要区别在于,它没有使用onChange
方法,而是使用onChangeText
,默认获取值,我们可以直接更新我们的状态:
Add a new task"
OnChangeText={(value) => this.setState({ task: value })}
value={this.state.task}
/>
TouchableOpacity
组件用于处理点击事件(React Native 中的onPress
,可以用作按钮。也许你想知道为什么我没有直接使用组件Button
;这是因为在 iOS 上无法为按钮添加背景色,它只能在 Android 上使用背景色。使用TouchableOpacity
(或TouchableHighlight
)可以对样式进行个性化设置,它可以完美地作为一个按钮:
language-jsx"> {list.map((item, i) => {
zebraIndex = zebraIndex === 2 ? 1 : 2;
return (
如果我们没有任何任务,我们将看到“还没有任务,创建一个新任务!”消息。
如您所见,顶部有一个输入,其中有“添加新任务”占位符。让我们添加一些任务:
最后,我们可以通过点击 X 来删除任务;我将删除“支付租金”任务:
从这个基本的 Todo 列表中可以看到,我们学习了如何使用本地状态以及如何在 React Native 中处理单击和更改事件。
还有更多。。。如果要防止用户意外删除任务,可以添加警报,询问用户是否确实要删除所选任务。为此,我们需要从 react native 导入警报组件,并修改 onPressDeleteTask 方法:
import {
Text,
View,
TextInput,
TouchableOpacity,
ScrollView,
Alert
} from 'react-native';
...
OnPressDeleteTask= id => {
Alert.alert('Delete', 'Do you really want to delete this task?', [
{
text: 'Yes, delete it.',
onPress: () => {
this.setState({
list: this.state.list.filter(task => task.id !== id)
});
}
}, {
text: 'No, keep it.'
}
]);
}
...
如果您运行应用并尝试立即删除任务,您将看到此本机警报:
实现 React 导航 V2在本教程中,我们将学习如何在 React 本机应用中实现 React Navigation V2。我们将在各个部分之间创建一个简单的导航。
准备我们需要安装react-navigation
依赖项:
npm install react-navigation
怎么做。。。
让我们实现 React Navigation v2:
- 包括 react navigation 中的
createDrawerNavigation
和DrawerItems
以及我们希望呈现为部分的组件(主页和配置):
// Dependencies
import React, { Component } from 'react';
import { StyleSheet, View, ScrollView, Image } from 'react-
native';
// React Navigation
import { createDrawerNavigator, DrawerItems } from 'react-
navigation';
// Components
import Home from './sections/Home';
import Configuration from './sections/Configuration';
File: App.js
- 在 CustomDrawerComponent 中,我们将呈现 Codejobs 徽标和菜单(您可以根据需要进行修改):
// Custom Drawer Component
// Here we are displaying the menu options
// and customizing our drawer
const CustomDrawerCompOnent= props => (
language-jsx"> // The left Drawer navigation
// The first object are the components that we want to display
// in the Drawer Navigation.
const AppDrawerNavigator = createDrawerNavigator({
Home,
Configuration
},
{
contentComponent: CustomDrawerComponent
});
File: App.js
- 创建 App 类并呈现
AppDrawerNavigator
组件:
class App extends Component {
render() {
return (
);
}
}
// Styles for left Drawer
const styles = StyleSheet.create({
area: {
flex: 1
},
drawer: {
height: 150,
backgroundColor: 'white',
alignItems: 'center',
justifyContent:'center'
},
logo: {
height: 120,
width: 120,
borderRadius: 60
}
});
export default App;
File: App.js
- 创建截面构件;第一个是 Home 组件:
// Dependencies
import React, { Component } from 'react';
import { View, Text, Image, TouchableOpacity } from 'react-native';
// Styles
import styles from './SectionStyles';
class Home extends Component {
// Here we specify the icon we want to render
// in the menu for this option
static navigatiOnOptions= {
drawerIcon: () => (
../img/home.png')}
/>
)
}
render() {
return(
/>
{/* Here is the content of the component */}
);
}
}
export default Home;
File: sections/Home.js
- 以下是配置部分组件:
// Dependencies
import React, { Component } from 'react';
import { View, Text, Image, TouchableOpacity } from 'react-native';
// Styles
import styles from './SectionStyles';
class Configuration extends Component {
// Here we specify the icon we want to render
// in the menu for this option
static navigatiOnOptions= {
drawerIcon: () => (
../img/config.png')}
/>
)
};
render() {
return(
/>
{/* Here is the content of the component */}
section
);
}
}
export default Configuration;
File: sections/Configuration.js
- 您可能已经注意到,我们在两个组件上使用相同的样式,这就是为什么我为这些样式创建了一个单独的文件:
import { StyleSheet } from 'react-native';
export default StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#fff',
alignItems: 'center',
justifyContent: 'center',
},
iconMenu: {
position: 'absolute',
left: 0,
top: 5
},
titleText: {
fontSize: 26,
fontWeight: 'bold',
},
menu: {
width: 80,
height: 80,
},
iconsItem: {
width: 25,
height: 25
}
});
File: sections/sectionStyles.js
- 您可以在存储库(
Chapter14/Recipe3/ReactNavigation/assets
中找到我们正在使用的资产。
它是如何工作的。。。如果所有操作都正确,您应该看到:
正在渲染的第一个组件是Home
组件。如果你点击汉堡包菜单,你会看到抽屉里有两个部分(Home
和Configuration
,分别有各自的图标,顶部有 Codejobs 徽标:
最后,如果单击配置,您也将看到该组件:
如果您再次看到抽屉,您将注意到当前打开的部分在菜单中也处于活动状态(在本例中为“配置”)。
写下你的评论吧 !
推荐阅读
-
混合开发是指结合原生(Native)与网页(Web)技术进行移动应用开发的方法。本文将详细介绍如何利用Ionic3这一流行的混合开发框架,从环境搭建到创建并运行首个应用的全过程。 ...
[详细]
蜡笔小新 2024-12-13 18:21:48
-
前言ReactNative是目前最流行的跨平台框架,并且是Facebook团队开源的项目。架构及实现技术上都有很高的研究价值,本系列就来分析一下Reac ...
[详细]
蜡笔小新 2024-12-12 20:19:17
-
-
本教程旨在指导开发者如何在Mac上设置React Native的开发环境,以进行iOS应用的开发。文中详细介绍了必要的软件安装步骤,包括Xcode、Homebrew、Node.js、Watchman以及React Native CLI等工具的安装方法。 ...
[详细]
蜡笔小新 2024-12-10 10:33:21
-
YB02防水车载GPS追踪器由Yuebiz科技有限公司设计生产,适用于车辆防盗、车队管理和实时追踪等多种场合。 ...
[详细]
蜡笔小新 2024-12-18 14:59:54
-
本文详细介绍了ActivityManagerService (AMS) 的工作原理及其在Android系统中的重要角色。AMS作为system_server进程的一部分,在系统启动时加载,负责管理和协调应用程序中的Activity和服务(Service)。文章将通过具体的接口图和通信流程,帮助读者更好地理解AMS的工作机制。 ...
[详细]
蜡笔小新 2024-12-18 13:07:47
-
本文详细介绍了如何在现有的Android Studio项目中集成JNI(Java Native Interface),包括下载必要的NDK和构建工具,配置CMakeLists.txt文件,以及编写和调用JNI函数的具体步骤。 ...
[详细]
蜡笔小新 2024-12-17 16:46:36
-
本文深入探讨 PHPCMS 平台中的字符串截取函数 str_cut 的使用方法,该函数常用于控制输出的标题或内容摘要长度,有效避免因过长的文本导致的页面布局问题。通过本文,读者将掌握如何灵活运用此函数,包括处理 HTML 标签等高级技巧。 ...
[详细]
蜡笔小新 2024-12-17 15:48:52
-
探讨在构建类似Viber或WhatsApp的聊天应用时,如何有效实现客户端(Web、Android、iOS)与服务器之间的连接。本文将分析使用WebSockets标准及其替代方案的优劣。 ...
[详细]
蜡笔小新 2024-12-16 06:41:39
-
本文探讨了使用React Native框架开发的应用,在通过AppCenter构建iOS版本时遇到的‘CopyPlistFile’命令失败的问题,并提供了详细的解决方案。 ...
[详细]
蜡笔小新 2024-12-14 10:40:06
-
转自:http:www.yybug.comread-htm-tid-15324.html为什么使用Twisted? 如果你并不准备使用Twisted,你可能有很多异议。为什么使用T ...
[详细]
蜡笔小新 2024-12-13 14:57:51
-
随着移动互联网的发展,Web App和Native App之间的竞争日益激烈。对于开发者而言,选择哪一种技术路径更为明智?本文将深入探讨两种应用模式的特点及未来趋势。 ...
[详细]
蜡笔小新 2024-12-13 13:50:17
-
本文介绍了Unity中的响应式编程框架——UniRx,探讨了其在解决异步编程难题中的应用及优势。 ...
[详细]
蜡笔小新 2024-12-12 13:40:42
-
这是一个基于 React 构建的掘金移动版应用,主要模仿了掘金的 UI 设计,并进行了部分自定义调整。项目专注于移动端体验,同时支持服务端渲染和渐进式网络应用(PWA)功能。 ...
[详细]
蜡笔小新 2024-12-07 18:53:09
-
走着走着就丢啦
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
-
1Linux问题故障定位
-
2TMS320C6678 Network Internal Loopback
-
3php declaration of,PHP 方法重写,参数不同,报错: Declaration
-
4推荐写作平台gitbook——让我们换一种形式写作
-
5JavaSE 学习参考:类的定义
-
6使用旧库时出现xcode错误 - xcode error when using old library
-
7交叉编译arm-none-eabi-gcc编译汇编文件(startup_stm32f10x_hd.S)遇到的问题
-
8直接通过ADO操作Access数据库分享
-
9showModalDialog()方法中传入window参数
-
10[转载]在SQL Server数据库之间进行数据导入导出,OPENDATASOURCE
-
112021年个人目标怎么制定?5大原则教你制定完美目标和计划
-
12nginx 上传限制 client_max_body_size
-
13熊猫中的加入和合并有什么区别?
-
14闲鱼上淘一个二手电脑显示器,需要注意什么
-
15linux:service和systemctl两种linux服务管理方式
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有