This is the second of three of blog posts about creating an app with React Native. To get started with React Native, read the Basics of React Native. Once you are familiar with the system and have an app, it is time to fill it out with content. If you don’t have content on your Drupal website, read Understanding Drupal 8’s Migrate API.
Exposing Drupal content
Some helpful modules to expose Drupal content are: Views, RESTful Web Services, and Serialization. The concept of getting Drupal content to an endpoint is simple:
- Build a view containing the data you want to expose.
- Add a “REST export” display to the view. During this step, select the appropriate serialization type.
- This will automatically create a REST endpoint at the URL.
The dataflow should look something like this: Drupal Content -> View -> Serializer -> REST endpoint.
Using fetch to asynchronously retrieve data
React Native’s compiler is Babel, which means ES6 code can be used anywhere in the project. This is useful for retrieving data, because ES6 enables the async
and await
keywords. When used in conjunction with something like fetch, you can create a smooth and elegant solution for pulling data from a server, such as content from a Drupal website.
The code for pulling from a Drupal website REST endpoint is the same as REST endpoint. It should look something like this:
async getSomeData() { let url = "https://data.org/useful/data"; let response = await fetch(url); let data = await response.text(); return data; }
The advantage to making a call like this asynchronously is that it allows other threads to continue running while the fetch is waiting for the server call to return with all of the data it ordered. This improves the user experience because it allows them to continue using other functions while the data loads.
Building a FlatList from a data set
After pulling in data from the endpoint, add a component to display the data. <FlatList>
is an excellent component already built in to React Native. These components are useful because they could handle infinite amounts of data without impacting performance, since they only render the part of the list that is currently on screen.
A <FlatList>
component takes two props for displaying data. You may need to massage the data to make it easier to use inside a <FlatList>
. The first prop is the set of data that it will display. The next prop required by a <FlatList>
is renderItem
, which describes how the data should be displayed. This is a JSX object that tells the <FlatList>
component how to represent each list item, and what fields to pull from the data. You can use any component inside renderItem
.
The ListItem component provided by React Native Elements has lots of styling features, like color gradients and automatic chevron placement.
Here is an example <FlatList>
:
<FlatList> style={{backgroundColor: '#ededed'}} data= {this.state.peopleData} renderItem={({person}) => <View> <ListItem title={person.name} titleStyle={{ color: '#00AEED', fontWeight: 'bold' }} subtitle={person.position} /> </View> } />
With the skills to expose, retrieve, and display your data, you can integrate a Drupal website with your new React Native app.