React实践中的一些笔记

最近依旧在搞React这块的开发。下面是自己开发实践过程中一些笔记:

  • 新版React不再推荐对象的方式去改变
this.setState({
  a: 1
})
复制代码

推荐异步函数的形式代替对象传入setState中

this.setState((prevState) => {
  return {
    a: prevState.a + 1
  }
})
复制代码

其中preState 等价于this.state

  • 想在最外层包一层,但又不想被显示。可以试试React16引入的Fragment。一个JSX空标签

  • ref={(input) => { this.input = input }}这种使用ref获取dom,一定要记得setState是异步的

  • 说到React ref,React16.3加入了新的React.createRef API。目前获取ref dom元素有三种方法 1)String Ref 2)Callback Ref 3)React.createRef React官方表示String Ref将会在未来版本被移出,建议用户使用Callback Ref、React.createRef来代替 String Ref一些问题:

    1. React元素在创建和更新的过程中,定义成String类型的ref会被封装为一个闭包函数,等待commit阶段被执行,这样会对React性能产生一些影响。
    2. String Ref无法被组合,当父组件已经给子组件传递了ref,那么我们就无法再在子组件上添加ref了, Callback Ref方式便可避免。
    3. 在根组件上使用无法生效。

    另外,React16还另外提供了一个关于ref的API React.forwardRef,主要用于穿过父元素直接获取子元素的ref。

  • 生命周期中componentWillReceiveProps。没有props参数是不会执行的,只有父组件接受了props才会执行,只要父组件render函数重新执行了,子组件componentWillReceiveProps就会执行。

  • 可以通过React16生命周期中componentDidCatch,创建一个error-boundary,用来捕获其内嵌套的组件生命周期发生的错误。(* 无法捕获异步以及事件回调引发的错误)

  • 便捷的深拷贝 JSON.parse(JSON.stringify(obj))

  • 判断两个对象是否相等,如果项目中没有使用immutable.js,可以引入lodash.isequal

    import isEqual from 'lodash.isequal'
    isEqual(obj1, obj2)
    复制代码
  • Redux reducer可以接受state,但绝对不能修改state;store必须是唯一的;只有store才能改变自己的内容;reducer必须纯函数不能有副作用;state在其他地方只读只有在store中才能修改。每一块功能拆分一个小store,通过combineReducers合并。每一个功能(组件)的store可以使用这样的模板:

其中index.js可以这么写

import reducer from './reducer'
import * as actionCreators from './actionCreators'
import * as constants from './constants'

export { reducer, actionCreators, constants }
复制代码
  • use redux chrome tool
import { createStore, compose, applyMiddleware} from 'redux'
import thunk from 'redux-thunk'
import reducer from './reducer'

const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose

const store = createStore(reducer, composeEnhancers(
  applyMiddleware(thunk)
))

export default store
复制代码
  • this.props.children可以读取组件下的子节点。this.props.children可以用React.Children.map遍历子节点,好处是不用担心数据类型是undefined还是Obj

  • 在项目中最好分离开业务组件和UI组件。UI组件能写成Stateless方式还是要写成这种方式以提高性能。

  • Styled-components

    Styled-components,可以说是css in js上的又一种尝试。让样式也组件化同时逻辑组件和展示组件分离。使用styled-components不需要再使用className属性来控制样式,而是将样式写成更具语义化的组件的形式。Styled-components的写法可以让样式暴露props让外层JS去控制。这样我们就不需要ClassName、style这样的中间人

    此外Styled-components支持全部Css特性,归根结底本质还是css,什么动画、伪类都不在话下。还有一个优点就是,我们不再需要考虑className命名问题。使用Styled-components会给生成的React组件添加一个值为随机字符串的className。使用同一个Styled-components生成的多个React组件的className是不同的,这种随机className的机制使得组件之间的className值不会冲突,从而解决 了CSS全局作用域的问题,也省去了命名的麻烦。

    这种控制样式的编程方式不光能解决CSS全局作用域的问题,而且移除了样式和组件间的映射关系真的好用。

  • Immutable.js,它弥补了Javascript没有不可变数据结构的问题。由于是不可变的,可以放心的对对象进行任意操作。在全局使用之后,我们就不用担心引用类型的变量所引发的一系列副作用咯。 需要注意的点:

    1. 既然全局使用了immutable.js,再生成新数据,获取新数据传递到action之前一定要注意将其转化成immutable(大部分情况使用fromJS就好:fromJS会包裹一个JS对象使其变成immutable对象。(内部的对象也会变))总结一句话就是:同一类型,才不会出错;
    2. pureComponent和immutable.js完美契合可以放心大胆的用。
  • 实现react页面之间的异步加载操作可以尝试使用react-loadable这个组件

以上~~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值