webpack+es6+node+react初实践及总结
之前對于react的認識只存在與聽說,說他有啥virtual DOM,很好的組件化,效率很高之類的,,不過一直沒有學習,昨天閑著無聊就開始學習react.發現jsx的寫法真是666啊,由于是剛開始學習,所以總的經驗不是很多。
我跟著其官網上的教程做了一個評論框的功能,后臺用的是node,并沒有鏈接數據庫,只是文件流的讀寫;
最終結果:
文件結構:
-
react_comment
node_modules
-
public
-
build
build.js
build.js.map
-
js
comment.js
comment_box.js
commemt_form.js
comment_list.js
entry.js
-
scss
comment.scss
-
-
server
server.js
comment.json
package.json
webpack.config.js
webpack.config.js:
var path = require('path'),webpack = require('webpack');var commonLoaders = [{test:/\.js$/,loader:'babel',exclude:'/node_modules/'}, //exclude:不包含這個文件夾下的目錄,不然babel也會編譯里面的js文件,導致速度變慢{test:/\.scss$/,loader:'style!css!autoprefixer!sass'}];var path = path.resolve(__dirname,'public/build');module.exports = {entry:['./public/js/entry.js' //指定入口文件],output:{ //指定輸出文件路徑及namepath:path,filename:'build.js'},module:{loaders:commonLoaders},resolve:{extensions:['','.js','.scss']},babel:{ //這里我是使用的是babel-loader、babel-preset-2015、babel-preset-react,并沒有使用jsx-loader,所以這里作如下配置:presets:['es2015','react']}};數據源:
[{"id": 1388534400000,"author": "Pete Hunt","text": "Hey there!"}]入口文件:
import React from 'react'; import ReactDOM from 'react-dom'; import {CommentBox} from './comment_box'; import reset from '../scss/comment'; ReactDOM.render(<CommentBox url='/api/comments' pollInterval={2000} />,document.getElementById('content'));這里一定要注意的是渲染組件用的是react-dom,而不是react,所以要把它也require進來
一定要用原生的document.getElementById()來獲取容器
最外層組件
import React from 'react';import $ from 'webpack-zepto';import {CommentList} from './comment_list';import {CommentForm} from './comment_form';class CommentBox extends React.Component{constructor(props){super(props)this.state = {data: []};this.handleCommentSubmit = this.handleCommentSubmit.bind(this);}loadCommentsFromServer(){let _this = this;$.ajax({url:_this.props.url,dataType:'json',cache:false,success(data){_this.setState({data:data});},error(xhr, status, err){console.error(_this.props.url, status, err.toString());}})}componentDidMount(){this.loadCommentsFromServer();// setInterval(this.loadCommentsFromServer.bind(this),this.props.pollInterval);}handleCommentSubmit(comment){let comments = this.state.data;comment.id = Date.now();let newComments = [...comments,...comment];this.setState({data:newComments});let _this = this;$.ajax({url: _this.props.url,dataType: 'json',type: 'POST',data: comment,success(data) {_this.setState({data: data});},error(xhr, status, err) {_this.setState({data: comments});console.error(_this.props.url, status, err.toString());}})}render(){return(<div className="commentBox"><h1>Comments:</h1><CommentList data={this.state.data} /><CommentForm onCommentSubmit={this.handleCommentSubmit} /></div>);}}export {CommentBox};由于在es6中使用類的構造函數constructor來代替了getInitialState,所以以前在getInitialState里聲明的初始量要變化到在constructor中
另外就是在組件上綁定的函數的this指向問題坑了我好久
在這個組件中,我給兩個input綁定了函數,一開始以為函數里的this指向的是組件本身,后來才發現是window,原因是onChange的回調是在瀏覽器全局對象執行的,此時的this并不指向定義的React組件部分,如果不用es6,它是默認綁定到組件上的,所以這里要修改this的指向:
1. onChange={e => this.handleAuthorChange(e)}2. onChange={this.handleAuthorChange.bind(this)}3. constructor(props){ //在構造器里面綁定,推薦super(props)this.state = {data: []};this.handleCommentSubmit = this.handleCommentSubmit.bind(this);}具體的代碼我已放到github上,有需要的可以參考:github
此外,有一篇關于react規范的文章有興趣的也可以看看:react規范
以上只是一個初學者的的看法,如果有不足或者錯誤的地方,歡迎指出
總結
以上是生活随笔為你收集整理的webpack+es6+node+react初实践及总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ2646 : neerc2011
- 下一篇: ART世界探险(10) - 异常处理