2 回答
TA贡献1982条经验 获得超2个赞
只是想确保,您想要的是:当用户Enter在文本字段上键入时按下时,按钮将显示加载视觉效果,对吗?我认为您不必将 ref 传递给按钮组件,您可以将状态传递isLoadingShown到您的WaitingButton
等待按钮.js
return (
<div className={classes.buttonWrapper}>
<Button
ref={this.props.innerRef}
disabled={loading || disabled}
onClick={this.handleClick}
{...other}>
<React.Fragment>
{children}
{this.props.isLoadingShown && this.buildLoader(loading, classes)}
</React.Fragment>
</Button>
</div>
);
然后在表单组件中
state = {
isLoadingShown: false,
}
triggerClick() {
this.setState({ isLoadingShown: true })
}
render(){
...
<Paper>
<TextField
style={{marginBottom: '8px'}}
label="A textbox!"
fullWidth
onKeyPress={(e) => { if (e.key === "Enter") this.triggerClick(); }} />
<WaitingButton
variant="contained"
color="primary"
isLoadingShown={this.state.isLoadingShown}
onClick={(e) => {
console.log('Button clicked :)', e.target);
}}>
Press enter in textbox!
</WaitingButton>
</Paper>
...
}
不要忘记isLoadingShown再次设置为falsecomponentWillUnmount
TA贡献1818条经验 获得超11个赞
我只是试图重现你的情况。我为它创建了一个代码沙盒。我想我发现了问题。看起来 React.forwardRef 只适用于 prop name forwardedRef 所以尝试在你的代码中将 innerRef 属性重命名为 forwardedRef 。
const withInnerRef = React.forwardRef((props, ref) => <WaitingButton
forwardedRef={ref} {...props}
/>);
还有你的 render() 函数
<Button
ref={this.props.forwardedRef}
disabled={loading || disabled}
onClick={this.handleClick}
...
你可以用我的简化代码和盒子试试https://codesandbox.io/s/intelligent-cori-rb5ce
添加回答
举报