状态属性是ReactNode,我想更改该属性,然后在某些onClick
函数中获取属性值。
但是我发现状态属性值没有改变。
像这样反应代码:
import React, { useState, useEffect } from 'react';
import { Button } from 'antd';
interface SomeData {
id?: number;
content?: React.ReactNode;
}
const Test = (): React.ReactElement => {
const [someData, setSomeData] = useState<SomeData>({});
const handleClick = (): void => {
console.log('click event', someData);
};
const loadData = (): void => {
const content = <Button onClick={handleClick}>button#1</Button>;
setSomeData({ id: 10, content, });
};
useEffect(() => { loadData() }, []);
return (
<div>
{someData.content}
<Button onClick={handleClick}>button#2</Button>
</div>
);
};
当我单击button#1
时,功能handleClick
的控制台结果为click event {}
,
并单击button#2
,控制台结果为click event {id: 10, content: {…}}
。
为什么这两个相同的点击事件会产生不同的结果?
答案 0 :(得分:1)
让我们看看发生了什么
Test
时,someData
是一个空对象,因此{someData.content}
不渲染任何内容。useEffect
在第一个渲染之后被调用(因为它具有一个空的依赖关系数组)。在其中,它将someData.content
函数链接到的按钮保存在handleClick
中。handleClick
有其自己的闭包,其中someData
仍然是一个空对象,因为尚未完成对someData
的更新。button#1
时,您将调用handleClick
及其结束符,其中someData
仍然是空对象。button#2
时,由于每次渲染button#2
,因此每次完成渲染时,其handleClick
的闭合都会改变,因此someData
位于{ {1}}已更新。如何解决此问题?这取决于您实际想要做什么,因为我听不懂。
您是否希望在单击handleClick
时将button#1
设置为someData.id
,然后执行某些操作?让我知道,我会尽力为您提供更多帮助。
答案 1 :(得分:0)
如果要在单击按钮时“激活”函数“ handleClick”,则应声明函数在函数“类”中。
示例:
import React, { Component, MouseEvent } from 'react';
export class Button extends Component {
handleClick(event: MouseEvent) {
event.preventDefault();
alert(event.currentTarget.tagName); // alerts BUTTON
}
render() {
return <button onClick={this.handleClick}>Click me</button>
}
}