For our main project in this course, we will use webpacker. So let's start by building on top of the app we created in the previous lesson with webpacker.
Note: We're not going to use the react-rails or react_on_rails gems for our app, so proceed from here with just the webpacker setup from the previous lesson (without the other third-party gems).
Let’s create a new component called Eventlite for our app in app/javascript/packs/Eventlite.js:
Note: We're not going to use the react-rails or react_on_rails gems for our app, so proceed from here with just the webpacker setup from the previous lesson (without the other third-party gems).
Let’s create a new component called Eventlite for our app in app/javascript/packs/Eventlite.js:
import React from 'react' import ReactDOM from 'react-dom' const Eventlite = props => ( <div>Welcome to Eventlite</div> ) document.addEventListener('DOMContentLoaded', () => { ReactDOM.render( <Eventlite />, document.body.appendChild(document.createElement('div')), ) })
We'll keep things simple for now and have just one page where we can create events and list them.
Let’s start by creating a list of events.
We’ll send the events data from our controller to the view and then display it inside the React component.
At the moment, we don’t have a database model for saving event data, so for now, we’ll start by passing in some dummy JSON data.
Inside the index action in events_controller.rb:
class EventsController < ApplicationController def index @events = [ { title: "London Retail Expo", datetime: "Monday 21 Oct, 2019", location: "London Excel Centre" }, { title: "Enterprise Sales Training Workshop", datetime: "Tuesday 22 Oct, 2019", location: "Expert Sales Company Headquarters" }, { title: "Ruby Hack Night", datetime: "Friday 25 Oct, 2019", location: "Learnetto Headquarters" }, { title: "Beginners Salsa dance meetup", datetime: "Saturday 26 Oct, 2019", location: "Bar Salsa" } ] end end
We can access this data from our index view with a content_tag.
In events/index.html.erb:
<h1 class="logo">Eventlite</h1> <%= javascript_pack_tag 'Eventlite' %> <%= content_tag :div, id: "events_data", data: @events.to_json do %> <% end %>
Now we need to update the Eventlite component to use this data.
First, we parse the JSON and pass it as a prop called events to the Eventlite component:
In Eventlite.js:
document.addEventListener('DOMContentLoaded', () => { const node = document.getElementById('events_data') const data = JSON.parse(node.getAttribute('data')) ReactDOM.render( <Eventlite events={data} />, document.body.appendChild(document.createElement('div')), ) })
Now that the component has the events data as a prop, we can loop through the events to display each event’s information.
Let’s start by displaying the titles for all events in a simple list.
In Eventlite.js:
const Eventlite = props => ( <div> {props.events.map(function(event){ return( <div className="event">{event.title}</div> ) })} </div> )
Add some CSS to style the page and events:
application.css:
body { width: 500px; margin: auto; font-family: Arial; color: #333333; } h1.logo { font-weight: 400; font-size: 40px; }
events.scss:
.event { padding: 20px 0; border-bottom: solid 1px #EAEAEA; }
Refresh the web page to see the result:
So that's the basic setup of our app done. Next, we'll look at how we are going to structure all the components and build further.