为啥我的 React 应用程序中的两个点击事件会同时运行?

Posted

技术标签:

【中文标题】为啥我的 React 应用程序中的两个点击事件会同时运行?【英文标题】:Why do my two click events in my React app run at the same time?为什么我的 React 应用程序中的两个点击事件会同时运行? 【发布时间】:2021-12-03 03:51:17 【问题描述】:

我有两个用户设置选项。一个是“启用级联面板”,另一个是“包含附件”。

我已经设置了状态变量和切换函数来传递给子组件,这样当我点击其中任何一个时,父组件就能够在值之间切换。问题是,当我单击其中一个时,另一个也会执行。我是否错过了设置这些步骤?

父组件数据:

状态:

    constructor(props)
     const userToggleSettings = 
       cascadingPanels: true,
       includeAttachments: true,
       analyticsOptIn: false
     ;
    
     this.state = 
       userToggleSettings
     ;
    

切换功能:


toggleIncludeAttachments = () => 
    this.setState((prevState) => (
        
            userToggleSettings:
            
                includeAttachments: !prevState.userToggleSettings.includeAttachments
            
        
    ));
;

toggleCascadingPanels = () => 
    this.setState((prevState) => (
        
            userToggleSettings:
            
                cascadingPanels: !prevState.userToggleSettings.cascadingPanels
            
        
    ));
;

includeAttachmentsClickHandler = () => 
    this.toggleIncludeAttachments();


cascadingPanelsClickHandler = () => 
    this.toggleCascadingPanels();


将值和函数作为道具传递:

<ChildComponent
  attachmentsSwitchHandler=this.toggleIncludeAttachments
  attachmentsSwitchValue=this.state.userToggleSettings.includeAttachments
  cascadingPanelsSwitchHandler=this.toggleCascadingPanels
  cascadingPanelsSwitchValue=this.state.userToggleSettings.cascadingPanels
/>

子组件数据

在子组件中设置点击事件和值:

<div className='child-component-container'>
    <div className='user-settings-toggle'
        onClick=props.cascadingPanelsSwitchHandler
    >
    <div className='user-settings-label'>
            props.translations.CASCADING_PANELS
        </div>
    <Switch
        checked=props.cascadingPanelsSwitchValue
        translations=
            off: props.translations.off,
            on: props.translations.ON
        
        />
    </div>
    <div className='user-settings-toggle'
      onClick=props.attachmentsSwitchHandler
    >
    <Switch
        checked=props.attachmentsSwitchValue
        translations=
            off: props.translations.off,
            on: props.translations.ON
        
    />
    <div className='user-settings-label'>
        props.translations.ALWAYS_INCLUDE_ATTACHMENTS
    </div>
</div>

演示:

有人可以澄清我在这里做错了什么吗?

【问题讨论】:

【参考方案1】:

你应该这样改变你的切换功能:

 this.setState((prevState) => (
        
            userToggleSettings:
            
                ...prevState.userToggleSettings, // ---> added
                cascadingPanels: !prevState.userToggleSettings.cascadingPanels
            
        
    ));

React 不执行“深度合并”,即嵌套对象不合并。仅合并***属性。

因此,在执行setState 之后,您会丢失userToggleSettings 对象中的所有内容。

【讨论】:

以上是关于为啥我的 React 应用程序中的两个点击事件会同时运行?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我无法在外部点击时使用 react js 访问我的两个容器的当前目标值?

为啥点击设置innerHTML会触发Chrome上的两个解析事件?

为啥要在标记点击事件上重新渲染地图?

为啥在 dispatchEvent 上不调用 React 事件处理程序?

React 触发虚拟 DOM 输入的 onChange 事件与常规 DOM 中的输入不同。为啥是这样?

为啥 a-frame 点击事件不起作用?