Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/cultureamp/react-elm-components
Write React components in Elm
https://github.com/cultureamp/react-elm-components
Last synced: about 2 months ago
JSON representation
Write React components in Elm
- Host: GitHub
- URL: https://github.com/cultureamp/react-elm-components
- Owner: cultureamp
- License: bsd-3-clause
- Created: 2016-07-01T16:31:45.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2024-01-30T18:36:06.000Z (11 months ago)
- Last Synced: 2024-04-15T11:54:29.802Z (8 months ago)
- Language: Elm
- Homepage: https://www.npmjs.com/package/react-elm-components
- Size: 432 KB
- Stars: 778
- Watchers: 24
- Forks: 60
- Open Issues: 18
-
Metadata Files:
- Readme: readme.md
- License: license.md
Awesome Lists containing this project
- awesome - react-elm-components - Write React components in Elm (Elm)
README
# Write React components in Elm
This package makes it easy to turn Elm code into React components.
Companies that use [Elm](http://elm-lang.org/) in production usually start with a single component. So if you want to use Elm at work, start with a small experiment. Do people think it is nice? Do more! Do people think it sucks? Do less!
Read more about how to use Elm at work [here](http://elm-lang.org/blog/how-to-use-elm-at-work).
## Example
- Emoji Chat Room — [Demo](http://evancz.github.io/react-elm-components) / [Code](example)
## Usage
After you have compiled an Elm program to JavaScript, you can embed it in React like this:
```javascript
import Elm from 'react-elm-components'
import { Todo } from '../dist/elm/todomvc.js'function render() {
return
}
```### Flags
Sometimes you want to give your Elm program some **flags** on start up. For example, maybe your `Todo` module needs to get an array of todos. You would write something like this:
```javascript
import Elm from 'react-elm-components'
import { Todo } from '../dist/elm/todomvc.js'function render() {
var flags = { todos: ["Get Milk", "Do Laundry"] };
return
}
```These flags will be given to the Elm program, allowing you to do some setup work in JS first.
### JavaScript/Elm Interop
As your Elm program gets fancier, you will probably need to interact with JavaScript. We do this with [**ports**](http://guide.elm-lang.org/interop/javascript.html). Think of these as holes in the side of an Elm program that let you pass messages back-and-forth.
So maybe we extend our `Todo` app to allow outsiders to register new tasks through the `todos` port. And maybe we also expose `numActiveTodos` so that the outsider can know how much work you have left. You would set it up like this:
```javascript
import Elm from 'react-elm-components'
import { Todo } from '../dist/elm/todomvc.js'function render() {
return
}function setupPorts(ports) {
ports.numActiveTodos.subscribe(function(n) {
console.log(n);
});ports.todos.send("Invent the Universe");
ports.todos.send("Bake an Apple Pie");
}
```In the `setupPorts` function, we first subscribe to the `numActiveTodos` port. Whenever the number of active todos changes, we will run that function and log the number on the console. After that, we send two values through the `todos` port. This will add both of these into the model *and* trigger the `numActiveTodos` callback twice.
## Advanced Usage
Once the Elm component is initialized, changing the `flags` and `ports` properties will do nothing. So here are some tricks that may help you out:
1. If you want to reinitialize your Elm component, add a different `key` to the old and new components. This way old one is destroyed and replaced by the new one.
2. If you want to mess with ports, you can save the `ports` object into your `state` and access it later.
3. This package is super simple. Fewer than 20 lines. Check out the implementation and do it different if you want!## Angular, Ember, etc.
If you want to embed Elm in Angular or Ember or whatever else, you are in luck!
[The implementation](index.js) is under 20 lines, mostly React-related. The important lines are basically running the following program at the correct time:
```javascript
var Elm = require('../dist/elm/todomvc.js');
var app = Elm.Todo.embed(node, flags);
setupPorts(app.ports)
```So if you are interested in embedding Elm in something else, do the same trick! You can get more complete docs on embedding Elm in HTML [here](http://guide.elm-lang.org/interop/html.html) and JavaScript interop [here](http://guide.elm-lang.org/interop/javascript.html). Let the community know if you make something!
---
react-elm-components is maintained by the Front End Capability Team at Culture Amp.