【发布时间】:2021-09-18 02:43:29
【问题描述】:
我有一个使用 create-react-app 创建的非常简单的 React App。该应用程序显示一个传入 value 和 onClick 回调的组件,并在触发回调时递增值。
import React, { useState } from 'react';
import Block from './Block';
const App = () => {
const [count, setCount] = useState(0)
return (
<div className="App">
<Block
value={count}
onClick={ () => setCount(count + 1) }
/>
</div>
);
}
export default App;
Block 组件采用value 和onClick 函数,并在中心显示一个带有值的正方形,并在单击该正方形时调用onClick。
const Block = ({ value, onClick }) => {
return (
<div
onClick={onClick}
style={{
width: 200,
height: 200,
margin: 50,
background: 'yellow',
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
fontSize: 36,
}}
>
{value}
</div>
);
}
export default Block;
正如描述的那样,这非常有效。
然后我扩展了这个组件以记录mouseenter 和mouseleave 事件的值,方法是在组件挂载时调用的useEffect 挂钩中添加相关事件处理程序。
import React, { useEffect, useRef } from 'react';
const Block = ({ value, onClick }) => {
const divRef = useRef();
const mouseEnter = () => {
console.log('mouse enter', value);
}
const mouseLeave = () => {
console.log('mouse leave', value);
}
useEffect(() => {
console.log('addEventListeners');
divRef.current.addEventListener('mouseenter', mouseEnter);
divRef.current.addEventListener('mouseleave', mouseLeave);
}, [])
return (
<div
ref={divRef}
onClick={onClick}
style={{
width: 200,
height: 200,
margin: 50,
background: 'yellow',
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
fontSize: 36,
}}
>
{value}
</div>
);
}
export default Block;
我遇到的问题是这两个事件处理程序是闭包,所以总是打印组件安装时的值。我可以将组件重写为类组件并通过 this 访问道具,但项目中没有其他任何东西使用类组件。我可以将该值复制到一个全局变量中,但这会将我限制在一个实例中。
在闭包中访问一个或多个道具的推荐方法是什么?
我应该补充一点,这是为了演示问题而编写的。在我的应用程序中,值是传入的一个大对象,而 div 是一个画布,上面绘制了数据。
【问题讨论】:
标签: javascript reactjs