补充知识

纯函数

纯函数:相同的输入,必定有相同输出的函数。

  1. // 纯函数
  2. const print = (a) => console.log(a)
  3. const add = (a, b) => a + b
  4. // 非纯函数
  5. const Random = (a) => Math.random() + `${a}`
  6. const fetchSource = (url) => fetch(url) // 请求返回的数据是不确定的

高阶函数

高阶函数:

  • 入参:一个函数,
  • 出参:新的函数
  • 纯函数 ```javascript // 高阶函数,为函数添加一些新功能 const wrapWithName = (fn) => { return function(…args) { const name = ‘konsoue’ fn.call(this, name, …args) } }

// 使用方式 const getName = wrapWithName((name) => console.log(name))

getName() // konsoue

  1. <a name="R3qFI"></a>
  2. # 高阶组件
  3. HOC(High Order Component):高阶组件。
  4. - HOC 就是一个函数
  5. - 纯函数,不应该有副作用
  6. - 入参:原来的 React 组件
  7. - 出参:新的 React 组件
  8. <a name="cDhST"></a>
  9. ## 应用场景
  10. <a name="E40re"></a>
  11. ### 属性代理
  12. 1. 操作 props
  13. > 实际使用,react-redux 的 connect
  14. ```javascript
  15. import React, { Component } from 'react'
  16. const propsHOC = (InnerComponent) => {
  17. return class WrapperComponent extends Component {
  18. state = {
  19. name: 'konsoue'
  20. }
  21. render() {
  22. return (<InnerComponent {...this.props} {...this.state} />)
  23. }
  24. }
  25. }
  26. export default propsHOC
  1. 操作组件实例 ```jsx // 使用 HOC 获取组件实例,实现调用兄弟组件的属性方法 import React, { Component } from ‘react’

const refHOC = (LeftComponent, RightComponent) => { return class WrapperComponent extends Component {

  1. render() {
  2. return (
  3. <div>
  4. <LeftComponent
  5. ref={(instance) => this.leftComponentRef = instance}
  6. />
  7. <RightComponent
  8. leftComponentRef={this.leftComponentRef}
  9. />
  10. </div>)
  11. }

} }

export default refHOC

  1. <a name="CLUzE"></a>
  2. ### 继承/劫持
  3. 可用于劫持组件的方法,生命周期等等
  4. ```jsx
  5. // 通过继承组件,劫持组件的 setState 方法
  6. import React from 'react'
  7. const hackComponent = (InnerComponent) => {
  8. return class extends InnerComponent {
  9. render() {
  10. const parent = super.render()
  11. const rawSetState = super.setState
  12. super.setState = function (...args) {
  13. console.log('劫持了 setState')
  14. rawSetState.call(this, ...args)
  15. }
  16. return React.cloneElement(parent)
  17. }
  18. }
  19. }
  20. export default hackComponent