补充:
思考以后觉得使用 $ = React.DOM
来写 $.div {}
的语法更好
而且不会遇到 this
被绑架的问题,更贴近官方文档里的写法.
所以下面的方案大家先看看熟悉下,再考虑下是否直接用 $.div
实际编程
Facebook 的 React,不熟悉情况自己看文档..
React 是在 JS 代码中使用模版生成的 Virtual DOM 的,但是用了 .jsx
文件.jsx
特殊之处是代码里可以直接嵌入 HTML,再预处理为 .js
内容
作为括号厌恶者,我非常在乎有没有 CoffeeScript 语法可以完成这个事情
网站找到几个:
atom/react-coffee
https://github.com/atom/react-coffee (仓库不存在了...)
目测是 CommonJS 规范加载:
class Welcome extends Component render: -> @div -> @text "Hello" @span @props.name component = new Welcome(name: "World") element = component.buildElement()
atom/reactionary
https://github.com/atom/reactionary
element = div className: "greeting",key: "fancy-key",div className: "header",h1 "Hello World" div className: "body",p "Each and every one of you"
elucidata/react-coffee
https://github.com/elucidata/react-coffee
目测 CommonJS 规范:
{div}= React.DOM class UserChip extends React.Component @staticMethod: -> # becomes a static method on the React Component "hello" render: -> (div null,"Hello") module.exports= UserChip.toComponent()
snd/react-kup
https://github.com/snd/react-kup
目测 CommonJS
# react-kup doesn't come with react. # require your favorite version ... react = require 'react' # ... and tell react kup to use it reactKup = require('react-kup')(react) # react-kup has been tested against react@0.10.0-rc1 # which is recommended HelloMessage = React.createClass render: -> that = this reactKup (k) -> k.div "Hello #{that.props.name}" mountNode = document.getElementById('example') component = new HelloMessage({name: 'John'}) React.renderComponent component,mountNode
yang/reactive-coffee
https://github.com/yang/reactive-coffee
main = -> currentTask = rx.cell(tasks.at(0)) # "View model" of currently selected task $('body').append( div {class: 'task-manager'},[ h1 {},bind -> ["#{tasks.length()} task(s) for today"] ul {class: 'tasks'},tasks.map (task) -> li {class: 'task'},[ input {type: 'checkBox',init: -> @change => task.isDone.set(@is(':checked'))} span {class: 'descrip'},bind -> [ "#{task.descrip.get()} (#{task.priority.get()})" ] a {href: 'javascript: void 0',init: -> @click => currentTask.set(task)},[ 'Edit' ] ] button {init: -> @click => tasks.push(new Task('Task','none',false))},[ 'Add new task' ] taskEditor { task: bind -> currentTask.get() onSubmit: (descrip,priority) -> currentTask.get().descrip.set(descrip) currentTask.get().priority.set(priority) } ] )
jsdf/coffee-react
https://github.com/jsdf/coffee-react
https://github.com/jsdf/coffee-react-transform
需要预处理..
NeatComponent = React.createClass render: -> {showTitle,neat} = @props <div className="neat-component"> {<h1>A Component is I</h1> if showTitle} Coffeescript really saves a lot of typing... {<p>is this component neat?<br />{neat}x{times}</p> for times in [1..10]} </div>
以上来自 Google 和 GitHub 搜索,以后要有遇到再添加.
最后,加上我做的比较粗糙的版本: https://github.com/jiyinyiyong/coffee-react-dom
Comment = React.createClass render: -> props = @props dom -> @div class: 'comment',@h2 class: 'comment-author',props.author props.children