React Native超简单完整示例-tabs、页面导航、热更新、用户行为分析
<p>初学<strong>React Native</strong>,如果没有人指引,会发现好多东西无从下手,但当有人指引后,会发现其实很简单。这也是本人写这篇博客的主要原因,希望能帮到初学者。</p><p>本文不会介绍如何搭建开发环境,如果你还没有搭建,可参考这里的官方文档:https://react-native.org/doc/getting-started.html 。</p>
<p>本文也不会介绍各种组件,太多了,可参考这里的官方文档:https://react-native.org/doc/components-and-apis.html 。</p>
<p>本文将会从创建项目开始,到基本的<strong>常见布局(tabs)</strong>、<strong>多页面之间的导航</strong>,加入<strong>热更新</strong>、<strong>用户行为分析</strong>功能。总之,我希望告诉你在实际工作中一个<strong>React Native App</strong>是如何开发出来的。</p>
<p>每一个知识点不会展开来详细讲解,这篇博客只是起到一个指引的作用,能让你少走一点弯路,少一些自己摸索的时间。</p>
<h2>第一步:创建项目</h2>
<p>当然,前提是你已经搭建好了开发环境。</p>
<p>在命令行中,进入你想要放项目文件的地方,我放在D盘的mydocs文件夹下(D:\mydocs\),执行以下命令:</p>
<div class="cnblogs_code">
<pre>react-native init 项目名</pre>
</div>
<p>我的项目名是“test0”,所以完整的命令应该是这样的:</p>
<div class="cnblogs_code">
<pre>react-native init test0</pre>
</div>
<p>由于需要到外网下载文件,而我朝对网络是有管制的,因此这个命令可能需要执行较长时间。只要网络没有中断,没有报错,就耐心等待吧。</p>
<p>待命令执行完毕后,在 D:\mydocs\ 目录下就多了一个 test0 文件夹。里面有很多已经默认创建好的文件和文件夹。</p>
<p>先来对默认创建的项目文件做个简单的认识。</p>
<p>用你喜欢的任意编辑器(我喜欢用VS Code)找开这个文件夹。你将看到一个类似这样的目录结构:</p>
<p><img src="https://img2020.cnblogs.com/blog/1617239/202005/1617239-20200508153104748-1429174478.png"></p>
<p>其中,</p>
<p><strong>/package.json</strong> 是包管理的配置文件,要安装什么包,可在这里配置,项目的基本信息,比如项目名、版本号、项目说明、等等,也可在此配置。但大多数情况下,可以不用管它。</p>
<p><strong>/index.js</strong> 项目的启动文件。</p>
<p><strong>/App.js</strong> 首页文件,在/index.js中会加载这个文件。</p>
<p><strong>/node_modules</strong> 项目中用到的所有包都存放在这个文件夹中。自己的项目文件不要放在这里。</p>
<p><strong>/android</strong> 这里放的是与Android原生编译相关的一些文件,作为一名React Native开发者,一般情况下也不用去管它。</p>
<p><strong>/ios</strong> 这里放的是与iOS原生编译相关的一些文件,作为一名React Native开发者,一般情况下也不用去管它。</p>
<p>这里需说明一下,如果你的项目的开发中,需要大量去动 /android 和 /ios 下的代码,甚至在里面加入很多业务逻辑,那就说明你的项目开发是存在问题的,一般情况下,只有在某些与编译、配置、发布相关的才会动到这里的代码。</p>
<h2>第二步:创建我们的第一个页面-Hello React Native</h2>
<p>其实,现在我们已经可以运行项目了。 <span class="cnblogs_code">react-native init test0</span> 这个命令已经默认为我们创建了一个首页,但我想替换为我自己的内容。</p>
<p>修改 <span class="cnblogs_code">/App.js</span> ,有以下的代码替换掉原来的所有代码:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> import React from 'react'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> import { SafeAreaView, View, Text } from 'react-native'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 0, 1)">class App extends React.Component {
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 0, 1)"> render() {
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <SafeAreaView>
<span style="color: rgba(0, 128, 128, 1)"> 8</span> <View>
<span style="color: rgba(0, 128, 128, 1)"> 9</span> <Text>Hello React Native</Text>
<span style="color: rgba(0, 128, 128, 1)">10</span> </View>
<span style="color: rgba(0, 128, 128, 1)">11</span> </SafeAreaView>
<span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 0, 1)"> );
</span><span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)">15</span>
<span style="color: rgba(0, 128, 128, 1)">16</span> export <span style="color: rgba(0, 0, 255, 1)">default</span> App;</pre>
</div>
<p>默认生成的代码是hooks语法,但我不喜欢,我更喜欢用class。我觉得class的结构更清晰一些。</p>
<h2>第三步:在模拟器中查看运行效果</h2>
<p>我们的第一个页面已经创建好了,现在需要查看一下运行效果。可用真机调试,但大多数情况下,用模拟器会更方便一些。</p>
<p>有各种模拟器可供选择,我喜欢用Android Studio自带的模拟器。安装方法同样见这个文档:https://react-native.org/doc/getting-started.html 。</p>
<p>打开Android Studio,点击 Configure -> AVD Manager</p>
<p><img src="https://img2020.cnblogs.com/blog/1617239/202005/1617239-20200508160641014-3187164.png"></p>
<p> </p>
<p> </p>
<p>在打开的窗口中,就能看到所有你已经创建过的模拟器了。如果你还没有创建过模拟器,就点击 Create Virtual Device 创建一个。下面是我已经创建好的模拟器。</p>
<p><img src="https://img2020.cnblogs.com/blog/1617239/202005/1617239-20200508160939208-1086851645.png"></p>
<p> </p>
<p> </p>
<p>点击后面的绿色三角形,就能启动模拟器了,启动后是这个样子的:</p>
<p><img src="https://img2020.cnblogs.com/blog/1617239/202005/1617239-20200508161346766-1104020284.png"></p>
<p> </p>
<p> </p>
<p>再次回到我们的项目。在命令行中,进入项目文件夹( <span class="cnblogs_code">D:\mydocs\test0\</span> ),执行以下命令:</p>
<div class="cnblogs_code">
<pre>react-native run-android</pre>
</div>
<p>因为我用的是Windows系统,就不演示ios的运行效果了。ios的运行,需在Mac电脑上执行以下命令:</p>
<div class="cnblogs_code">
<pre>react-native run-ios</pre>
</div>
<p>同样,可能需要等待比较长的时间,因为同样需要到外网下载编译工具。以后再执行此命令时就会快很多了。(这就是很多码农们恨透了GFW的主要原因之一 ^_^)</p>
<p>以下是目前我们的代码所运行的效果:</p>
<p><img src="https://img2020.cnblogs.com/blog/1617239/202005/1617239-20200508163443117-999826119.png"></p>
<h2>第四步:多个页面之间的导航</h2>
<p>现在我们的示例只有一个页面,如果有多个页面,又应该怎样从一个页面跳转到另一个页面呢?</p>
<p>在<strong>React Native</strong>中,有很多包可以实现此功能。比如:<strong>React Navigation</strong>、<strong>React Native Navigation</strong>、等等。</p>
<p>网上有各种文章比较过各种包之间的好坏,但对于一般的应用,其实差别不大。虽然在项目中我一般都使用<strong>React Native Navigation</strong>,但相对来说,<strong>React Navigation</strong>使用起来更加简单、比较容易上手。因此在这个示例中,我选择使用<strong>React Navigation</strong>。</p>
<p>先创建第二个页面。</p>
<p>在项目的根目录下创建一个文件: <span class="cnblogs_code">/one.js</span> 。并加入以下代码:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> import React from 'react'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> import { View, Text } from 'react-native'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 0, 1)">class One extends React.Component {
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 0, 1)"> render() {
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (</span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span> <View>
<span style="color: rgba(0, 128, 128, 1)"> 9</span> <Text>另一个页面</Text>
<span style="color: rgba(0, 128, 128, 1)">10</span> </View>
<span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 0, 1)"> );
</span><span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)">15</span>
<span style="color: rgba(0, 128, 128, 1)">16</span> export <span style="color: rgba(0, 0, 255, 1)">default</span> One;</pre>
</div>
<p>然后在 <span class="cnblogs_code">/App.js</span> 中加个按钮,希望点击它后能跳转到 <span class="cnblogs_code">/one.js</span> 。将 <span class="cnblogs_code">/App.js</span> 的代码修改为下面这样子:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> import React from 'react'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> import { SafeAreaView, View, Text, Button } from 'react-native'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 0, 1)">class App extends React.Component {
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 0, 1)"> onPress() {
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODO: 跳到另一个页面</span>
<span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 0, 1)"> render() {
</span><span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <SafeAreaView>
<span style="color: rgba(0, 128, 128, 1)">12</span> <View>
<span style="color: rgba(0, 128, 128, 1)">13</span> <Text>Hello React Native</Text>
<span style="color: rgba(0, 128, 128, 1)">14</span> </View>
<span style="color: rgba(0, 128, 128, 1)">15</span> <View>
<span style="color: rgba(0, 128, 128, 1)">16</span> <Button title="点击我去另一个页面" onPress={<span style="color: rgba(0, 0, 255, 1)">this</span>.onPress}></Button>
<span style="color: rgba(0, 128, 128, 1)">17</span> </View>
<span style="color: rgba(0, 128, 128, 1)">18</span> </SafeAreaView>
<span style="color: rgba(0, 128, 128, 1)">19</span> <span style="color: rgba(0, 0, 0, 1)"> );
</span><span style="color: rgba(0, 128, 128, 1)">20</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">21</span> <span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)">22</span>
<span style="color: rgba(0, 128, 128, 1)">23</span> export <span style="color: rgba(0, 0, 255, 1)">default</span> App;</pre>
</div>
<p>接下来需要在 <span class="cnblogs_code">onPress()</span> 方法中加入跳转的代码。在这之前,需要先安装<strong>React Navigation</strong>包。</p>
<p>在项目的根目录下执行以下命令(你可能需要先关闭模拟器中打开的App,或者直接关闭模拟器,并结束项目的运行):</p>
<div class="cnblogs_code">
<pre>npm <span style="color: rgba(0, 0, 255, 1)">install</span> @react-navigation/native</pre>
</div>
<div class="cnblogs_code">
<pre>npm <span style="color: rgba(0, 0, 255, 1)">install</span> react-native-reanimated react-native-gesture-handler react-native-screens react-native-safe-area-context @react-native-community/masked-view</pre>
</div>
<div class="cnblogs_code">
<pre>npm <span style="color: rgba(0, 0, 255, 1)">install</span> @react-navigation/stack</pre>
</div>
<p>然后将 <span class="cnblogs_code">/App.js</span> 中的代码修改为下面这样子:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> import React from 'react'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> import { View, Text, Button } from 'react-native'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span> import { NavigationContainer } from '@react-navigation/native'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> import { createStackNavigator } from '@react-navigation/stack'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> import One from './one'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span>
<span style="color: rgba(0, 128, 128, 1)"> 7</span> const Stack =<span style="color: rgba(0, 0, 0, 1)"> createStackNavigator();
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 0, 1)">class Home extends React.Component {
</span><span style="color: rgba(0, 128, 128, 1)">10</span> onPress = () =><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 255, 1)">this</span>.props.navigation.navigate('One'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">13</span>
<span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 0, 1)"> render() {
</span><span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
</span><span style="color: rgba(0, 128, 128, 1)">16</span> <View>
<span style="color: rgba(0, 128, 128, 1)">17</span> <View>
<span style="color: rgba(0, 128, 128, 1)">18</span> <Text>Hello React Native</Text>
<span style="color: rgba(0, 128, 128, 1)">19</span> </View>
<span style="color: rgba(0, 128, 128, 1)">20</span> <View>
<span style="color: rgba(0, 128, 128, 1)">21</span> <Button title="点击我去另一个页面" onPress={<span style="color: rgba(0, 0, 255, 1)">this</span>.onPress}></Button>
<span style="color: rgba(0, 128, 128, 1)">22</span> </View>
<span style="color: rgba(0, 128, 128, 1)">23</span> </View>
<span style="color: rgba(0, 128, 128, 1)">24</span> <span style="color: rgba(0, 0, 0, 1)"> );
</span><span style="color: rgba(0, 128, 128, 1)">25</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">26</span> <span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)">27</span>
<span style="color: rgba(0, 128, 128, 1)">28</span> <span style="color: rgba(0, 0, 0, 1)">class App extends React.Component {
</span><span style="color: rgba(0, 128, 128, 1)">29</span> <span style="color: rgba(0, 0, 0, 1)"> render() {
</span><span style="color: rgba(0, 128, 128, 1)">30</span> <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
</span><span style="color: rgba(0, 128, 128, 1)">31</span> <NavigationContainer>
<span style="color: rgba(0, 128, 128, 1)">32</span> <Stack.Navigator initialRouteName="Home">
<span style="color: rgba(0, 128, 128, 1)">33</span> <Stack.Screen name="Home" component={Home} />
<span style="color: rgba(0, 128, 128, 1)">34</span> <Stack.Screen name="One" component={One} />
<span style="color: rgba(0, 128, 128, 1)">35</span> </Stack.Navigator>
<span style="color: rgba(0, 128, 128, 1)">36</span> </NavigationContainer>
<span style="color: rgba(0, 128, 128, 1)">37</span> <span style="color: rgba(0, 0, 0, 1)"> );
</span><span style="color: rgba(0, 128, 128, 1)">38</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">39</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">40</span>
<span style="color: rgba(0, 128, 128, 1)">41</span> export <span style="color: rgba(0, 0, 255, 1)">default</span> App;</pre>
</div>
<p>这次的改动比较大。新加了一个 <span class="cnblogs_code">class Home</span> ,将之前 <span class="cnblogs_code">class App</span> 中的代码移到了 <span class="cnblogs_code">class Home</span> 中,现在的 <span class="cnblogs_code">class App</span> 是一个维护导航的容器。</p>
<p>留意 <span class="cnblogs_code">class Home</span> 中 <span class="cnblogs_code">onPress()</span> 内的代码,在这里,用 <span class="cnblogs_code">navigation.navigate(name)</span> 跳转到另一个页面。通过 <span class="cnblogs_code">class App</span> 中的处理, <span class="cnblogs_code">class Home</span> 的 <span class="cnblogs_code">props</span> 中有了一个 <span class="cnblogs_code">navigation</span> 对象。</p>
<p>再次执行 <span class="cnblogs_code">react-native run-android</span> 在模拟器中查看效果:</p>
<p><img src="https://img2020.cnblogs.com/blog/1617239/202005/1617239-20200508182358665-2040261617.png"></p>
<p> </p>
<p> </p>
<p>点击页面中的Button,就能跳转到 <span class="cnblogs_code">/one.js</span> 了。</p>
<p>在 <span class="cnblogs_code">/one.js</span> 中,可以直接点击左上角的“返回”图标回到上一页。但为了演示如何使用代码返回到上一页,我将 <span class="cnblogs_code">/one.js</span> 的代码修改为下面这样子:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> import React from 'react'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> import { View, Text, Button } from 'react-native'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 0, 1)">class One extends React.Component {
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> onPress = () =><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props.navigation.goBack();
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 0, 1)"> render() {
</span><span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <View>
<span style="color: rgba(0, 128, 128, 1)">12</span> <Text>另一个页面</Text>
<span style="color: rgba(0, 128, 128, 1)">13</span> <View>
<span style="color: rgba(0, 128, 128, 1)">14</span> <Button title="返回" onPress={<span style="color: rgba(0, 0, 255, 1)">this</span>.onPress}></Button>
<span style="color: rgba(0, 128, 128, 1)">15</span> </View>
<span style="color: rgba(0, 128, 128, 1)">16</span> </View>
<span style="color: rgba(0, 128, 128, 1)">17</span> <span style="color: rgba(0, 0, 0, 1)"> );
</span><span style="color: rgba(0, 128, 128, 1)">18</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">19</span> <span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)">20</span>
<span style="color: rgba(0, 128, 128, 1)">21</span> export <span style="color: rgba(0, 0, 255, 1)">default</span> One;</pre>
</div>
<p>在这里使用了 <span class="cnblogs_code">navigation.goBack()</span> 返回到上一页。</p>
<p>现在,点击 <span class="cnblogs_code">/one.js</span> 中的“返回”Button,就能回到上一页了。</p>
<p><img src="https://img2020.cnblogs.com/blog/1617239/202005/1617239-20200508183715804-1896003957.png"></p>
<p> <span class="cnblogs_code">navigation</span> 还有个 <span class="cnblogs_code">push()</span> 方法,也是较常用的。你可以试试效果。具体使用方法参考官方文档:https://react-native.org/doc/navigation.html 。</p>
<p> </p>
<p> </p>
<h2>第五步:加入选项卡tabs</h2>
<p>在App中,比较常见的一种布局是在底部有一排选项卡tabs。</p>
<p>其实,tabs是由多个页面组成的,因此,在tabs之间切换,也是在多个页面之间导航。因此这里同样需要用到<strong>React Navigation</strong>。</p>
<p>在项目的根目录下执行以下命令(同样,你可能需要先停止项目的运行):</p>
<div class="cnblogs_code">
<pre>npm <span style="color: rgba(0, 0, 255, 1)">install</span> @react-navigation/bottom-tabs</pre>
</div>
<p>为了更好的演示效果,加入第三个页面 <span class="cnblogs_code">/two.js</span> ,代码如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> import React from 'react'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> import { View, Text } from 'react-native'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 0, 1)">class Two extends React.Component {
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 0, 1)"> render() {
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <View>
<span style="color: rgba(0, 128, 128, 1)"> 8</span> <Text>第三个页面</Text>
<span style="color: rgba(0, 128, 128, 1)"> 9</span> </View>
<span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 0, 1)"> );
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)">13</span>
<span style="color: rgba(0, 128, 128, 1)">14</span> export <span style="color: rgba(0, 0, 255, 1)">default</span> Two;</pre>
</div>
<p>在 <span class="cnblogs_code">/App.js</span> 中引入它:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> import Two from './two';</pre>
</div>
<p>将之前的</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> import { createStackNavigator } from '@react-navigation/stack';</pre>
</div>
<p>替换为:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';</pre>
</div>
<p>并将之前的</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> const Stack = createStackNavigator();</pre>
</div>
<p>替换为:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> const Tab = createBottomTabNavigator();</pre>
</div>
<p>然后将 <span class="cnblogs_code">class App</span> 修改为:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">class App extends React.Component {
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 0, 1)"> render() {
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> <NavigationContainer>
<span style="color: rgba(0, 128, 128, 1)"> 5</span> <Tab.Navigator>
<span style="color: rgba(0, 128, 128, 1)"> 6</span> <Tab.Screen name="Home" component={Home} options={{title: 'Javascript'}} />
<span style="color: rgba(0, 128, 128, 1)"> 7</span> <Tab.Screen name="One" component={One} options={{title: 'Python'}} />
<span style="color: rgba(0, 128, 128, 1)"> 8</span> <Tab.Screen name="Two" component={Two} options={{title: 'PHP'}} />
<span style="color: rgba(0, 128, 128, 1)"> 9</span> </Tab.Navigator>
<span style="color: rgba(0, 128, 128, 1)">10</span> </NavigationContainer>
<span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 0, 1)"> );
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">13</span> }</pre>
</div>
<p>再次在项目根目录下执行 <span class="cnblogs_code">react-native run-android</span> 查看运行效果:</p>
<p><img src="https://img2020.cnblogs.com/blog/1617239/202005/1617239-20200508191432427-1964046503.png"></p>
<p> </p>
<p> </p>
<p>可以看到在底部出现了一排选项卡tabs。点击它就能在不同页面之间切换了。</p>
<p>当然,还可以给tabs加上Icon图标。这里就不演示了,懒得去找图标了。更多内容可参考官方文档:https://react-native.org/doc/navigation.html 。</p>
<h2>第六步:加入热更新功能</h2>
<p>好吧,假设到这里我们App的功能已经开发完了。</p>
<p>但就可以这样结束了吗?</p>
<p>当然不行。</p>
<p>我们老大说过:用React Native做App,却不做热更新,那你用React Native干嘛?</p>
<p>这当然是句玩笑话,但实际情况确实如此,只要是用React Native开发App,一般都会加入热更新功能,这是用React Native开发App的最大优势之一。如果将最大的优势都丢弃了,确实说不过去。</p>
<p>在这里我使用<strong>CodePush中国</strong>提供的热更新服务。使用的方法比较简单,官方的示例文档已经写得很清楚了,我就不加说明了,直接上代码。</p>
<p>官方示例文档在这里:http://code-push.cn/docs/1600.htm 。</p>
<p>按照官方文档安装好 <span class="cnblogs_code">cpcn-react-native</span> 后,在 <span class="cnblogs_code">/App.js</span> 文件中引入它:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> import cpcn from "cpcn-react-native";</pre>
</div>
<p>为了偷懒,我将官网示例中的代码直接复制到 <span class="cnblogs_code">class Home</span> 中:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">class Home extends React.Component {
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 0, 1)"> constructor(props) {
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 0, 1)"> super(props);
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 255, 1)">this</span>.state =<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> upgradeState: 0<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> upgradeAllBytes: 0<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> upgradeReceived: 0
<span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 0, 1)"> };
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">11</span> onPress = () =><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 255, 1)">this</span>.props.navigation.navigate('One'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">14</span>
<span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 0, 0, 1)"> componentDidMount() {
</span><span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(0, 0, 0, 1)"> cpcn.check({
</span><span style="color: rgba(0, 128, 128, 1)">17</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 检查是否有新版本后调用此方法</span>
<span style="color: rgba(0, 128, 128, 1)">18</span> checkCallback: (remotePackage, agreeContinueFun) =><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">19</span> <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">(remotePackage){
</span><span style="color: rgba(0, 128, 128, 1)">20</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 如果 remotePackage 有值,表示有新版本可更新。</span>
<span style="color: rgba(0, 128, 128, 1)">21</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 将 this.state.upgradeState 的值设为1,以显示提示消息</span>
<span style="color: rgba(0, 128, 128, 1)">22</span> <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
</span><span style="color: rgba(0, 128, 128, 1)">23</span> upgradeState: 1
<span style="color: rgba(0, 128, 128, 1)">24</span> <span style="color: rgba(0, 0, 0, 1)"> });
</span><span style="color: rgba(0, 128, 128, 1)">25</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">26</span> <span style="color: rgba(0, 0, 0, 1)"> },
</span><span style="color: rgba(0, 128, 128, 1)">27</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 下载新版本时调用此方法</span>
<span style="color: rgba(0, 128, 128, 1)">28</span> downloadProgressCallback: (downloadProgress) =><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">29</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 更新显示的下载进度中的数值</span>
<span style="color: rgba(0, 128, 128, 1)">30</span> <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
</span><span style="color: rgba(0, 128, 128, 1)">31</span> <span style="color: rgba(0, 0, 0, 1)"> upgradeReceived: downloadProgress.receivedBytes,
</span><span style="color: rgba(0, 128, 128, 1)">32</span> <span style="color: rgba(0, 0, 0, 1)"> upgradeAllBytes: downloadProgress.totalBytes
</span><span style="color: rgba(0, 128, 128, 1)">33</span> <span style="color: rgba(0, 0, 0, 1)"> });
</span><span style="color: rgba(0, 128, 128, 1)">34</span> <span style="color: rgba(0, 0, 0, 1)"> },
</span><span style="color: rgba(0, 128, 128, 1)">35</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 安装新版本后调用此方法</span>
<span style="color: rgba(0, 128, 128, 1)">36</span> installedCallback: (restartFun) =><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">37</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 新版本安装成功了,将 this.state.upgradeState 的值设为0,以关闭对话框</span>
<span style="color: rgba(0, 128, 128, 1)">38</span> <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
</span><span style="color: rgba(0, 128, 128, 1)">39</span> upgradeState: 0
<span style="color: rgba(0, 128, 128, 1)">40</span> }, () =><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">41</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 调用此方法重启App,重启后将会使用新版本</span>
<span style="color: rgba(0, 128, 128, 1)">42</span> restartFun(<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">43</span> <span style="color: rgba(0, 0, 0, 1)"> });
</span><span style="color: rgba(0, 128, 128, 1)">44</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">45</span> <span style="color: rgba(0, 0, 0, 1)"> });
</span><span style="color: rgba(0, 128, 128, 1)">46</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">47</span>
<span style="color: rgba(0, 128, 128, 1)">48</span> upgradeContinue = () =><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">49</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 用户确定更新后,调用此方法以开始更新</span>
<span style="color: rgba(0, 128, 128, 1)">50</span> cpcn.agreeContinue(<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">51</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 将 this.state.upgradeState 的值设为2,以显示下载进度</span>
<span style="color: rgba(0, 128, 128, 1)">52</span> <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
</span><span style="color: rgba(0, 128, 128, 1)">53</span> upgradeState: 2
<span style="color: rgba(0, 128, 128, 1)">54</span> <span style="color: rgba(0, 0, 0, 1)"> });
</span><span style="color: rgba(0, 128, 128, 1)">55</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">56</span>
<span style="color: rgba(0, 128, 128, 1)">57</span> <span style="color: rgba(0, 0, 0, 1)"> render() {
</span><span style="color: rgba(0, 128, 128, 1)">58</span> <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
</span><span style="color: rgba(0, 128, 128, 1)">59</span> <>
<span style="color: rgba(0, 128, 128, 1)">60</span> <View>
<span style="color: rgba(0, 128, 128, 1)">61</span> <View>
<span style="color: rgba(0, 128, 128, 1)">62</span> <Text>Hello React Native</Text>
<span style="color: rgba(0, 128, 128, 1)">63</span> </View>
<span style="color: rgba(0, 128, 128, 1)">64</span> <View>
<span style="color: rgba(0, 128, 128, 1)">65</span> <Button title="点击我去另一个页面" onPress={<span style="color: rgba(0, 0, 255, 1)">this</span>.onPress}></Button>
<span style="color: rgba(0, 128, 128, 1)">66</span> </View>
<span style="color: rgba(0, 128, 128, 1)">67</span> </View>
<span style="color: rgba(0, 128, 128, 1)">68</span> <<span style="color: rgba(0, 0, 0, 1)">Modal
</span><span style="color: rgba(0, 128, 128, 1)">69</span> visible={<span style="color: rgba(0, 0, 255, 1)">this</span>.state.upgradeState > 0<span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">70</span> transparent={<span style="color: rgba(0, 0, 255, 1)">true</span>}>
<span style="color: rgba(0, 128, 128, 1)">71</span> <View style={{padding:18, backgroundColor:"rgba(10,10,10,0.6)", height:"100%", display:"flex", flexDirection:"row", alignItems:"center"}}>
<span style="color: rgba(0, 128, 128, 1)">72</span> <View style={{backgroundColor:"#fff", width:"100%", padding:18}}>
<span style="color: rgba(0, 128, 128, 1)">73</span> <span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">74</span> <span style="color: rgba(0, 0, 255, 1)">this</span>.state.upgradeState == 1
<span style="color: rgba(0, 128, 128, 1)">75</span> &&
<span style="color: rgba(0, 128, 128, 1)">76</span> <View>
<span style="color: rgba(0, 128, 128, 1)">77</span> <View style={{paddingBottom:20}}>
<span style="color: rgba(0, 128, 128, 1)">78</span> <Text>发现新版本</Text>
<span style="color: rgba(0, 128, 128, 1)">79</span> </View>
<span style="color: rgba(0, 128, 128, 1)">80</span> <View>
<span style="color: rgba(0, 128, 128, 1)">81</span> <Button title="马上更新" onPress={<span style="color: rgba(0, 0, 255, 1)">this</span>.upgradeContinue}/>
<span style="color: rgba(0, 128, 128, 1)">82</span> </View>
<span style="color: rgba(0, 128, 128, 1)">83</span> </View>
<span style="color: rgba(0, 128, 128, 1)">84</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">85</span> <span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">86</span> <span style="color: rgba(0, 0, 255, 1)">this</span>.state.upgradeState == 2
<span style="color: rgba(0, 128, 128, 1)">87</span> &&
<span style="color: rgba(0, 128, 128, 1)">88</span> <View>
<span style="color: rgba(0, 128, 128, 1)">89</span> <Text style={{textAlign:"center"}}>{<span style="color: rgba(0, 0, 255, 1)">this</span>.state.upgradeReceived} / {<span style="color: rgba(0, 0, 255, 1)">this</span>.state.upgradeAllBytes}</Text>
<span style="color: rgba(0, 128, 128, 1)">90</span> </View>
<span style="color: rgba(0, 128, 128, 1)">91</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">92</span> </View>
<span style="color: rgba(0, 128, 128, 1)">93</span> </View>
<span style="color: rgba(0, 128, 128, 1)">94</span> </Modal>
<span style="color: rgba(0, 128, 128, 1)">95</span> </>
<span style="color: rgba(0, 128, 128, 1)">96</span> <span style="color: rgba(0, 0, 0, 1)"> );
</span><span style="color: rgba(0, 128, 128, 1)">97</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">98</span> };</pre>
</div>
<p>这就算搞定了。这个App已经有了热更新功能。</p>
<h2>第七步:加入用户行为分析功能</h2>
<p>这还不算完。在真实开发工作中,一个App上线之后,还需要做的事情还很多,比如需要将错误日志传到服务器,以方便监控是否存在Bug。再比如,很重要的一点,需要分析用户的行为,以方便对产品进行改进。这是公司在运营App时的很重要的参考数据。</p>
<p>之前我们都是自己写用户行为分析。但是搞得代码很乱,每次修改和加新的监控都很麻烦,并且我们自己的分析功能写得也不是很好。</p>
<p>前段时间偶然发现,CodePush中已经有了用户行为分析的功能,于是便向老大提议用这个,结果还受到了老大的表扬。^_^</p>
<p>官方文档在这里:http://code-push.cn/docs/1700.htm 。</p>
<p>接下来我在这个示例项目中加入用户行为分析。我需要知道我的用户对哪些内容感兴趣,是Javascript,还是Python?又或者是PHP?</p>
<p>只需为每个页面做个埋点,看用户访问哪个比较多就知道结果了。</p>
<p>由于之前在做热更新时已经引入了 <span class="cnblogs_code">cpcn-react-native</span> ,所以不需重复引入。但需要注意的是, <span class="cnblogs_code">cpcn-react-nataive</span> 必须在引入所有组件之前引入,例如我现在的引入顺序是这样子的:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> import React from 'react'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">2</span> import cpcn from "cpcn-react-native"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">3</span> import { View, Text, Button, Modal } from 'react-native'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">4</span> import { NavigationContainer } from '@react-navigation/native'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">5</span> import { createBottomTabNavigator } from '@react-navigation/bottom-tabs'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">6</span> import One from './one'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">7</span> import Two from './two';</pre>
</div>
<p>然后在 <span class="cnblogs_code">import</span> 语句之后加入以下代码:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> cpcn.useFootprint();</pre>
</div>
<p>再然后修改 <span class="cnblogs_code">/App.js</span> 中的 <span class="cnblogs_code">class Home</span> ,在它的 <span class="cnblogs_code">constructor</span> 中加入埋点:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">class Home extends React.Component {
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 0, 1)"> constructor(props) {
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 0, 1)"> super(props);
</span><span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 255, 1)">this</span>.footprint('Javascript'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">5</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 其它代码。。。。</span>
<span style="color: rgba(0, 128, 128, 1)">6</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">7</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 其它代码。。。。</span>
<span style="color: rgba(0, 128, 128, 1)">8</span> }</pre>
</div>
<p>给 <span class="cnblogs_code">/one.js</span> <span class="cnblogs_code">/two.js</span> 也加入埋点:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">class One extends React.Component {
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 0, 1)"> constructor(props) {
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 0, 1)"> super(props);
</span><span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 255, 1)">this</span>.footprint('Python'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">5</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">6</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 其它代码。。。。</span>
<span style="color: rgba(0, 128, 128, 1)">7</span> }</pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">class Two extends React.Component {
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 0, 1)"> constructor(props) {
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 0, 1)"> super(props);
</span><span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 255, 1)">this</span>.footprint('PHP'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">5</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">6</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 其它代码。。。。</span>
<span style="color: rgba(0, 128, 128, 1)">7</span> }</pre>
</div>
<p>在 <span class="cnblogs_code">/one.js</span> 中有个Button,我也希望能监控用户有没有点击它。因此给该Button也加个埋点:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <Button footprint="点了返回按钮" title="返回" onPress={<span style="color: rgba(0, 0, 255, 1)">this</span>.onPress}></Button></pre>
</div>
<p>然后就可以去CodePush的控制台中查看分析报表了。下面是我的测试结果:</p>
<h2>第八步:现在总应该结束了吧?</h2>
<p>结束了吗?</p>
<p>不,还没有。^_^</p>
<p>比如在上面已经提到过的,在真实的开发工作中,我们还需要记录用户的崩溃日志。再比如,我们需要知道我们的用户主要分布在哪些地方。再比如,我们需要将某些数据做缓存。再比如,我们需要在服务器发生错误时给用户一个友好的提示。等等等等。。。。。</p>
<p>总之,在实际的开发工作中,开发一个App,比在培训班做个项目要做的事情多得多。</p>
<h2>第九步:结束了</h2>
<p>虽然如上面所说,还需要做的事情还很多,但在这篇博客里我就不写了。以后有时间再写吧。</p>
<p>之前曾对自己说,要多写点博客,即可记录一些知识点,也可帮到别人。但却一直没有做到。下班之后就真的不想再动了。^_^</p>
<p>这是第一次写这么长的博客,希望能帮到看这篇博客的你。</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/mafengzi/p/12853093.html
頁:
[1]