之前对于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'));
  1. 这里一定要注意的是渲染组件用的是react-dom,而不是react,所以要把它也require进来

  2. 一定要用原生的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};
  1. 由于在es6中使用类的构造函数constructor来代替了getInitialState,所以以前在getInitialState里声明的初始量要变化到在constructor

  2. 另外就是在组件上绑定的函数的this指向问题坑了我好久

import React from 'react';class CommentForm extends React.Component{constructor(props){super(props);this.state = {author:'',text:''};}handleAuthorChange(e){this.setState({author:e.target.value})}handleTextChange(e){this.setState({text:e.target.value})}handleSubmit(e){e.preventDefault();let author = this.state.author.trim(),text = this.state.text.trim();if(!text || !author){alert('请填写完整');return false;}this.props.onCommentSubmit({author:author,text:text});this.setState({author:'',text:''})}render(){return(<form className='commentForm' onSubmit={this.handleSubmit.bind(this)}><input type='text' placeholder='name' value={this.state.author}onChange={e => this.handleAuthorChange(e)} /><input type='text' placeholder='say something...' value={this.state.text}onChange={this.handleTextChange.bind(this)} /><input type='submit' value='Post' /></form>);}}export {CommentForm};

在这个组件中,我给两个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初实践及总结相关推荐

  1. React+Webpack+ES6 兼容低版本浏览器(IE9)解决方案

    React+Webpack+ES6 兼容低版本浏览器(IE9)解决方案 参考文章: (1)React+Webpack+ES6 兼容低版本浏览器(IE9)解决方案 (2)https://www.cnbl ...

  2. 使用scss + react + webpack + es6实现幻灯片

    写在前面: 刚学习完慕课网里的一个幻灯片案例,自己加了刚学的react,两者结合.首先让大家看看效果 点击此处 你可以先用纯js实现上面的效果:我的github上的 JS代码 或者 观看慕课提供的课程 ...

  3. HTML5最低支持ES几,React+Webpack+ES6 兼容低版本浏览器(IE9)解决方案

    虽然过了各,发广大切近种都经告效换近种都经告效换兼容IE6的噩梦时代,IE依旧阴魂不散,因为你可能还要兼容IE9.在ES6已经普及的今天,用ES6写react已经成了标配.但是babel编译的js语法 ...

  4. 基于 Webpack 3 的 React 工程项目脚手架

    基于 Webpack 3 的 React 工程项目脚手架从属于笔者的 Web 前端入门与工程实践,算来已经是笔者 React 技术栈脚手架的第四个迭代版本.更多关于 React 或者前端开发相关的资料 ...

  5. react 最佳实践_最佳React教程

    react 最佳实践 React is a JavaScript library for building user interfaces. It was voted the most loved i ...

  6. webpack VS Node.js - 二者对 require 功能的实现区别

    原文 Webpack 被广泛用于大部分前端项目. Webpack 有很多内容,本文我不会全部介绍,但我确实想谈谈某些方面. 调试项目时最重要的信息之一,是了解导致您看到的错误的技术.它可以帮助您更有效 ...

  7. 如何使用Webpack 4简化React.js开发过程

    by Margarita Obraztsova 玛格丽塔(Margarita Obraztsova) 如何使用Webpack 4简化React.js开发过程 (How to streamline yo ...

  8. webpack3+node+react+babel实现热加载(hmr)

    前端工程化开发的一个重要标志就是热替换技术,它大大的提高开发效率,使我们专注于写代码,webpack3中的热替换相比较1更加简洁. 1. 先看效果 Demo地址 https://github.com/ ...

  9. React Native实践之携程Moles框架

    声明:本文CSDN作者原创投稿文章,未经许可禁止任何形式的转载. 编者:本文来自携程框架研发部高级经理魏晓军在第二期[携程技术微分享]上的分享,以下为整理后的文字实录.关注携程技术中心微信公号ctri ...

最新文章

  1. 命令行查看电脑WIFI密码
  2. 十六、希尔排序即其优化(交换法--->移动法)
  3. Java异步执行多个HTTP请求的例子(需要apache http类库)
  4. JavaSE_NIO_ByteBuffer
  5. C++工作笔记-仿大佬使用枚举类型
  6. linux的定cron计划任务命令
  7. 深入理解 WordPress 数据库中的用户数据 wp_user
  8. f5 系统损坏,重新安全系统
  9. c语言 愚人节题目,【题解】牛客2020年愚人节比赛
  10. 用Tkinter打造GUI开发工具(35)Tkinter中的视频播放组件
  11. ArchLinux-KDE桌面美化
  12. 设置图片的透明度从左到右渐变
  13. Android 常见界面控件(简单控件篇)
  14. 从雀书无代码应用——浅谈零代码开发平台(上)
  15. 关于 VB6 透明 PNG 图像生成的一个解决方案
  16. 企业邮箱管理员在哪里找?域名邮箱如何管理?
  17. thinkpadE450 进入bios并设置bios为uefi模式U盘启动(也可以是legacy)
  18. Java导出excel表格,数字数据带E
  19. 数据分析之Hadoop详解
  20. 制作一幅扑克牌系列三---动起来

热门文章

  1. 基于visual c++之windows核心编程代码分析(30)Telnet协议编程
  2. ubuntu16.04搞出百度的方法
  3. 排序算法:快速排序算法实现及分析(递归形式和非递归形式)
  4. Struts2学习第三课 Struts2详解
  5. Java容易搞错的知识点
  6. 初识Notification
  7. BZOJ1023 [SHOI2008]cactus仙人掌图
  8. HDU-4675 GCD of Sequence 数学
  9. 实时的毛发绘制 szlongman
  10. JavaEE实战班第十一天