Skip to main content

Fun with Meteor, React, and React-Bootstrap

React-Bootstrap is pretty cool. I decided to play with it a bit.  Here are the basics.

In an already set up Meteor project (set up for React), it is added thus:

npm install --save react-bootstrap

Once this is done, you also need to add a bootstrap library. It could either be the twitter bootstrap meteor package, or you can link to it. For the purpose of my demo, I just grabbed a couple links from the React-Bootstrap site that they had handy for pulling in from a CMS:

index.html

<head>
    <!-- Latest compiled and minified CSS -->
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/latest/css/bootstrap.min.css" 
          rel="stylesheet">
    </link>

    <!-- Optional theme -->
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/latest/css/bootstrap-theme.min.css" 
          rel="stylesheet">
    </link>
</head>

Now, let's make a layout, and then create a component that we can render into it. We'll make it a modal, with a close button, and a "click me" button that will just add some text inside the modal. From this you can extrapolate how to make use of the framework.

Layout.jsx

import React from 'react';

export const Layout = ({content}) => (
  <div>
    <h1>My React App</h1>
    <hr />
    <div>{content}</div>
  </div>
);

And the component:

Mod.jsx

import React             from 'react';
import { Button, Modal } from 'react-bootstrap';

const handleClick = (event) => {
  event.preventDefault();
  document.querySelector('#foo').innerHTML="Yeah, I pushed it";
};

const handleHide = (event) => {
  event.preventDefault();
  document.querySelector('.static-modal').style.display='none';
}

export const Mod = () => (
  <div className="static-modal">
    <Modal.Dialog>
      <Modal.Header>
        <Modal.Title>Modal Title>
      </Modal.Header>

      <Modal.Body>
        One fine body...
        <p id="foo"></p>
      </Modal.Body>

      <Modal.Footer>
        <Button bsStyle="danger"  onClick={handleHide}>Close</Button>
        <Button bsStyle="primary" onClick={handleClick}>Click Me</Button>
      </Modal.Footer>

    </Modal.Dialog>
  </div>
);

And then just a route to show it:

router.js

import React       from 'react';
import { mount }   from 'react-mounter';
import { Layout }  from './Layout.jsx';
import { Mod.jsx } from './Mod.jsx';

FlowRouter.route("/", {
  action() {
    mount(Layout, {
      content: (<Mod />)
    });
  }
});

Let's talk about what we've got. I re-used/re-purposed some of the code my from last article, and, I modified the code the folks at React-Bootstrap demo on their site. The following will explain each of the code blocks above:

index.html is just to load in bootstrap css and theme from a Content Delivery Network.

Layout.jsx create's a container component that will hold our page content. It's just a div that accepts a component to render within itself.

Mod.jsx is our file of interest.
Note that React-Bootstrap exposes objects we can import and use. The two I'm using here are Button, and Modal. We need to import whatever objects we want to use. I only used two here, but look at their components documentation, there are a lot of goodies there to play with.

The next thing to know about React-Bootstrap components are that they have properties. The only property I used here was bsStyle, to get one each of a bootstrap danger, and success css class.

The click event handlers are just plain old Javascript. In the case of the Close Button, I simply grab the class of the Modal Component's parent, and hide it.  For the Click Me Button, I insert text into the paragraph element with id of "foo".  All very basic.  What is nice, is that using React, the mark-up and the code that it uses can be contained together.  Essentially, one file, one component.

Comments

Popular posts from this blog

Codeigniter vs. Kohana Database access speeds

I was doing some basic profiling for a project in which I needed the fastest raw speed I could get with database queries. I'm a fan of Codeigniter for projects that are suitable for it, but had heard from some that Kohana was faster, so I decided to do a very basic comparison of the two. I was using MAMP for OSX, and created a very small db, with a table that had 3 fields: (id), (first), and (last). The data sample was also very small, only a few records. The basic query I tested was a "SELECT * FROM [table]". There is of course nothing remotely scientific about this. It was just a quick ad dirty, very limited comparison. Take it as such. Versions used: CI2.1.3, Kohana 3.3.0. Codeigniter I really like Codeigniter (CI). But, one thing that is very evident from their own profiling functions, is that CI is a bit of a memory hog! Essentially, the same Controller function running in CI takes approximately 10X more memory than in Kohana! This in itself is not ...

Java application opening then immediately closing on OSX

I have had several occasion's where Java apps would open, and then immediately close.  Often, I don't have the time to dig into the reason, as they aren't crucial.  So, I just move on. Recently, I was maddened by this happening to an application ( see other blog post on Kindle Previewer ) I really needed to use, so I had to get into the trench.  After cracking open the app, and rooting through the various files, I did some spot-checks of the java version used to build the jars ( 2 bytes at offsets 6 & 7 ), as well as had a look at the info.plist, which had the JVMVersion key set at 1.5+. Since Oracle took over Java, Apple has essentially abandoned it to them, and hasn't done an update I *think* since version 6. All of Apple's Tooling for Java stops with JVMVersion key's of 6* and 6+.  The short answer to all this is, if something was built using Apple's AppBundler tools, and you have updated Java on your Mac to 7 or above, you're probably SOL to g...

Add pre-compiled Elixir on OS X

So, I've been a big Erlang fan for a few years now, and then found out about Elixir :  what I would describe as kind of a Ruby -ish creamy frosting on top of Erlang . But I'll address more on both in future. Right now, I thought I'd just give a quick and dirty way to add Elixir , if you've already got Erlang installed (hint: check-out this Erlang Solutions link for a pre-compiled Erlang solution).  You can also use brew to install both , but I have found that with the simplicity of brew, you give up having the most current version of software.  In both cases. The pre-compiled zip for the most current version of  Elixir can be found here .  Unzipping reveals a folder containing everything you need.  For simplicity's sake, keeping everything pertaining to Elixir all within this folder makes the most sense.  By doing so, all that's needed is to position the folder, and then make links to all the executables in a directory already in our path.  Through t...