1. setState() 的两种用法

react 作为“数据驱动视图变化”的MVVM框架,setState 是我们更改组件内state的唯一方法。我们一般使用传给setState() 一个对象的方式,其实setState()还可以接受函数修改state,而且两者的一些使用区别很有可能是我们忽视的。

1. setState() 传入对象参数

  1. this.state = {
  2. name: 'wuyanbin',
  3. age: '24'
  4. }
  5. this.setState({
  6. name: 'wahaha'
  7. })

2. setState() 传入函数参数

  1. this.state = {
  2. name: 'wuyanbin',
  3. age: '24'
  4. }
  5. this.setState((preState, props)=>{
  6. console.log('在此可以打印出上一次的state和传入的props');
  7. return {name: 'wahaha'}
  8. })

setState 方法是子组件继承父component, 当我们调用该方法的时候,react会更改state, reader方法会根据最新的状态渲染页面。值得注意的是,setState方法并不是同步执行的,而是异步执行。当我们调用setState,react并不会马上执行,而是将修改的对象放到一个消息队列中,稍后才会执行修改,并执行render方法渲染。

由于 setState() 的异步性,所以他还可以接受一个回调函数。传入函数参数同理。

  1. this.setState({
  2. name: 'hahaha'
  3. },()=>{
  4. console.log('在此执行回调');
  5. })

SetState 是同步的还是异步的

https://juejin.im/post/6844903636749778958#heading-7
image.png

2. Props

组件化增加了组件之间通信的成本,react 提供的props 主要就是用于父组件向子组件传递一些配置信息,用于控制子组件的显示和动作。(context 不被推荐使用)

1.defaultProps

有时候我们可以在子组件提供一个默认值,避免父组件忘记传值导致的bug.

  1. state defaultProps = {
  2. name: '我是默认值'
  3. }

2. propTypes类型检查

js 的弱类型导致了他在构建大型应用程序面前略显逊色,业界出现的typeScript 和 flow 也是为了弥补这个缺陷。react.js 提供了一套组件参数类型规则,让开发者能够趁早发现因为类型不符合规则导致的问题。

1. 安装propTypes

  1. npm install --save propTypes

2. 两种写法

在组件类外:

  1. // 类型检查
  2. xxx(组件名称).propTypes = {
  3. name: propTypes.string.isRequired,
  4. age: propTypes.number
  5. }
  6. // 默认值
  7. xxx(组件名称).defaultProps = {
  8. name: 'wuyanbin',
  9. age: '12'
  10. }

在组件类中:(这个语法还没有最终通过,在浏览器中需要一步编译工作。)

  1. static defaultProps = {
  2. name: 'wuyanbin'
  3. }
  4. static propTypes = {
  5. name: propTypes.string.isRequired
  6. }

支持的检查类型:

  1. propTypes.string
  2. propTypes.number
  3. propTypes.object
  4. propTypes.array
  5. propTypes.symbol
  6. propTypes.func
  7. propTypes.bool
  8. ...
  9. 更多 https://react.docschina.org/docs/typechecking-with-proptypes.html#proptypes

3. 高阶组件(HOC: High-Order Component )

高阶组件就是一个函数,把一个组件作为参数传入,返回一个新的组件。

高阶组件的形式:

  1. export default (WrappedComponent,...其他参数)=>{
  2. class NewComponent extends Component{
  3. // 可以自定义一些处理逻辑
  4. render(){
  5. return (
  6. <WrappedComponent/>
  7. )
  8. }
  9. }
  10. return NewComponent;
  11. }

使用形式:

  1. const outputComponent = highOrderComponent(inputComponent,...其他参数)

高阶组件使用的场景:
当有多个组件需要相同的处理逻辑,我们可以把这部分逻辑提取到高阶组件中,可以保证代码的复用性和简洁性;后期如果有逻辑需要修改,统一修改高阶组件中的逻辑,极大的增加了代码的可维护性。

4. react代码编写规范

所谓的代码规范其实没有什么优劣之分,就像各个国家、各个地区的法律法规,各有差异,但最主要的是能够起到约束和规范的作用。团队形成一个代码规范,能够减少个人代码编写习惯导致团队其他成员理解的成本,降低项目维护难度。

1. 编写组件的规范

编写一个react组件的时候,我们可以按照以下的方式顺序进行。

  1. static 开头的类属性,如 defaultPropspropTypes

  2. 构造函数,constructor

  3. 组件生命周期。

  4. _ 开头的私有方法。

  5. 事件监听方法,handle*

  6. render*开头的方法,有时候 render() 方法里面的内容会分开到不同函数里面进行,这些函数都以 render* 开头。

  7. render() 方法。

  1. class ReactStandard extends Component {
  2. // static 开头的静态属性
  3. static defaultProps = {
  4. name: 'wuyanbin',
  5. age: 24
  6. };
  7. static propTypes = {
  8. name: propTypes.string.isRequired,
  9. age: propTypes.number.isRequired
  10. };
  11. // 构造函数
  12. constructor(props) {
  13. super(props);
  14. this.state = {
  15. name: 'wahaha',
  16. age: 24
  17. };
  18. this.handleInputChange = this.handleInputChange.bind(this)
  19. }
  20. // 组件的生命周期
  21. componentWillMount() {
  22. }
  23. componentDidMount() {
  24. this._fetchAsyncData()
  25. }
  26. // _开头的私有方法
  27. _fetchAsyncData = () => {
  28. console.log('加载数据');
  29. };
  30. // 事件监听 handle*
  31. handleInputChange(event) {
  32. console.log(event.target.value);
  33. this.setState({
  34. name: event.target.value
  35. })
  36. };
  37. // render*
  38. renderTitle = () => {
  39. return <div>this is Title</div>
  40. };
  41. renderFooter = () => {
  42. return <div>this is Footer</div>
  43. };
  44. // render() 方法
  45. render() {
  46. return (
  47. <div>
  48. {this.renderTitle()}
  49. <div>
  50. <input
  51. type="text"
  52. value={this.state.name}
  53. onChange={this.handleInputChange}
  54. />
  55. </div>
  56. {this.renderFooter()}
  57. </div>
  58. );
  59. }
  60. }

2. 目录结构及文件命名规范

待整理,先提出一版,与大家讨论下形成一个公认的版本

5. redux

  1. dispatch: 修改redux 中state 的中间人。

react中你可能忽视的基础知识 - 图2

  1. createStore(): 一个生产

react中你可能忽视的基础知识 - 图3

  1. reducer(state, action){ }: 初始化state 和 根据action 的type修改指定的state

6. react-redux

  1. connect(): 高阶组件,将公共的逻辑封装到组件中。从store中取出数据通过props传给WrappedComponent 形式如下:
  1. connect(mapStateToPropsmapDispatchToProps)(WrappedComponent)

mapStateToProps: 告诉高阶组件connect 当前的 组件需要从store取出什么数据
mapDispatchToProps: 告诉高阶组件connect 当前的 组件需要从store 执行什么dispatch 操作

  1. Provider: 容器组件