【发布时间】:2019-04-24 23:31:32
【问题描述】:
我正在尝试使用 React 挂钩将一个类重构为无状态组件。
组件本身非常简单,我看不出哪里出错了,因为它几乎是来自 react 文档的复制粘贴。
当用户单击按钮时,组件会显示一个弹出窗口(按钮通过道具传递给我的组件)。我正在使用typescript。
我在hooks 版本中注释了无法执行我想要的操作的行
这是我原来的课程:
export interface NodeMenuProps extends PropsNodeButton {
title?: string
content?: JSX.Element
button?: JSX.Element
}
export interface NodeMenuState {
visible: boolean
}
export class NodeMenu extends React.Component<NodeMenuProps, NodeMenuState> {
state = {
visible: false
}
hide = () => {
this.setState({
visible: false
})
}
handleVisibleChange = (visible: boolean) => {
this.setState({ visible })
}
render() {
return (
<div className={this.props.className}>
<div className={styles.requestNodeMenuIcon}>
<Popover
content={this.props.content}
title={this.props.title}
trigger="click"
placement="bottom"
visible={this.state.visible}
onVisibleChange={this.handleVisibleChange}
>
{this.props.button}
</Popover>
</div>
</div>
)
}
}
这是React hooks 版本:
export interface NodeMenuProps extends PropsNodeButton {
title?: string
content?: JSX.Element
button?: JSX.Element
}
export const NodeMenu: React.SFC<NodeMenuProps> = props => {
const [isVisible, setIsVisible] = useState(false)
const hide = () => {
setIsVisible(false)
}
const handleVisibleChange = (visible: boolean) => {
console.log(visible) // visible is `true` when user clicks. It works
setIsVisible(visible) // This does not set isVisible to `true`.
console.log(isVisible) // is always `false` despite `visible` being true.
}
return (
<div className={props.className}>
<div className={styles.requestNodeMenuIcon}>
<Popover
content={props.content}
title={props.title}
trigger="click"
placement="bottom"
visible={isVisible}
onVisibleChange={handleVisibleChange}
>
{props.button}
</Popover>
</div>
</div>
)
}
【问题讨论】:
-
visible是您的组件中定义的常量。调用 any 函数不可能改变它的值。 -
相反,
setVisible会触发重新渲染。当我们再次渲染时,它会被设置为一个新的值。 -
我面临同样的问题,但我的 jsx 正在更新,但我的函数中的常量值不是:( @DJ2
标签: reactjs typescript react-hooks