{
    "componentChunkName": "component---src-templates-blog-post-tsx",
    "path": "/blog/2016-12-15-building-infinite-scroll-in-react-native/",
    "result": {"data":{"blogPost":{"title":"Building infinite scroll in React Native","slug":"/blog/2016-12-15-building-infinite-scroll-in-react-native/","authorNodes":[{"name":"Robert DeLuca","slug":"/people/robert-deluca/"}],"markdown":{"html":"<p>In high school, I spent a long time trying to learn how to build iOS\napps. After many months of attempting what seemed impossible at the time,\nI decided to throw in the towel. So I gave up and to went to design,\nwhich ultimately led to web work.</p>\n<p>That desire to build native mobile apps <em>never</em> went away for me. But learning\nan entirely new language and ecosystem wasn't something that I could do\nin my spare time. So when React Native busted onto the scene in 2015\nit caught my attention. Since it's written in JavaScript, React Native\nallows you (the JS dev) to use technologies you're already familiar\nwith to build truly native apps.</p>\n<p>Around the same time at The Frontside we started to write most of\nour libraries in pure JavaScript. This allowed us to wrap those libraries in\nwhatever framework we happened to be working in at the time. That means\nwe can take problems we've solved in Ember apps and use them in a React Native\nproject. Which is exactly what we're going to do today!</p>\n<h3 id=\"introduction\" style=\"position:relative;\"><a href=\"#introduction\" aria-label=\"introduction permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Introduction</h3>\n<p>The purpose of this post is to build an infinite scroll component for\nReact Native based\non\n<a href=\"https://github.com/flexyford/impagination\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Impagination.js</a>. We'll\ntalk more about Impagination a little later but for now, just know\nImpagination is a lazy data layer for your paged records.</p>\n<p>We're also going to lean on <a href=\"http://nativebase.io/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">NativeBase</a> for\nnice prestyled native looking components. If you're coming from the\nweb think of NativeBase like Bootstrap. The main difference is the\nstyling will be tailored to the OS running the app. So in iOS, you're going\nto get iOS styled elements and in Android, you'll get Android styled\nelements.</p>\n<p>The API we will be using is a Rails app that returns paginated data\nwhich is generated from the <a href=\"https://github.com/stympy/faker\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">faker</a>\ngem. Impagination will work with any paginated API, so if you would\nlike you can sub in your own API here.</p>\n<p>Here's an iOS screenshot of what we're going to build:</p>\n<p><img\nsrc=\"/img/2016/12/15/building-infinite-scroll-in-react-native/impagination-react-native-ios.png\"\nalt=\"iOS Screenshot of the app we will be building\"\nstyle=\"width: 80%;\"\n/></p>\n<p>You can also check out the repo for what we're <a href=\"https://github.com/Robdel12/robotImpagination\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">going to\nbuild here</a>. If you\nhaven't set up React Native on your machine yet, you should take a moment\nand do that. The getting started docs are a\n<a href=\"https://facebook.github.io/react-native/docs/getting-started.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">great resource.</a></p>\n<p>To sum up our goals for this post into a list:</p>\n<ul>\n<li>Introduce Impagination</li>\n<li>Create the React Native app</li>\n<li>Create a component that will be shared in iOS and Android</li>\n<li>Use NativeBase for styling</li>\n<li>Create an Impagination dataset</li>\n<li>Render that dataset to the app screen</li>\n<li>Listen for scroll events to request new data</li>\n</ul>\n<h3 id=\"hello-impagination\" style=\"position:relative;\"><a href=\"#hello-impagination\" aria-label=\"hello impagination permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Hello Impagination</h3>\n<p>Before we start actually building our app I want to take second to\ntalk about Impagination. Like I said earlier, Impagination is a lazy\ndata layer for your paged records. All you provide Impagination is the\nlogic to fetch a single page, plus how many records you want it to\npre-fetch ahead of you. Impagination will handle the rest for you.</p>\n<p>Impagination is built using an event-driven immutable style and\nhas zero dependencies. That means you can use it anywhere that JS\ncan run! From the server to the client, it doesn't matter as long as\nit's JS.</p>\n<p>There are two required attributes for creating an Impagination\ndataset: <code class=\"language-text\">fetch</code> and <code class=\"language-text\">pageSize</code>.</p>\n<p><code class=\"language-text\">fetch</code> is a function that will tell Impagination how to go get the\ndata you are requesting as you scroll through the infinite\nlist.</p>\n<p><code class=\"language-text\">pageSize</code> is an integer that tells Impagination how many\nrecords are in each page.</p>\n<p>Okay, that's enough of an introduction to Impagination. As we build\nour app I will stop and explain more of Impagination as we build\nthe app.</p>\n<h3 id=\"creating-the-app\" style=\"position:relative;\"><a href=\"#creating-the-app\" aria-label=\"creating the app permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Creating the app</h3>\n<p>Let's start creating our React Native app! I'm going to call this app\n<code class=\"language-text\">robotImpagination</code> since the gem generating our fake data uses a bunch of\ndifferent robots for images. Feel free to name your app whatever you like.</p>\n<p><code class=\"language-text\">react-native init robotImpagination</code></p>\n<p>This will create a hello world react native app. If you cd into that\ndirectory and run <code class=\"language-text\">react-native run-ios</code> (or <code class=\"language-text\">react-native\nrun-android</code>) it should start the React Native packager, build the iOS\napp, and launch the simulator.</p>\n<p>Now that we have confirmed that the app will build, shut it all\ndown. We need to install a couple dependencies to build our infinite scroll.\nLet's install NativeBase first: <code class=\"language-text\">yarn add native-base</code>.\nThen Impagination: <code class=\"language-text\">yarn add impagination</code>. You should now\nsee both of those libraries in your <code class=\"language-text\">package.json</code> file.</p>\n<h3 id=\"no-place-like-home\" style=\"position:relative;\"><a href=\"#no-place-like-home\" aria-label=\"no place like home permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>No place like Home</h3>\n<p>Make your way to the <code class=\"language-text\">index.ios.js</code> (or <code class=\"language-text\">index.android.js</code> if you're\ndoing android dev). You should see a couple imports and then a class\nthat's extending <code class=\"language-text\">Component</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">robotImpagination</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token operator\">&lt;</span>View style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>styles<span class=\"token punctuation\">.</span>container<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Text style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>styles<span class=\"token punctuation\">.</span>welcome<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n          Welcome to React Native<span class=\"token operator\">!</span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Text<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Text style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>styles<span class=\"token punctuation\">.</span>instructions<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n          To <span class=\"token keyword\">get</span> started<span class=\"token punctuation\">,</span> edit index<span class=\"token punctuation\">.</span>android<span class=\"token punctuation\">.</span>js\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Text<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Text style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>styles<span class=\"token punctuation\">.</span>instructions<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n          Double tap <span class=\"token constant\">R</span> on your keyboard to reload<span class=\"token punctuation\">,</span><span class=\"token punctuation\">{</span><span class=\"token string\">'\\n'</span><span class=\"token punctuation\">}</span>\n          Shake or press menu button <span class=\"token keyword\">for</span> dev menu\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Text<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>View<span class=\"token operator\">></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Delete everything inside of the render method. We're going to replace\nthat with a <code class=\"language-text\">&lt;Home /></code> component. This component will be used in both\nthe <code class=\"language-text\">index.ios.js</code> &#x26; <code class=\"language-text\">index.android.js</code> files.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">robotImpagination</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token operator\">&lt;</span>Home <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>If you tried to run this right now, it wouldn't work. We still need to\ncreate that component and import it. For smaller projects, I like to\nput my components in a <code class=\"language-text\">components</code> folder. You can name it and place\nit where ever you would like. For me it's <code class=\"language-text\">components</code> in the root of the\nproject: <code class=\"language-text\">robotImpagination/components/Home.js</code></p>\n<p>Inside of <code class=\"language-text\">Home.js</code> we should import React, the <code class=\"language-text\">Text</code> component from\nReact Native, and create a component that returns \"Hello!\":</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> React<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> Component <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Text <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react-native'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Home</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token operator\">&lt;</span>Text<span class=\"token operator\">></span>Hello<span class=\"token operator\">!</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Text<span class=\"token operator\">></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Now that we've actually created the <code class=\"language-text\">&lt;Home /></code> component we can import\nand use it in both of our index files (<code class=\"language-text\">index.ios.js</code> &#x26; <code class=\"language-text\">index.android.js</code>).</p>\n<p>Your index files should look something like this now:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> React<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> Component <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span>\n  AppRegistry<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react-native'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> Home <span class=\"token keyword\">from</span> <span class=\"token string\">'./components/Home'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">robotImpagination</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token operator\">&lt;</span>Home <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\nAppRegistry<span class=\"token punctuation\">.</span><span class=\"token function\">registerComponent</span><span class=\"token punctuation\">(</span><span class=\"token string\">'robotImpagination'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> robotImpagination<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Awesome! If you refresh your simulator you should now see a poorly styled\n\"Hello!\".</p>\n<p><code class=\"language-text\">&lt;Home /></code> will be the main component we will be working out\nof. This is so our code will run on both iOS &#x26; Android. Write once,\ncompile to both!</p>\n<h3 id=\"furnishing-our-home\" style=\"position:relative;\"><a href=\"#furnishing-our-home\" aria-label=\"furnishing our home permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Furnishing our Home</h3>\n<p>We now have an app that's uglier than what we started with. Don't\nfret, we're going to call on NativeBase to make everything look nice\nand clean. Inside of <code class=\"language-text\">Home.js</code> lets import four components:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// Native base for nice prestyled components</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span>\n  Header<span class=\"token punctuation\">,</span>\n  Container<span class=\"token punctuation\">,</span>\n  Title<span class=\"token punctuation\">,</span>\n  Content<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'native-base'</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>These components will provide the structure &#x26; styling going forward. I\nrecommend taking 10 minutes to review\nthe <a href=\"http://nativebase.io/docs/v0.5.13/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">NativeBase docs</a>. Now we can\nmake our lonely \"Hello!\" text look much better:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// imports here</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Home</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token operator\">&lt;</span>Container<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Header<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>Title<span class=\"token operator\">></span>Robot Impagination<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Title<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Header<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Content<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>Text<span class=\"token operator\">></span>Hello<span class=\"token operator\">!</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Text<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Content<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Container<span class=\"token operator\">></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>This should give you a styled header with bold text inside of it and our\n\"Hello!\" text isn't in the very top left of the device. Nice!</p>\n<p>Next, we should create at least one \"card\" where we will be rendering the\ncontent of each record into. Later on we will iterate over an array\nreturning many of these, but for now, we're only going to create one card.</p>\n<p>Thankfully we don't have to style this ourselves since NativeBase has\na\n<a href=\"http://nativebase.io/docs/v0.5.13/components#card\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">card component</a>. We\nneed to import two more components from NativeBase:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// Native base for nice prestyled components</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span>\n  Header<span class=\"token punctuation\">,</span>\n  Container<span class=\"token punctuation\">,</span>\n  Title<span class=\"token punctuation\">,</span>\n  Content<span class=\"token punctuation\">,</span>\n  Card<span class=\"token punctuation\">,</span>\n  CardItem\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'native-base'</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>And additionally the <code class=\"language-text\">Image</code> component from <code class=\"language-text\">react-native</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span>\n  Image<span class=\"token punctuation\">,</span>\n  Text<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react-native'</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Now that we have access to these components lets fill it in:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// imports here</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Home</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token operator\">&lt;</span>Container<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Header<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>Title<span class=\"token operator\">></span>Robot Impagination<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Title<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Header<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Content<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>Card style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span><span class=\"token literal-property property\">margin</span><span class=\"token operator\">:</span> <span class=\"token number\">10</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span>CardItem<span class=\"token operator\">></span>\n              <span class=\"token operator\">&lt;</span>Text<span class=\"token operator\">></span>Hello<span class=\"token operator\">!</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Text<span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>CardItem<span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span>CardItem<span class=\"token operator\">></span>\n              <span class=\"token operator\">&lt;</span>Image style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span><span class=\"token literal-property property\">resizeMode</span><span class=\"token operator\">:</span> <span class=\"token string\">'cover'</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span> source<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span><span class=\"token literal-property property\">uri</span><span class=\"token operator\">:</span> <span class=\"token string\">\"https://placekitten.com/640/440\"</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>CardItem<span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span>CardItem<span class=\"token operator\">></span>\n              <span class=\"token operator\">&lt;</span>Text<span class=\"token operator\">></span>Item description<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Text<span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>CardItem<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Card<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Content<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Container<span class=\"token operator\">></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre></div>\n<p>Our app should look something like this:</p>\n<p><img\nsrc=\"/img/2016-12-15-building-infinite-scroll-in-react-native_card-component-ios-screenshot.png\"\nalt=\"iOS Screenshot of the new card component styling\"\nstyle=\"width: 80%;\"\n/></p>\n<p>We have a nicely styled app with styled cards, lets start scrolling through\npaginated data!</p>\n<h3 id=\"creating-an-impagination-dataset\" style=\"position:relative;\"><a href=\"#creating-an-impagination-dataset\" aria-label=\"creating an impagination dataset permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Creating an Impagination dataset</h3>\n<p>The first thing we have to do is import Impagination into <code class=\"language-text\">Home.js</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> Dataset <span class=\"token keyword\">from</span> <span class=\"token string\">'impagination'</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Now create a method called <code class=\"language-text\">setupImpagination</code> inside of our Home\ncomponent. <code class=\"language-text\">setupImpagination</code> is where we're going to create a new\ninstance of Impagination, set the pageSize, and set the dataset on the\ncomponents local state. Earlier I mentioned that there are two\nrequired params from Impagination to work. Let's start by filling in\nthose two params.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Home</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">setupImpagination</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> dataset <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Dataset</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">pageSize</span><span class=\"token operator\">:</span> <span class=\"token number\">15</span><span class=\"token punctuation\">,</span>\n\n      <span class=\"token comment\">// Where to fetch the data from.</span>\n      <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">pageOffset<span class=\"token punctuation\">,</span> pageSize<span class=\"token punctuation\">,</span> stats</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">https://serene-beach-38011.herokuapp.com/api/faker?page=</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>pageOffset <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&amp;per_page=</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>pageSize<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span>\n          <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">response</span> <span class=\"token operator\">=></span> response<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n          <span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">error</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n            console<span class=\"token punctuation\">.</span><span class=\"token function\">error</span><span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n          <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// ...</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>The <code class=\"language-text\">fetch</code> function is where Impagination will hit your API to get\nmore pages. There are three arguments passed to the fetch function:\n<code class=\"language-text\">pageOffset</code> which is the current page it's going to fetch, <code class=\"language-text\">pageSize</code>\nwhich is a number of records in a page, and <code class=\"language-text\">stats</code> which can hold\n<code class=\"language-text\">totalPages</code> if your API supports it.</p>\n<p><strong>Note:</strong> you may need to add one to <code class=\"language-text\">pageOffset</code> since it's zero\nbased.</p>\n<p>This looks great! But we still have some work to do in order for it to\nwork. We currently have no way of accessing the data that is emitted by\nImpagination.</p>\n<p>Impagination has two different objects you will work with. One is\n<code class=\"language-text\">state</code> which holds all of the current records and the current state\nregarding that data. The other is the <code class=\"language-text\">dataset</code> which allows you to\ncall Impagination methods like <code class=\"language-text\">setReadOffset</code>.</p>\n<p>A new <code class=\"language-text\">state</code> is emitted every single time the data has changed. We can\nlisten for these changes using Impagination's <code class=\"language-text\">observe</code> method:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Home</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">setupImpagination</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> dataset <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Dataset</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">pageSize</span><span class=\"token operator\">:</span> <span class=\"token number\">15</span><span class=\"token punctuation\">,</span>\n\n      <span class=\"token comment\">// Anytime there's a new state emitted, we want to set that on</span>\n      <span class=\"token comment\">// the componets local state.</span>\n      <span class=\"token function-variable function\">observe</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">datasetState</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">setState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>datasetState<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n\n      <span class=\"token comment\">// Where to fetch the data from.</span>\n      <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">pageOffset<span class=\"token punctuation\">,</span> pageSize<span class=\"token punctuation\">,</span> stats</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">https://serene-beach-38011.herokuapp.com/api/faker?page=</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>pageOffset <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&amp;per_page=</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>pageSize<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span>\n          <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">response</span> <span class=\"token operator\">=></span> response<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n          <span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">error</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n            console<span class=\"token punctuation\">.</span><span class=\"token function\">error</span><span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n          <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// ...</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Now that we're\n<a href=\"https://facebook.github.io/react/docs/react-component.html#setstate\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">calling\n<code class=\"language-text\">setState</code></a> we\nhave to create our state object in the component constructor:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Home</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">super</span><span class=\"token punctuation\">(</span>props<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">dataset</span><span class=\"token operator\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">datasetState</span><span class=\"token operator\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">setupImpagination</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>While we're here we'll also add <code class=\"language-text\">dataset</code> into our state object.</p>\n<p>To pull all of this together and start fetching data we need to set the\ndataset on the components local state. Then we need to set the\n<code class=\"language-text\">readOffset</code> to record <code class=\"language-text\">0</code>. This is so Impagination knows exactly what\nrecord you are on when scrolling through the list. If we get close to\nthe end it will automatically fetch new records. You can read more\nabout <a href=\"https://github.com/flexyford/impagination#load-horizon\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">how this all\nworks here.</a></p>\n<p>The final look of our <code class=\"language-text\">setupImpagination</code> method:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Home</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n\n  <span class=\"token function\">setupImpagination</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> dataset <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Dataset</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">pageSize</span><span class=\"token operator\">:</span> <span class=\"token number\">15</span><span class=\"token punctuation\">,</span>\n\n      <span class=\"token comment\">// Anytime there's a new state emitted, we want to set that on</span>\n      <span class=\"token comment\">// the componets local state.</span>\n      <span class=\"token function-variable function\">observe</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">datasetState</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">setState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>datasetState<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n\n      <span class=\"token comment\">// Where to fetch the data from.</span>\n      <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">pageOffset<span class=\"token punctuation\">,</span> pageSize<span class=\"token punctuation\">,</span> stats</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">https://serene-beach-38011.herokuapp.com/api/faker?page=</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>pageOffset <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&amp;per_page=</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>pageSize<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span>\n          <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">response</span> <span class=\"token operator\">=></span> response<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n          <span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">error</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n            console<span class=\"token punctuation\">.</span><span class=\"token function\">error</span><span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n          <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// Set the readOffset to the first record in the state</span>\n    dataset<span class=\"token punctuation\">.</span><span class=\"token function\">setReadOffset</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">setState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>dataset<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Finally, as soon as the component starts to mount we want to setup our\ndata store. In <code class=\"language-text\">componentWillMount</code> lets call <code class=\"language-text\">setupImpagination</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Home</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n\n  <span class=\"token function\">setupImpagination</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n\n  <span class=\"token function\">componentWillMount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">setupImpagination</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Bam! Now when the app loads it will go off and fetch the first 15\nrecords from the API and set it on the local state of the\ncomponent. You can now access these records by doing\n<code class=\"language-text\">this.state.datasetState</code>.</p>\n<h3 id=\"looping-over-the-datasetstate\" style=\"position:relative;\"><a href=\"#looping-over-the-datasetstate\" aria-label=\"looping over the datasetstate permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Looping over the datasetState</h3>\n<p>With the styling and data now in place lets render it to the\nscreen. <code class=\"language-text\">this.state.datasetState</code> is an array-like object. This means we can\niterate over the state while still being able to access getters like\n<code class=\"language-text\">this.state.datasetState.readOffset</code> (which returns the current\n<code class=\"language-text\">readOffset</code>).</p>\n<p>We're going to map over the Impagination <code class=\"language-text\">state</code> and return a card:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Home</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n\n  <span class=\"token function\">setupImpagination</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n\n  <span class=\"token function\">componentWillMount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token operator\">&lt;</span>Container<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Header<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>Title<span class=\"token operator\">></span>Robot Impagination<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Title<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Header<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Content<span class=\"token operator\">></span>\n          <span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">.</span>datasetState<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">record</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n              <span class=\"token operator\">&lt;</span>Card style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span><span class=\"token literal-property property\">margin</span><span class=\"token operator\">:</span> <span class=\"token number\">10</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n                <span class=\"token operator\">&lt;</span>CardItem<span class=\"token operator\">></span>\n                  <span class=\"token operator\">&lt;</span>Text<span class=\"token operator\">></span>Hello<span class=\"token operator\">!</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Text<span class=\"token operator\">></span>\n                <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>CardItem<span class=\"token operator\">></span>\n                <span class=\"token operator\">&lt;</span>CardItem<span class=\"token operator\">></span>\n                  <span class=\"token operator\">&lt;</span>Image style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span><span class=\"token literal-property property\">resizeMode</span><span class=\"token operator\">:</span> <span class=\"token string\">'cover'</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span> source<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span><span class=\"token literal-property property\">uri</span><span class=\"token operator\">:</span> <span class=\"token string\">\"https://placekitten.com/640/440\"</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n                <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>CardItem<span class=\"token operator\">></span>\n                <span class=\"token operator\">&lt;</span>CardItem<span class=\"token operator\">></span>\n                  <span class=\"token operator\">&lt;</span>Text<span class=\"token operator\">></span>Item description<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Text<span class=\"token operator\">></span>\n                <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>CardItem<span class=\"token operator\">></span>\n              <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Card<span class=\"token operator\">></span>\n            <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n          <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Content<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Container<span class=\"token operator\">></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>If you refresh your simulator you should now see 15 kittens. But it's\n15 cards with same text over and over again. We can start to pull\ninformation from each record we're iterating over:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Home</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n\n  <span class=\"token function\">setupImpagination</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n\n  <span class=\"token function\">componentWillMount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token operator\">&lt;</span>Container<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Header<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>Title<span class=\"token operator\">></span>Robot Impagination<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Title<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Header<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Content<span class=\"token operator\">></span>\n          <span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">.</span>datasetState<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">record</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n              <span class=\"token operator\">&lt;</span>Card style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span><span class=\"token literal-property property\">margin</span><span class=\"token operator\">:</span> <span class=\"token number\">10</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n                <span class=\"token operator\">&lt;</span>CardItem<span class=\"token operator\">></span>\n                  <span class=\"token operator\">&lt;</span>Text<span class=\"token operator\">></span><span class=\"token punctuation\">{</span>record<span class=\"token punctuation\">.</span>content<span class=\"token punctuation\">.</span>title<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Text<span class=\"token operator\">></span>\n                <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>CardItem<span class=\"token operator\">></span>\n                <span class=\"token operator\">&lt;</span>CardItem<span class=\"token operator\">></span>\n                  <span class=\"token operator\">&lt;</span>Image style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span><span class=\"token literal-property property\">resizeMode</span><span class=\"token operator\">:</span> <span class=\"token string\">'cover'</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span> source<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span><span class=\"token literal-property property\">uri</span><span class=\"token operator\">:</span> record<span class=\"token punctuation\">.</span>content<span class=\"token punctuation\">.</span>image<span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n                <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>CardItem<span class=\"token operator\">></span>\n                <span class=\"token operator\">&lt;</span>CardItem<span class=\"token operator\">></span>\n                  <span class=\"token operator\">&lt;</span>Text<span class=\"token operator\">></span><span class=\"token punctuation\">{</span>record<span class=\"token punctuation\">.</span>content<span class=\"token punctuation\">.</span>description<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Text<span class=\"token operator\">></span>\n                <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>CardItem<span class=\"token operator\">></span>\n              <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Card<span class=\"token operator\">></span>\n            <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n          <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Content<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Container<span class=\"token operator\">></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Refreshing your simulator should bring up an error message that says\n<code class=\"language-text\">Cannot read property 'title' of null</code>. This is because Impagination\nemits an array with 15 items as soon as it's instantiated. Each record\nin the array has five state properties:</p>\n<ul>\n<li><code class=\"language-text\">isRequested</code></li>\n<li><code class=\"language-text\">isSettled</code></li>\n<li><code class=\"language-text\">isPending</code></li>\n<li><code class=\"language-text\">isResolved</code></li>\n<li><code class=\"language-text\">isRejected</code></li>\n</ul>\n<p>With these properties, we can tell exactly what state each record is\nin. This allows us to display different UI for each individual record\nif we please. In this case, we're going to show a loading spinner if\nthe record hasn't settled yet.</p>\n<p>Import the spinner component from NativeBase:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// Native base for nice prestyled components</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span>\n  Header<span class=\"token punctuation\">,</span>\n  Container<span class=\"token punctuation\">,</span>\n  Title<span class=\"token punctuation\">,</span>\n  Content<span class=\"token punctuation\">,</span>\n  Card<span class=\"token punctuation\">,</span>\n  CardItem<span class=\"token punctuation\">,</span>\n  Spinner<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'native-base'</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Then add a conditional inside the map function that returns different\nJSX:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Home</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n\n  <span class=\"token function\">setupImpagination</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n\n  <span class=\"token function\">componentWillMount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token operator\">&lt;</span>Container<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Header<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>Title<span class=\"token operator\">></span>Robot Impagination<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Title<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Header<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Content<span class=\"token operator\">></span>\n          <span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">.</span>datasetState<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">record</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>record<span class=\"token punctuation\">.</span>isSettled<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n              <span class=\"token keyword\">return</span> <span class=\"token operator\">&lt;</span>Spinner key<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token operator\">/</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span>\n\n            <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n              <span class=\"token operator\">&lt;</span>Card style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>styles<span class=\"token punctuation\">.</span>cardContainer<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n                <span class=\"token operator\">&lt;</span>CardItem<span class=\"token operator\">></span>\n                  <span class=\"token operator\">&lt;</span>Text<span class=\"token operator\">></span><span class=\"token punctuation\">{</span>record<span class=\"token punctuation\">.</span>content<span class=\"token punctuation\">.</span>title<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Text<span class=\"token operator\">></span>\n                <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>CardItem<span class=\"token operator\">></span>\n                <span class=\"token operator\">&lt;</span>CardItem<span class=\"token operator\">></span>\n                  <span class=\"token operator\">&lt;</span>Image style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span><span class=\"token literal-property property\">resizeMode</span><span class=\"token operator\">:</span> <span class=\"token string\">'cover'</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span> source<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span><span class=\"token literal-property property\">uri</span><span class=\"token operator\">:</span> record<span class=\"token punctuation\">.</span>content<span class=\"token punctuation\">.</span>image<span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n                <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>CardItem<span class=\"token operator\">></span>\n                <span class=\"token operator\">&lt;</span>CardItem<span class=\"token operator\">></span>\n                  <span class=\"token operator\">&lt;</span>Text<span class=\"token operator\">></span><span class=\"token punctuation\">{</span>record<span class=\"token punctuation\">.</span>content<span class=\"token punctuation\">.</span>description<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Text<span class=\"token operator\">></span>\n                <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>CardItem<span class=\"token operator\">></span>\n              <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Card<span class=\"token operator\">></span>\n            <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n          <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Content<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Container<span class=\"token operator\">></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>This is great! It now will render each record with their own\ncontent. But it's pretty hard to read that <code class=\"language-text\">render</code> method, we should\nrefactor the card into its own presentation component. Create another\ncomponent in the <code class=\"language-text\">components</code> folder called <code class=\"language-text\">RobotItem.js</code>. Then copy\nand paste the card component code from <code class=\"language-text\">Home.js</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> React<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> Component <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span>\n  Text<span class=\"token punctuation\">,</span>\n  Image<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react-native'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span>\n  Card<span class=\"token punctuation\">,</span>\n  CardItem<span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'native-base'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">RobotItem</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">super</span><span class=\"token punctuation\">(</span>props<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>recordData <span class=\"token operator\">=</span> props<span class=\"token punctuation\">.</span>record<span class=\"token punctuation\">.</span>content<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token operator\">&lt;</span>Card style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span><span class=\"token literal-property property\">margin</span><span class=\"token operator\">:</span> <span class=\"token number\">10</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>CardItem<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>Text<span class=\"token operator\">></span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>recordData<span class=\"token punctuation\">.</span>title<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Text<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>CardItem<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>CardItem<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>Image style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span><span class=\"token literal-property property\">resizeMode</span><span class=\"token operator\">:</span> <span class=\"token string\">'cover'</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span> source<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span><span class=\"token literal-property property\">uri</span><span class=\"token operator\">:</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>recordData<span class=\"token punctuation\">.</span>image<span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>CardItem<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>CardItem<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>Text<span class=\"token operator\">></span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>recordData<span class=\"token punctuation\">.</span>description<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Text<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>CardItem<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Card<span class=\"token operator\">></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre></div>\n<p>We also create a little shorthand in the constructor so we don't have\nto type <code class=\"language-text\">this.props.record.content</code> each time we have to access\ndata.</p>\n<p>There's still a little bit of refactoring left in <code class=\"language-text\">Home.js</code>. We're\ngoing to pull the map out of the render function and put it into its\nown method called <code class=\"language-text\">renderItem</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Home</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n\n  <span class=\"token function\">setupImpagination</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n\n  <span class=\"token function\">componentWillMount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n\n  <span class=\"token function\">renderItem</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">.</span>datasetState<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">record</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>record<span class=\"token punctuation\">.</span>isSettled<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token operator\">&lt;</span>Spinner key<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token operator\">/</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n\n      <span class=\"token keyword\">return</span> <span class=\"token operator\">&lt;</span>RobotItem record<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>record<span class=\"token punctuation\">}</span> key<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>record<span class=\"token punctuation\">.</span>content<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token operator\">&lt;</span>Container<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Header<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>Title<span class=\"token operator\">></span>Robot Impagination<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Title<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Header<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Content<span class=\"token operator\">></span>\n          <span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">renderItem</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Content<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Container<span class=\"token operator\">></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Don't forget to prune the imports we're no longer using at the top of\n<code class=\"language-text\">Home.js</code>.</p>\n<h3 id=\"putting-the-infinite-in-scroll\" style=\"position:relative;\"><a href=\"#putting-the-infinite-in-scroll\" aria-label=\"putting the infinite in scroll permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Putting the \"infinite\" in scroll</h3>\n<p>We're so close! It's now rendering all 15 items in our first page but\nwe're not able to scroll to the bottom and retrieve new records. Why?\nIt's because as we scroll we have to set Impagination's\n<code class=\"language-text\">readOffset</code>. Basically, we have to tell Impagination which record is\ncurrently being viewed by the user.</p>\n<p>As we progress through the list of records Impagination will fetch more pages\nif <a href=\"https://github.com/flexyford/impagination#load-horizon\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">we're within the <code class=\"language-text\">loadHorizon</code>.</a>\nBy default, the <code class=\"language-text\">loadHorizon</code> is the same as the page size. This means\nImpagination is constantly keeping track of where we're at so it can\nsmartly fetch new records as needed. If you up the <code class=\"language-text\">loadHorizon</code> to 30\nit'll load even more pages ahead of the current scroll position.</p>\n<p>In order to set the <code class=\"language-text\">readOffset</code> we're going to hook into the\n<code class=\"language-text\">onScroll</code> event on the <code class=\"language-text\">&lt;Content></code> component. The <code class=\"language-text\">&lt;Content></code>\ncomponent descends from React Natives <code class=\"language-text\">ScrollView</code> component, so if\nyou're not using NativeBase you can still use this same method.</p>\n<p>Let's create a method called <code class=\"language-text\">setCurrentReadOffset</code> and then call that\nanytime the scroll event is called.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Home</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n\n  <span class=\"token function\">setupImpagination</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n\n  <span class=\"token function\">componentWillMount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n\n  <span class=\"token function\">renderItem</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n\n  <span class=\"token function-variable function\">setCurrentReadOffset</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// Log the current scroll position in the list in pixels</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>nativeEvent<span class=\"token punctuation\">.</span>contentOffset<span class=\"token punctuation\">.</span>y<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token operator\">&lt;</span>Container<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Header<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>Title<span class=\"token operator\">></span>Robot Impagination<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Title<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Header<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Content onScroll<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>setCurrentReadOffset<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n          <span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">renderItem</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Content<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Container<span class=\"token operator\">></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>If you refresh your simulator, enable remote JS debugging, scroll the\nlist, and then look in the JS console you should see a bunch of logs\nwith numbers. This is the current scroll position of the list in\npixels. We're going to use <code class=\"language-text\">contentOffset.y</code> to help calculate what\nrecord we're seeing in the viewport.</p>\n<p>Since this list is rendering items with the <em>exact</em> same height each\ntime it's pretty easy for us to figure out what item is currently\nscrolled into view. You take the <code class=\"language-text\">currentOffset.y</code> and divide it by the\nitems height. That's your current <code class=\"language-text\">readOffset</code> (aka the current record\nin view).</p>\n<p>Finally, we should throttle the amount of times <code class=\"language-text\">setCurrentReadOffset</code>\nis called. As of right now it's called every single time there's a\nscroll event, which is extremely noisy. We'll cut this down by\nsetting <code class=\"language-text\">scrollEventThrottle</code> to <code class=\"language-text\">300</code> (ms).</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Home</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n\n  <span class=\"token function\">setupImpagination</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n\n  <span class=\"token function\">componentWillMount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n\n  <span class=\"token function\">renderItem</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n\n  <span class=\"token function-variable function\">setCurrentReadOffset</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> itemHeight <span class=\"token operator\">=</span> <span class=\"token number\">402</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> currentOffset <span class=\"token operator\">=</span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">floor</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>nativeEvent<span class=\"token punctuation\">.</span>contentOffset<span class=\"token punctuation\">.</span>y<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> currentItemIndex <span class=\"token operator\">=</span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">ceil</span><span class=\"token punctuation\">(</span>currentOffset <span class=\"token operator\">/</span> itemHeight<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">.</span>dataset<span class=\"token punctuation\">.</span><span class=\"token function\">setReadOffset</span><span class=\"token punctuation\">(</span>currentItemIndex<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token operator\">&lt;</span>Container<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Header<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>Title<span class=\"token operator\">></span>Robot Impagination<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Title<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Header<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Content scrollEventThrottle<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token number\">300</span><span class=\"token punctuation\">}</span> onScroll<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>setCurrentReadOffset<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n          <span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">renderItem</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Content<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Container<span class=\"token operator\">></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Go ahead, refresh your simulator and scroll through that list! The API\nonly has 100 records seeded to the DB so don't expect it to be\n<em>truly</em> infinite. Here's a GIF of what we've built together:</p>\n<p><img src=\"/img/2016/12/15/building-infinite-scroll-in-react-native/finished-robotImpagination-app.gif\" alt=\"GIF demo of the app we just built together\"></p>\n<p><a href=\"http://3.bp.blogspot.com/-ZjTOxpVwQfY/VapQ75EsTAI/AAAAAAAABd4/7KWaSGgYWtQ/s1600/image002.gif\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">It's so beautiful.</a></p>\n<h3 id=\"one-last-optimization\" style=\"position:relative;\"><a href=\"#one-last-optimization\" aria-label=\"one last optimization permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>One last optimization</h3>\n<p>Using a <code class=\"language-text\">ScrollView</code> for something that is truly infinate might not be\nthe best idea but you can add one property to the <code class=\"language-text\">ScrollView</code>\nsignificantly cut the memory usage: <code class=\"language-text\">removeClippedSubviews</code>. Since\nNativeBase's <code class=\"language-text\">Content</code> component is backed by a <code class=\"language-text\">ScrollView</code> we can\nuse this same property. <code class=\"language-text\">removeClippedSubviews</code> will take the off\nscreen cards and remove them from the native backing superview.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Home</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n\n  <span class=\"token function\">setupImpagination</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n\n  <span class=\"token function\">componentWillMount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n\n  <span class=\"token function\">renderItem</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n\n  <span class=\"token function-variable function\">setCurrentReadOffset</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">//... }</span>\n\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token operator\">&lt;</span>Container<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Header<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>Title<span class=\"token operator\">></span>Robot Impagination<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Title<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Header<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Content scrollEventThrottle<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token number\">300</span><span class=\"token punctuation\">}</span> onScroll<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>setCurrentReadOffset<span class=\"token punctuation\">}</span> removeClippedSubviews<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n          <span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">renderItem</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Content<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Container<span class=\"token operator\">></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"conclusion\" style=\"position:relative;\"><a href=\"#conclusion\" aria-label=\"conclusion permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Conclusion</h3>\n<p>First off, great job! You have just built infinite scroll in React\nNative from scratch, which isn't an easy task. In about an hour we were\nable to take a library that was originally written to solve a problem\nin Ember.js and apply it to a React Native Project.</p>\n<p>I think this speaks volumes about the power of writing libraries in\nplain old JavaScript. Not only can this library be used in any type\nJavaScript project, it will have access to a broader community. This is because\nany JavaScript developer can jump in and contribute back to the\nproject.</p>\n<p>For me, this means I can finally realize my childhood dream of building\nan iOS app. I don't have to relearn an entire development\necosystem. Sure you'll have to learn new things about native\ndevelopment but the barrier to entry is tremendously lower.</p>\n<p>Here's my hot take on where React Native fits into the JS ecosystem.\nReact Native has hit the sweet spot that Cordova and PhoneGap has been\ntrying to hit for years: you can write native apps in JavaScript with\nno performance implications. As we’ve seen, it’s easy to share the\nsame JavaScript libraries from the web and node (if that’s your\nthing), to your native app. Now that’s amazing.</p>\n<p>Web developers have been trying to recreate \"that native experience\" in\nthe browser for years. But here's the thing: native is a moving\ntarget. So if you can't keep up, why not join them? But join them with\nyour existing JavaScript knowledge. Sounds like the best of both\nworlds to me!</p>\n<p>Once again if you would like to take a look at the completed app <a href=\"https://github.com/Robdel12/robotImpagination\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">here's\nthe GitHub repo.</a> If\nyou have any questions, comments, or feedback I'm always available on\n<a href=\"https://twitter.com/robdel12\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Twitter @robdel12</a></p>\n<p><a href=\"http://www.hutui6.com/atom-wallpapers/67525236.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Image credit</a></p>","frontmatter":{"date":"December 15, 2016","description":"Tackling infinite scroll can be hard on any platform. But thankfully React Native allows you to use base JavaScript libraries to solve problems in native apps. We're going to take Impagination.js and build an infinite scrolling list that is silky smooth and painless data management.","tags":["react native","react","infinite scroll","impagination"],"img":{"childImageSharp":{"fixed":{"src":"/static/92286829eefe2ccc5def3aff56b4c1f7/a7715/2016-12-15-building-infinite-scroll-in-react-native_react-native-header.jpg"}}}}}}},"pageContext":{"id":"42507d77-894d-5278-b850-f4da2b79ab66"}},
    "staticQueryHashes": ["1241260443"]}