我正在研究一个名为 React 的组件ProjectCard
,它包含两个 div。第二个 div 有一个下拉菜单,当用户将鼠标悬停在卡片上或单击下拉菜单时,我想突出显示整张卡片。我使用 Radium 为以前的组件添加悬停功能,但为了合并这个新的高亮逻辑,我跟踪isActive
并isLocked
处于卡片状态。例如,isActive
当鼠标进入或离开以下函数中的组件时,我会切换。toggleActive
(我在构造函数中绑定)
toggleActive () {
console.log(this);
this.setState({
isActive: !this.state.isActive
});
}
但是,我收到一个错误,即在安装组件之前我无法设置状态。摸索了一下,登录this
了各种功能,似乎是镭的问题。我在导出中使用了 Radium 包装器,如下所示:export default Radium(ProjectCard);
,上面toggleActive
记录ProjectCard
为this
,而componentDidMount
记录RadiumEnhancer(ProjectCard)
为this
. 无镭的解决方法是使用 HoC,但我想我可以通过调整绑定 this 的范围来解决这个问题,所以我将函数绑定移动到componentDidMount
,如下所示。(使用箭头函数自动绑定范围,如来自构造函数的调用)
constructor (props: Props) {
super(props);
this.state = {
isActive: true,
isLocked: false
};
}
componentDidMount() {
console.log(this);
this.onClick = this.onClick.bind(this);
this.toggleLock = this.toggleLock.bind(this);
this.toggleActive = this.toggleActive.bind(this);
console.log("mounted, functions bound");
//console.log(this.toggleActive);
this.toggleActive();
//manual fix, stackoverflow this.
}
但是,在 componentDidMount 中绑定并将鼠标悬停在组件上不会导致任何更改并toggleActive
记录this
为未定义。不走运,修复似乎不起作用。
但是,在尝试调试时,我手动调用了 toggleActive(如上所示)并记录RadiumEnhancer(ProjectCard)
了(我想要的范围),并且奇迹般地,悬停功能开始工作(并且其他功能也获得了正确的范围)。
我的问题是:
- 不正确的范围/半径是否导致了 setState 错误?除了 setState 之外,代码中没有异步操作。
- 如果是这样,此修复是否合法?为什么我更改绑定的范围后它不起作用
this
? - 为什么手动调用toggleActive赋予所有函数权限
this
和范围?
谢谢!以下是相关代码的 pastebin:https ://pastebin.com/MRKw2APw