前置工作
(〇)了解官方文档是必须的
react-native官方文档
react-native中文文档
(一)安装必需的软件
以下步骤官网早有详细步骤,在此不必赘述。
1.Chocolatey
Chocolatey的官网
使用管理员打开cmd,输入
1 | @"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin" |
2.安装Python 2
在cmd中输入
1 | choco install python2 |
输入y,不要直接回车。
3.安装node
1 | choco install nodejs.install |
在此之前我已经用nvm安装过node了。
4.安装jdk8
1 | choco install jdk8 |
在此之前我已经去官网下载jdk了。
注意:jdk版本需为8。
5.安装Yarn、React Native的命令行工具
1 | npm install -g yarn react-native-cli |
设置镜像源
1 | yarn config set registry https://registry.npm.taobao.org --global |
6.安装Android Studio
按照官网的配置进行配置即可。(虽然我觉得很麻烦>﹏<)
7.初始化项目
1 | react-native init AwesomeProject |
然后bug就来了,出现红色的提示
我的理解就是模拟器没有关联并启动所导致的。(可能是错误的)
(二)在模拟器中运行
然后打算使用Android Studio直接运行项目。
在初步安装完成后按照官网进行配置以完成全部的安装。
打开已存在的项目,注意选择的是项目下的Android文件夹
稍等几分钟运行按钮由灰色变成绿色,但是模拟器并没有跑起来。
原因是 “Vt-x is disabled in BIOS”
遇到问题,首先是想到伟大的网友们。
华硕主板BIOS UEFI BIOS开启VT步骤
期间还尝试使用其他模拟器来跑项目,例如”夜神模拟器”,但是怕领导以为我在打游戏,就决定还是用Android Studio,看起来专业一点。
实践
(三)TodoList的结构
- 完成效果预览
晃眼的骚粉 哇咔咔
1.为了达到真正的入坑,而不是在坑前停留,我会故意把TodoList写得复杂一丢丢,比如添加导航功能,实现数据存储、组件通信的功能等。
TodoList 流程图:
(图片使用processOn制作,好丑)
2.安装所需的插件。
1 | npm install react-native-vector-icons react-navigation --save |
安卓没有navigation,官方推荐 react-navigation,react-native-vector-icons 是一个超级好用的图标库,只要复制了图标的名字就可以为所欲为。
3.根据自己的习惯创建文件夹,我是如下创建的:
1 | ├── android |
这些是用到的文件,其他保持生成时默认的就好了。
(四)实现TodoList的功能
编写router和基本文件
导入所需的文件,并编写项目的整体结构,从代码可以看出,底部的导航可以切换所有的事项,未完成的事项,已完成的事项三个页面。样式什么的就自由发挥吧。
1 | //router.js |
1 | // src/index.js |
1 | // AwesomeProject/index,js |
编写ALL页面
1 | import React, {Component} from 'react'; |
TodoItem组件
因为All、Incomplete、 Complete页面都需要事项的页面,所以将他分离出来做一个单独的组件使用。
1 | import React, {Component} from 'react'; |
Incomplete、Complete页面
Incomplete、Complete页面和All页面基本一样,只是在渲染页面前将数据过滤了。
1 | // incomplete.js |
1 | // utils.js |
Complete页面和Incomplete完全一样,除了将todoListFilter[false]改为todoListFilter[true]。
Add页面
Add页面中的保存按钮是写在navigationOptions里,如果直接使用this._saveTodo是拿不到这个方法的,需要在navigation中的内置函数setParams中声明,方可使用。
1 | import React, {Component} from 'react'; |
在utils.js中添加生成唯一ID的静态函数。
1 | // utils.js |
到此,添加一个事项,再切换其是否完成的状态都可以实现了。但是我们会发现代码有很多重复的地方,我们尝试将它们都分离出来。
页面复用代码的提取
在三个主页面中都出现了这个函数,我们将其分离出来,写到utils.js中
1 | // utils.js |
那么在页面中,调用函数的方式如下,将this.state.todolistData作为参数传递过去。
1 | <TodoItem dataItem={item} key={item.id} checkTodo={(item)=>Utils._checkTodo(item,this.state.todolistData)} /> |
删除功能的实现
添加了太多事项,不得有删除功能吗?
这个方法和切换完成状态是类似的。
onLongPress是指长按,长按之后弹出模态框点击ok则执行删除函数。
1 | // todoitem.js |
1 | // todoitem.js |
1 | // utils.js |
删除事项之后需要重新获取数据,不然页面上还是会显示已经被残忍删掉的数据。
1 | <TodoItem dataItem={item} key={item.id} checkTodo={(item)=>Utils._checkTodo(item,this.state.todolistData)} |
收工!!!
说在后面的话
还有修改的功能,心情好再写。
完整的项目在这里GitHub Todolist。
这不是一篇教程,而是一份纪念品。
共勉