Skip to main content

Dead Simple React.js with Meteor

I spent a little time exploring the patterns involved in using React.js with Meteor. It's incredibly easy, it turns out. I'll show some examples here.

The setup:

meteor add kadira:flow-router
npm install react react-dom react-mounter
npm install react-addons-pure-render-mixin
meteor add react-meteor-data

Then of course remove all blaze related meteor packages. Ok, Some basic component patterns: Let's create one that accepts a single argument:

Hello.jsx

import React from 'react';
export const Hello = ({name}) => (
  <div>Hello, {name}</div>
);

That's all there is to it. Now, let's see a pattern for a component that takes two arguments. We can see that to add further arguments, we can just tack them on after the first two:

TwoArgs.jsx

import React from 'react';
export const TwoArgs = ({one, two}) => (
  <div>
    <h2>TwoArgs!</h2>
    <h3>One is: {one}</h3>
    <h3>Two is: {two}</h3>
  </div>
);

"But, I really want a button that sets some text!"  Alright then, glad you asked:

WithButton.jsx

import React from 'react';

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

const WithButton = () => (
  <div>
    <button onclick="handleClick">Click Me&lt/button>
    <p>A handsome button sits above me</div>
    <p id="foo"></>
  </div>
);


Now, lets make a layout we can render our components into:

Layout.jsx

import React, { Component } from 'react';

export const Layout = ({content}) => (
  <div>{content}</div>
);

Finally, let's set up some routing:

router.js

import React from 'react';
import { mount } from 'react-mounter';
import { Layout } from './Layout.jsx';
import { Hello } from './Hello.jsx';
import { TwoArgs } from './TwoArgs.jsx';
import { WithButton } from './WithButton.jsx';

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

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

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

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 ...

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 tha...