Reactjs 如何禁用React中props.children的单击事件?
如何为Reactjs 如何禁用React中props.children的单击事件?,reactjs,Reactjs,如何为道具子对象禁用任何单击事件 const Example = props => ( <div> <div>This can be clicked</div> {props.children} /* These can't be clicked */ </div> ) const-Example=props=>( 这可以点击 {props.children}/*无法单击这些*/ ) 我正在使用渲染PDF页面,希望
道具子对象禁用任何单击事件
const Example = props => (
<div>
<div>This can be clicked</div>
{props.children} /* These can't be clicked */
</div>
)
const-Example=props=>(
这可以点击
{props.children}/*无法单击这些*/
)
我正在使用渲染PDF页面,希望用户能够拖动自定义选择框(如Photoshop…)。实际上,marquee元素下方或内部的PDF页面在拖动时仍会注册鼠标事件,如文本选择。使用CSS网格在顶部放置一个div
!
在另一个div
上呈现的透明div
将拦截单击事件
CSS网格可用于(滥用?)创建单个网格区域(使用网格模板区域
)并为其分配多个元素(使用网格区域
)
JSX
const ClickGuard = ({allow, block}) => (
<div className='click-guard-area'>
<div className='click-guard-allowed'>{props.allow}</div>
<div className='click-guard-block' />
<div className='click-guard-blocked'>{props.block}</div>
</div>
)
请注意,ClickGuard需要两个道具:allow
和block
。这些应该是JSX
您无法更改元素内的道具,因此无法更改其子道具。
另一种解决方案可能是:,
下面是一个简单的代码和平:
const-Example=props=>(
这可以点击
{props.children.map((child)=>
反应。克隆元素(儿童{
残疾人士:对
})
)}
)
有一种简单但不可靠的方法可以做到这一点:
const Example = props => (
<div style={{pointerEvents:'none'}}>
<div style={{pointerEvents:'auto'}}>This can be clicked</div>
{props.children}
</div>
)
const-Example=props=>(
这可以点击
{props.children}
)
它不是健壮的,因为如果任何子项将指针事件设置为自动
,它们也可以单击。看看它是否适合你的需要。此外,它还将杀死悬停
和其他鼠标事件。您对此的用例是什么?@trixn我刚才在问题中添加了我的用例。好的,但我仍然不明白为什么这需要阻止单击事件。这看起来像是解决了一个问题,而这个问题首先是因为没有选择正确的设计。太好了!我喜欢这种方法。我用它来制作一个组件来包装可编辑元素,根据用户的权限禁用其中的一些元素。尽管有一个缺点-用户可以删除devtools中的阻塞元素。您能展示一些我们可以自己编译和运行的代码吗?这看起来很有希望,但禁用的是否可以处理表单元素以外的元素(按钮,输入,字段集,等等)?可用于设置指针事件
,可能与@JackSteam不知道一起使用,但孩子的孩子也可以设置指针事件
,因此没有帮助。
<ClickGuard
allow={<div>I can be clicked!</div>}
block={<div>No clicks for me. You cannot change the props within an element thus its children props.
An alternative solution may be possible with React.cloneElement,
Here is a simple peace of code for you:
const Example = props => (
<div>
<div>This can be clicked</div>
{props.children.map((child)=>
React.cloneElement(child, {
disabled: true
})
)}
</div>
)
const Example = props => (
<div style={{pointerEvents:'none'}}>
<div style={{pointerEvents:'auto'}}>This can be clicked</div>
{props.children}
</div>
)