欢迎大家指导与讨论 : )

  【持续更新】本文主要记录笔者在学习中遇到的问题,并作出相应总结。有错误的地方希望各位能够指出。

  一、在es6中getInitialState( 摘要:  constructor(props)和this.state )

  1. /*es6*/
  2. class TodoList extends Component{
  3. constructor(props){
  4. super(props);
  5. this.state = {
  6. items: ['hello', 'world', 'click', 'me']
  7. }
  8. }
  9. render(){
  10. //..
  11. }
  12. }
  13. /*es5*/
  14. var TodoList = React.createClass({
  15. getInitialState: function() {
  16. return {items: ['hello', 'world', 'click', 'me']};
  17. },
  18. render(){
  19. //...
  20. }
  21. })

  二、在es6中setState( 摘要: fun.bind(this)和this.setState )

  1. /*es6*/
  2. class TodoList extends Component{
  3. render(){
  4. return (
  5. <div>
  6. <button onClick={ this.handleAdd.bind(this) } >Add item</button>
  7. </div>
  8. )
  9. }
  10. handleAdd(){
  11. var newItem = prompt('enter a new')
  12. var newItems = [ ...this.state.items, newItem ];
  13. this.setState({items: newItems})
  14. }
  15. }

  三、PureRenderMixn在深比较会失效(摘要: Immutable提升性能)

  1. / assume this.props.value is { foo: 'bar' }
  2. // assume nextProps.value is { foo: 'bar' },
  3. // but this reference is different to this.props.value
  4. this.props.value !== nextProps.value; //true
    //错误:浅比较/引用对象的比较/this.props和nextProp实际上是两个不同的对象引用
  5. /*正确做法1-------对象比较应该进行深比较*/
  6. shouldComponentUpdate: function(nextProps, nextState) {
  7. return this.props.value.foo !== nextProps.value.foo;
  8. }
    /*正确做法2-------使用Immutable提升对象深比较的性能*/

export default class TabHeader extends Component {
    shouldComponentUpdate(nextProps){
      return !Immutable.is(Immutable.fromJS(nextProps), Immutable.fromJS(this.props));

    }

    //..........
}

  四、Map结构的state由reducer传到组件时需要先提取this.props中的某个属性(摘要: this.props为多对象集合体)

  1. export default class TabHeader extends Component {
  2. shouldComponentUpdate(nextProps){
  3. return !Immutable.is(Immutable.fromJS(nextProps), Immutable.fromJS(this.props));
  4. }
  5. render (){
  6. const active = this.props.tabIndex
  7. return (
  8. //....
  9. )
  10. }
  11.  
  12. //....
  13. }

  五、reducer state中覆盖原object类型的state简洁写法(摘要: Object.assign())

  1. Object.assign(...state, {
  2. third: {
  3. value: '',
  4. show: true
  5. }
  6. })
  7. //原state结构为
  8. const initState = {
  9. first: {
  10. value: '',
  11. show: true
  12. },
  13. second: {
  14. value: '',
  15. show: false
  16. },
  17. third: {
  18. value: '',
  19. show: false
  20. }
  21. }

   六、获取动态render组件的真实DOM节点及其value值(摘要: fun.bind(this) / ReactDOM.findDom())

  1. export default class CascadeBar extends Component{
  2. render(){
  3. return (
  4.  
  5. <div>
  6. {this.renderFirst()}
  7. </div>
  8. )
  9. }
  10. renderFirst(){
  11. //if...render...
  12. return(
  13. <select onChange={this.countryChange.bind(this)} ref="countryInput">
  14. //.....
  15. </select>
  16. )
  17. }
  18. countryChange(){
  19. ReactDOM.findDOMNode(this.refs.countryInput).value
  20. }
  21. }

  七、父组件向子组件传递方法(摘要: React.cloneElement)

  1. <div className="Detail">
  2. {this.props.children && React.cloneElement(this.props.children, {
  3. helloWorld: this.helloWorld
  4. })}
  5. </div>

  八、不同浏览器对对象更新/对象深比较的兼容性问题(underscore的extend、omit)

  1. // 无效手机UC不支持
  2. return Object.assign(state, {left: {show: action.value}}
  3. // 有效->克隆了一个新对象
    var e = _.omit(state)
  4. return _.extend(state , {left: {show: action.value}})

  十一、在.js文件中使用async( 摘要: 配置webpack )

  1. loaders: [
  2. {
  3. test: /\.js|jsx$/,
  4. loader: 'babel',
  5. query: {
  6. presets: ['es2015', 'stage-3'],
  7. plugins: ['transform-runtime']
  8. },
  9. exclude: /node_modules/
  10. }
  11. ]

  十、ant design的webpack配置

  1. //package.json
  2. {
  3. "name": "processBar",
  4. "version": "1.0.0",
  5. "description": "",
  6. "main": "index.js",
  7. "scripts": {
  8. "test": "echo \"Error: no test specified\" && exit 1"
  9. },
  10. "author": "",
  11. "license": "ISC",
  12. "dependencies": {
  13. "antd": "^0.12.14",
  14. "atool-build": "^0.6.6",
  15. "babel-loader": "^6.2.4",
  16. "babel-plugin-antd": "^0.3.2",
  17. "babel-preset-es2015": "^6.6.0",
  18. "babel-preset-react": "^6.5.0",
  19. "css-loader": "^0.23.1",
  20. "es3ify-loader": "^0.2.0",
  21. "react": "^0.14.7",
  22. "react-dom": "^0.14.7",
  23. "style-loader": "^0.13.1",
  24. "webpack": "^1.12.14"
  25. }
  26. }
  27.  
  28. //webpack.config.js
  29. var path = require('path')
  30. var webpack = require('webpack')
  31.  
  32. module.exports = {
  33. entry: [
  34. path.resolve(__dirname, 'index.js')
  35. ],
  36. output: {
  37. path: 'dist/',
  38. filename: '[name].js'
  39. },
  40. resolve: {
  41. extensions: ['', '.js', '.jsx']
  42. },
  43. module: {
  44. loaders: [
  45. {
  46. test: /\.js|jsx/,
  47. loader: 'es3ify-loader'
  48. },
  49. {
  50. test: /\.js|jsx$/,
  51. loader: 'babel',
  52. query: {
  53. presets: ['es2015', 'react'],
  54. cacheDirectory: true,
  55. plugins: [
  56. 'babel-plugin-antd'
  57. ]
  58. }
  59. },
  60. {
  61. test: /\.css$/,
  62. loader: 'style-loader!css-loader'
  63. }
  64. ]
  65. }
  66. }

React问题总结与归纳的更多相关文章

  1. [RN] React Native 常见基本问题归纳总结

    [RN] React Native  常见基本问题归纳总结 本问题总结涉及到版本为: "react": "16.8.3","react-native& ...

  2. React Native汇错归纳(持续更新中……)

    1.2017-10-25: 报错信息:“Cannot find entry file index.android.js in any of roots…..” 解决方法: 1.首先从虚拟机中找问题:看 ...

  3. React核心内容归纳总结

    状态.属性.组件API.组件的生命周期 当react的状态改变时,自动执行this.render()方法更新组件ES6写React的时候,事件里不会自动绑定this,需要自己绑定,或者直接在const ...

  4. react 开发过程中的总结/归纳

    1.点击元素,获取绑定该事件的父级元素,使用 e.currentTarget.e.target 获取的是,出发该事件的元素,该元素有可能是所绑定事件的元素的子元素. 2.使用 react router ...

  5. Webpack+React+ES6开发模式入门指南

    React无疑是今年最火的前端框架,github上的star直逼30,000,基于React的React Native的star也直逼20,000.有了React,组件化似乎不再步履蹒跚,有了Reac ...

  6. [React] 多组件生命周期转换关系

    前段时间一直在基于React做开发,最近得空做一些总结,防止以后踩坑. 言归正传,React生命周期是React组件运行的基础,本文主要是归纳多组件平行.嵌套时,生命周期转换关系. 生命周期 Reac ...

  7. 【腾讯Bugly干货分享】React移动web极致优化

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/579083d1c9da73584b02587d 最近一个季度,我们都在为手Q家校 ...

  8. Webpack+React+ES6入门指南[转]

    React无疑是今年最火的前端框架,github上的star直逼30,000,基于React的React Native的star也直逼20,000.有了React,组件化似乎不再步履蹒跚,有了Reac ...

  9. 正式学习React( 三)

    最基本的jsx语法什么的,我就不介绍了,唯一觉得有用点的,就是声明周期了. 下面的内容是转来的,自己也可以网上去搜,我觉得别人归纳的挺不错的,不过写法可能不是es6的,不影响学习. 在组件的整个生命周 ...

随机推荐

  1. iOS开发-完整学习路线图

  2. 安全攻防之SQL注入(通过sqlmap搞定所有问题)

    第一步: sqlmap基于Python,所以首先下载: http://yunpan.cn/QiCBLZtGGTa7U  访问密码 c26e 第二步: 安装Python,将sqlmap解压到Python ...

  3. Winform读写App.config文件以及重启程序

    //重启主程序 //System.Diagnostics.Process.Start(System.Reflection.Assembly.GetExecutingAssembly().Locatio ...

  4. 集合1--毕向东java基础教程视频学习笔记

    Day14 集合框架01 体系概述02 共性方法03 迭代器04 List集合共性方法05 ListIterator06 List集合具体对象特点07 Vector中的枚举 01 体系概述 集合类为什 ...

  5. Zookeeper 服务注册和发现

    Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理 ...

  6. Oracle索引梳理系列(一)- Oracle访问数据的方法

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  7. 讲讲js中的逻辑与(&&)以及逻辑或(||)

    前几天看到一个函数,百思不得其解,今天早上醒来看了本js的书,正好讲到操作符的用法,给大家分享下js中的&&,||,和我们用的其他的编程语言还是有点区别的. 直接上那个函数的代码: f ...

  8. 创建docker镜像,初始化jdk8与tomcat环境

    一.创建Dockerfile文件: 创建Dockerfile文件,下载jdk与tomcat放在Dockerfile同目录下. Dockerfile文件内容: FROM Ubuntu:14.10 MAI ...

  9. 烂泥:rsync与inotify集成实现数据实时同步更新

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 上篇文章我们介绍了如何使用rsync同步文件,这篇文章我们再来介绍下,如何把rsync与inotify集成实现数据的实时同步. 要达到这个目的,我们需要 ...

  10. input子系统

    input子系统:      像按键.键盘.鼠标.触摸屏.游戏摇杆等设备只有输入没有输出,而且在编程实现其对应的驱动程序时会有很多重复性的代码,内核的设计者将该部分代码抽象出来,驱动工程师只需要复用该 ...