# PhoenixReactor
Library which main aim is to provide an easy way to use [React](https://facebook.github.io/react/) with [Phoenix](http://www.phoenixframework.org/) framework.
## Installation
1. Add phoenix_reactor to your list of dependencies in `mix.exs`:
        def deps do
          [{:phoenix_reactor, "~> 0.0.3"}]
        end
2. Get dependency:
        mix deps.get
3. Compile your phoenix project:
        mix compile
BTW: It is assumed that you have created your phoenix project with `--no-brunch` option i.e.
        mix phoenix.new --no-brunch hello_phoenix
## Tasks
After compiling your Phoenix application you will get new mix task at your disposal:
        mix phoenix_reactor.install
Above task will install a bunch of new files (providing that they do not exist):
        ./.babelrc
        ./packages.json
        ./webpack.config.js
        ./web/static/js/app.js
        ./web/static/js/phoenix_reactor.js
and call npm to install dependencies.
If you want to skip babel and webpack installation run above task with `--no-webpack` option:
        mix phoenix_reactor.install --no-webpack
After installation, remember to add following watcher definition:
        watchers: [node: ["node_modules/webpack/bin/webpack.js", "--watch", "--color"]]
to your `./config/dev.exs` file
## Usage
PhoenixReactor gives you a convinient `PhoenixReactor.react_container` function which allows you to render react components. You can use it in templates or view modules.
1. In a template file:
        <%# show.html.eex %>
        ...
        <p>
          <%= PhoenixReactor.react_container "hello", %{name: @name} %>
        </p>
        ...
2. In a view module (replacing the whole template with a react component):
        # home_view.ex
        def render("show.html", assigns) do
          PhoenixReactor.react_container "hello", %{name: assigns[:name]}
        end
Before you will be able to use any react component you must export it. To do that in your app.js file call `exportComponent` function defined in the `phoenix_reactor` module. For example:
        // app.js
        import {exportComponent} from "./phoenix_reactor"
        import Hello from "./components/hello"
        exportComponent("hello", Hello)
In that case component `Hello` will be visible for `PhoenixReactor.react_container` under the name of `hello` (or whichever other name you wish).
To have the whole picture the `Hello` component could look like following:
        // components/hello.js
        import React from "react"
        export default ({name}) => {
          return (
            <div>
              <h1>Hello, {name}!</h1>
            </div>
          )
        }