xccjk / x-blog

学习笔记
17 stars 2 forks source link

react hooks逻辑抽取及场景? #15

Closed xccjk closed 1 year ago

xccjk commented 3 years ago

hooks的逻辑复用

场景

Component实现

  import React, { Component } from 'react'
  import { Modal, Button } from 'antd'

  class ClassPage extends Component {
    constructor(props) {
      super(props)
      this.state = {
        visible1: false,
        visible2: false
      }
    }

    render() {
      return (
        <div>
          <Button type='primary' onClick={() => this.setState({visible1: true})}>按钮1</Button>
          <Button type='primary' onClick={() => this.setState({visible2: true})}>按钮2</Button>
          <Modal
            visible={this.state.visible1}
            onCancel={() => this.setState({visible1: false})}
          >
            modal1
          </Modal>
          <Modal
            visible={this.state.visible2}
            onCancel={() => this.setState({visible2: false})}
          >
            modal2
          </Modal>
        </div>
      )
    }
  }

  export default ClassPage

hooks实现

  import React, { useCallback, useState } from 'react'
  import { Modal, Button } from 'antd'

  function useTrigger(initialValue = false) {
    const [visible, setVisible] = useState(initialValue)

    const open = useCallback(() => {
      setVisible(true)
    }, [setVisible])

    const close = useCallback(() => {
      setVisible(false)
    }, [setVisible])

    return {
      visible,
      open,
      close
    }
  }

  function HooksPage () {
    const trigger = useTrigger()
    const trigger1 = useTrigger()
    return (
      <div>
        <Button type='primary' onClick={trigger.open}>按钮1</Button>
        <Button type='primary' onClick={trigger1.open}>按钮2</Button>
        <Modal
          visible={trigger.visible}
          onCancel={trigger.close}
        >
          modal1
        </Modal>
        <Modal
          visible={trigger1.visible}
          onCancel={trigger1.close}
        >
          modal2
        </Modal>
      </div>
    )
  }

  export default HooksPage

总结