美文网首页
误用 useMemo 返回按钮元素引起的 onClick 返回值

误用 useMemo 返回按钮元素引起的 onClick 返回值

作者: VioletJack | 来源:发表于2020-10-16 14:31 被阅读0次

起因

在项目中一些渲染的元素不会频繁变动,所以使用了 useMemo。但在使用 useMemo 的时候忘了监听数据变化,就会导致 useMemo 中的渲染元素与外部的数据不一致。

示例

import { Button, Input } from 'antd'
import React, { useCallback, useEffect, useMemo, useState } from 'react'
import styles from './index.less'

export default () => {
  const [num, setNum] = useState('333')

  const renderText = useMemo(() => {
    return <Button onClick={() => console.log(num)}>log</Button> // output 333
  }, [])

  const delayLog = useCallback(() => {
    console.log(num) // output 333
  }, [])

  return (
    <div className={styles.container}>
      <Input value={num} onChange={e => setNum(e.target.value)} />
      {renderText}
      <Button onClick={delayLog}>delayLog</Button>
    </div>
  )
}

无论 Input 里面改成什么值,Button 的点击事件都只会返回 333。

解决方案

一种解决方案是在 useMemo 的监听数组里面添加 num

  const renderText = useMemo(() => {
    return <Button onClick={() => console.log(num)}>log</Button>
  }, [num])

最后

另外,我发现在使用 ts-bus 的时候也有类似的问题。所以,在使用 useCallback 和 useMemo 的这种 API 的时候要格外注意。

相关文章

  • 误用 useMemo 返回按钮元素引起的 onClick 返回值

    起因 在项目中一些渲染的元素不会频繁变动,所以使用了 useMemo。但在使用 useMemo 的时候忘了监听数据...

  • android ontouch onclick

    android ontouch onclick 冲突解决:设置touch返回值为flase mMouseview....

  • onClick、onLongClick事件同时触发

    ref : onClick、onLongClick事件同时触发 将onLongClick的返回值设置为true,即...

  • 2020-03-17

    input按钮中的onclick事件 input按钮onclick事件大全

  • JS中数组的一些方法

    数组的常用方法 [数组所有删除元素的方法,返回值都是被删除的元素][数组所有添加元素的方法,返回值都是新数组的长度...

  • 数组方法总结

    push(): 向数组的末尾添加一个或更多元素 返回值为添加的元素 pop(): 删除数组的最后一个元素 返回值为...

  • js-获取元素

    获取元素的方法 传参 返回值

  • 和数组操作相关的方法

    push:将元素添加到数组的末尾,返回值是数组长度pop:将数组最后一个元素删除,返回值是被弹出的元素 unshi...

  • 数组操作相关的方法

    push:将元素添加到数组的末尾, 返回值是数组长度pop:将数组最后一个元素弹出, 返回值是被弹出的元素unsh...

  • 用php中的数组学习redis中的list

    右边添加 左边添加 右边弹出最后一个元素,并返回值 左边弹出第一个元素,并返回值 统计元素个数 给指定位置赋值 最...

网友评论

      本文标题:误用 useMemo 返回按钮元素引起的 onClick 返回值

      本文链接:https://www.haomeiwen.com/subject/zchzpktx.html