为了账号安全,请及时绑定邮箱和手机立即绑定

从 prop 事件处理程序设置时,React 状态会重置

从 prop 事件处理程序设置时,React 状态会重置

慕码人2483693 2021-10-21 16:19:45
我一生都无法弄清楚发生了什么,但是出于某种原因,当单击“单击我”时,数字会按您的预期增加。当子组件触发单击时,它会重置状态并始终打印 0。function Child(props: {    onClick?: (id: string) => void,}) {    const ref = useCallback((ref) => {        ref.innerHTML = 'This Doesnt';        ref.addEventListener('click',() => {            props.onClick!('')        })    }, [])    return (<div ref={ref}></div>)}function Parent() {  const [number, setNumber] = useState(0);  return <div>            <div onClick={() => {                setNumber(number + 1);                console.log(number);            }}>                This Works            </div>            <Child                onClick={(id) => {                    setNumber(number + 1);                    console.log(number);;                }}            />        </div>}这是问题的演示:https : //jscomplete.com/playground/s333177
查看完整描述

2 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

function Child(props: {

    onClick?: (id: string) => void,

}) {

    function handleClick() {

      props.onClick('')

    }

    const ref = useRef();

    useEffect(() => {

      ref.current.innerHTML = 'This Doesnt';

      ref.current.addEventListener('click', handleClick)

      return () => { ref.current.removeEventListener('click', handleClick); }

    }, [props.onClick])


    return (<div ref={ref}></div>)

}

@ckder几乎可以工作,但 console.log 显示了从 0 到当前数值的所有数字。问题是在子组件卸载后尚未删除的事件侦听器,因此为了实现这一点,我使用了 useEffect 并在卸载侦听器的地方返回函数。


查看完整回答
反对 回复 2021-10-21
  • 2 回答
  • 0 关注
  • 115 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信