在完成React教程之后,这是我的index.html文件:
<!-- index.html --> <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>Hello React</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.3/react.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.3/JSXTransformer.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/marked/0.3.2/marked.min.js"></script> </head> <body> <div id="content"></div> <script src="lib/main.js"></script> </body> </html>
这是我的src / main.jsx文件:
var CommentBox = React.createClass({ getInitialState: function() { return {data: []}; }, loadCommentsFromServer: function() { $.ajax({ url: this.props.url, dataType: 'json', cache: false, success: function(data) { this.setState({data: data}); }.bind(this), error: function(xhr, status, err) { console.error(this.props.url, status, err.toString()); }.bind(this) }); }, handleCommentSubmit: function(comment) { var comments = this.state.data; var newComments = comments.concat([comment]); this.setState({data: newComments}); $.ajax({ url: this.props.url, dataType: 'json', type: 'POST', data: comment, success: function(data) { this.setState({data: data}); }.bind(this), error: function(xhr, status, err) { console.error(this.props.url, status, err.toString()); }.bind(this) }); }, componentDidMount: function() { this.loadCommentsFromServer(); setInterval(this.loadCommentsFromServer, this.props.pollInterval); }, render: function() { return ( <div className="commentBox"> <h1>Comments Yo</h1> <CommentForm onCommentSubmit={this.handleCommentSubmit} /> <CommentList data={this.state.data} /> </div> ); } }); var CommentForm = React.createClass({ handleSubmit: function(e) { e.preventDefault(); var author = React.findDOMNode(this.refs.author).value.trim(); var text = React.findDOMNode(this.refs.text).value.trim(); if (!text || !author) { return; } // send request to the server this.props.onCommentSubmit({author: author, text: text}); React.findDOMNode(this.refs.author).value = ''; React.findDOMNode(this.refs.text).value = ''; return; }, render: function() { return ( <form className="commentForm" onSubmit={this.handleSubmit}> <input type="text" placeholder="Your name" ref="author" /> <input type="text" placeholder="Say something..." ref="text" /> <input type="submit" value="Post" /> </form> ); } }); var CommentList = React.createClass({ render: function() { var commentNodes = this.props.data.map(function (comment) { return ( <Comment author={comment.author}> {comment.text} </Comment> ); }); commentNodes.reverse(); return ( <div className="commentList"> {commentNodes} </div> ); } }); var Comment = React.createClass({ render: function() { var rawMarkup = marked(this.props.children.toString(), {sanitize: true}); return ( <div className="comment"> <h2 className="commentAuthor"> {this.props.author} </h2> <span dangerouslySetInnerHTML={{__html: rawMarkup}} /> <hr /> </div> ); } }); React.render( <CommentBox url="comments.json" pollInterval={2000} />, document.getElementById('content') );
另外,我正在运行以下命令将jsx转换为js:
babel --watch src/ --out-dir lib/
我想将每个React类移到其自己的文件中。例如,我想创建以下四个文件(注意:每个文件都映射到main.jsx文件中的顶级“ var”声明),并将所有这些类拉入main.jsx文件中:
comment.jsx commentList.jsx commentForm.jsx commentBox.jsx
我该怎么做呢?
在这里将我的头撞到require和es6一段时间之后,我仍然对如何将所有这些分开分开还没有一个很好的直觉,或者如果require / es6之类的方法甚至是解决此问题的正确方法。
谢谢您的帮助!
如果要为每个React类创建一个文件,我建议看一下webpack。您可以将React类开发为CommonJs模块,它将负责将它们捆绑在一起。
另外,我认为这是一个不错的选择,因为您想使用 babel 来转换 jsx 文件。这是通过webpack加载程序解决的。
基本的webpack配置文件将包含以下内容:
webpack.config.js
var webpack = require('webpack'); module.exports = { entry: './src/main.jsx', output: { // Output the bundled file. path: './lib', // Use the name specified in the entry key as name for the bundle file. filename: 'main.js' }, module: { loaders: [ { // Test for js or jsx files. test: /\.jsx?$/, exclude: /node_modules/, loader: 'babel' } ] }, externals: { // Don't bundle the 'react' npm package with the component. 'react': 'React' }, resolve: { // Include empty string '' to resolve files by their explicit extension // (e.g. require('./somefile.ext')). // Include '.js', '.jsx' to resolve files by these implicit extensions // (e.g. require('underscore')). extensions: ['', '.js', '.jsx'] } };
如果您想拥有实际的代码,我创建了一个GitHub react-tutorial- webpack存储库。