javascript - 箭头函数不使用组件 ReactJS 中的局部变量
问题描述
我在使用事件更新 React 组件内的对象时遇到了麻烦。
const Comp = (props) => {
...
let tango = {alpha: null};
...
let handleFirst = () => {
tango.alpha = "CLICK";
console.log(tango);
}
let handleSecond = () => {
console.log(tango);
}
return (
<div id="first" onClick={handleFirst}>text</div>
<div id="second" onClick={handleSecond}>image</div>
)
}
当我单击 div 时,first
我收到以下控制台输出:{alpha: "CLICK"}
,但是当我单击 div 时,second
我收到控制台输出,因为它是 null: {alpha: null}
。我不想包含tango
在useState
函数中,因为我想在另一个触发器之后更新组件的状态,所以我不需要在每次编辑对象后渲染组件。
在我看来这很令人沮丧,但我不知道我已经尝试了几乎所有的东西,而且在我看来添加alpha
到状态将是解决方案,但我希望我可以避免它。
解决方案
听起来在第一次点击和第二次点击之间有一些重新渲染 - 如果没有,被调用的tango
关闭handleFirst
将与被调用的关闭相同handleSecond
:
const Comp = (props) => {
let tango = {alpha: null};
let handleFirst = () => {
tango.alpha = "CLICK";
console.log(tango);
}
let handleSecond = () => {
console.log(tango);
}
return (<div>
<div id="first" onClick={handleFirst}>text</div>
<div id="second" onClick={handleSecond}>image</div>
</div>)
}
ReactDOM.render(<Comp />, document.querySelector('.react'));
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div class='react'></div>
如果您想保持对tango
跨重新渲染的持久引用,而不会对它的更改导致重新渲染本身,您可以使用 ref 代替:
const Comp = (props) => {
let tangoRef = React.useRef({alpha: null});
const [someState, setSomeState] = React.useState(0);
let handleFirst = () => {
tangoRef.current.alpha = "CLICK";
setSomeState(someState + 1);
console.log(tangoRef.current);
}
let handleSecond = () => {
console.log(tangoRef.current);
}
return (<div>
<div id="first" onClick={handleFirst}>text</div>
<div id="second" onClick={handleSecond}>image</div>
</div>)
}
ReactDOM.render(<Comp />, document.querySelector('.react'));
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div class='react'></div>
推荐阅读
- php - 如何获取设备令牌以发送通知?
- python - 如果我的视频带有可变帧,如何设置 LSTM 的输入(通过视频进行姿势识别)?
- vector-graphics - 对于 Inkscape 脚本,“对象集属性”和“对象集属性”有什么区别?
- c# - C# 单元测试 MoQ、Mock DB 上下文、使用事务时的问题
- amazon-web-services - AWS EB 版本中已弃用的警告建议升级到相同版本
- orocommerce - 在前端联系表单中添加上传按钮
- javascript - Firestore(更新、删除、添加)触发器创建 Algolia 索引需要太长时间
- java - 使用 XMLStreamReader 时如何从文件中读取小部分数据?
- c# - 如何为动态模型解析 OData $filter
- wpf - 如何在使用 wpf 和运行空间时单击创建按钮以运行 powershell 函数?