箭头函数解决 this指向

推荐使用箭头函数来解决 this指向问题,代码更简洁
少用 bind,因为bind每次初始化都要 bind一次

  1. // tsx class 类组件
  2. import React from 'react'
  3. interface Props {
  4. }
  5. // state 组件内的数据,自己的状态
  6. interface State {
  7. visible: boolean
  8. }
  9. /**
  10. * 在 UI render前获取一些数据
  11. * static getSnapshotBeforeUpdate()
  12. * 定义类型 1 type,2 interface
  13. */
  14. class CardModel extends React.component<Props, State> {
  15. constructor(props: Props) {
  16. super(props)
  17. this.state = {
  18. visible: false
  19. }
  20. }
  21. // 箭头函数 this默认指向父级
  22. onClick = (e: React.MouseEvent<HTMLElement, MouseEvent>) => {
  23. this.setState(state => ({visible: !state.visible}))
  24. }
  25. render() {
  26. const { visible } = this.state
  27. const style = {display: visible ? 'block' : 'none' }
  28. return (
  29. <div style={style}>
  30. <button onClick={this.onClick}>确定</button>
  31. </div>
  32. )
  33. }
  34. }
  35. export default CardModel

bind处理 this指向

  1. // tsx class 类组件
  2. import React from 'react'
  3. interface Props {
  4. }
  5. // state 组件内的数据,自己的状态
  6. interface State {
  7. visible: boolean
  8. }
  9. /**
  10. * 在 UI render前获取一些数据
  11. * static getSnapshotBeforeUpdate()
  12. * 定义类型 1 type,2 interface
  13. */
  14. class CardModel extends React.component<Props, State> {
  15. constructor(props: Props) {
  16. super(props)
  17. this.state = {
  18. visible: false
  19. }
  20. this.onClick = this.onClick.bind(this)
  21. }
  22. onClick(e: React.MouseEvent<HTMLElement, MouseEvent>) {
  23. this.setState(state => ({visible: !state.visible}))
  24. }
  25. render() {
  26. const { visible } = this.state
  27. const style = {display: visible ? 'block' : 'none' }
  28. return (
  29. <div style={style}>
  30. <button onClick={this.onClick}>确定</button>
  31. </div>
  32. )
  33. }
  34. }
  35. export default CardModel

事件优化

以下2个方法:用户函数式组件的优化,不能用户 class类组件

  1. useCallback()
  2. useMemo()
  1. // jsx
  2. const onClick = useCallback(() => {
  3. setValue(200)
  4. })
  5. // tsx
  6. onClick:(e: React.MouseEvent<HTMLElement, MouseEvent>) {
  7. this.setState(state => ({visible: !state.visible}))
  8. }

ev.target和 ev.currentTarget

  1. ev.target描述的是 事件发生的元素
    1. 点击那个元素触发的事件
    2. 比如:一个元素有多个子元素,每次点击 ev.target可能会不一样;但是 ev.currentTarget都是一样的
  2. ev.currentTarget是事件处理绑定的元素
  3. ev.nativeEvent来访问 HTML原生的事件
  4. e.target as HTMLElement target的类型转换,获取 DOM节点类型
    1. onClick(e: React.MouseEvent<HTMLElement, MouseEvent>) {
    2. // 获取 target元素的方法
    3. const node = (e.target as HTMLElement).nodeName === 'SPAN'
    4. if(!node) return
    5. this.setState(state => ({visible: !state.visible}))
    6. }

自愿付费

对知识的一份尊重,为价值买单,自愿付费
有价值的经验分享,让小伙伴看完有所收获,放个公平的二维码
本文标价60元,如果你能够将本文分享的干活认真去执行,你最少可以获得10倍以上的 react经验
欢迎你和我一起玩,你觉得这篇文章价值多少,就自愿付费到支付宝
pay.jpg