【发布时间】:2019-01-11 20:36:04
【问题描述】:
这里让我有点发疯......
我想单击一个Preview 按钮,它会生成一个预览窗格用于文本输入。我想我会让 div 的内联样式链接到 React 状态。
<div className="preview-container" style={{ display: this.state.showPreview ? 'visible' : 'none' }}>
{
this.state.showPreview &&
<Preview
htmlString={value.toString('html')}
showOrHidePreview={this.togglePreview}
/>
}
</div>
但即使我在单击按钮时可以看到状态发生变化, 并且我已经通过将边框颜色链接到状态来成功更改边框颜色 - 出于某种原因将显示更改为无只是坚持。它不会离开它。
有什么想法吗?
更新(相当标准的切换处理程序):-
togglePreview = () => {
if (this.state.showPreview === false) {
this.setState({
showPreview: true,
})
} else {
this.setState({
showPreview: false,
})
}
}
感谢 v.much @AdrianoRepetti 提出 display: block 而不是 visible 的建议。不知道我从哪里接了display: visible。
如果其他人遇到这种情况,我还发现了一个使用 opacity: 10 vs opacity 0 的 hack。虽然这有点刮擦桶。
【问题讨论】:
-
@NewbieAid 可能是因为
display: visible无效(例如,尝试display: block)然后更改就会被忽略。 -
使用
display: none是没有用的,因为当this.state.showPreview是false时,<Preview />窗格会从 DOM 中完全移除,所以<div className="preview-container">无论如何都是空的。 -
Lukas 是对的——这是一种反模式。如果您想隐藏元素(以在页面上保留其尺寸),请使用
visibility: visible和visibility: hidden。另请注意,不透明度是从 1 到 0,而不是从 10 到 0。 -
欢迎您。只是一个小提示:隐藏的 (
display: none) 元素不会在可视 DOM 中呈现,而opacity: 0和visibility: hidden是,它们有助于整体布局。请注意区别,因为有时您可能想要使用display,而其他时候您可能想要使用visibility。另请注意,从性能的角度来看,您可能希望避免从 DOM 中频繁插入/删除(然后this.state.showPreview &&可能会被省略) -
与原始问题无关,但你可以用更简单的东西替换你的长
togglePreview函数:this.setState(prevState => ({showPreview: !prevState.showPreview}));
标签: javascript reactjs