单击 btn 而不触发 div 单击未按预期工作

2024-05-12

代码沙盒:https://codesandbox.io/s/currying-breeze-depdc9?file=/package.json https://codesandbox.io/s/currying-breeze-depdc9?file=/package.json

我有一个 Card 组件,它有 4 种潜在状态:“活动”、“选定”、“丢弃”、“完成”。根据状态,我需要显示不同的 css 类。

通过单击卡的特定部分来设置状态,每个部分都是一个“切换”(单击一次设置它,另一次单击“取消设置”它):

  • 默认状态为活动状态,
  • 如果用户单击卡上的任意位置,它就会被“选中”,并且卡内会出现两个按钮(“后退”、“放弃”)。
  • 如果用户单击“后退”,我需要将状态切换为“活动”。
  • 如果用户单击“丢弃”,我需要将状态设置为“丢弃”

状态存储在“应用程序”级别,我通过 props 将其传递给组件。这意味着为了更新状态,我将一些“处理程序”从应用程序传递到组件(SelectCard、DiscardCard)

下面是我的代码。

我可以通过该功能切换“活动”-->“选择”-->“活动”SelectCard.

但是,我做错了,因为我无法点击“放弃”来实际调用DiscardCard功能。

我的感觉是,这与 btn 位于 div 内部这一事实有关,并且我有一个用于调用的 div 的“onClic”SelectCard所以当我点击“discard btn”时,就像我也点击了div,但事情不起作用。

但也许是别的东西。没有把握。

import { useState } from 'react'
import reactLogo from './assets/react.svg'
import Card from './components/Card'
import data from "./assets/data.json"
import {nanoid} from "nanoid"

function App() {
  const [people, setPeople] = useState(data['people'].map(
    el=>{
      return {
        ...el,
        'key' : nanoid(),
      }
    }
  ))

  const [myCard, setMyCard] = useState(
    {
      "name":"Name and Surname",
      "img":"https://i.picsum.photos/id/1070/200/300.jpg?hmac=dJNTYlLwT_0RupxbJNbw5Wj-q2cCTB4Xh-GqWRofIIc",
      "description": "This is a silly descriptionhis is a silly descriptionhis is a silly description",
      'key' : nanoid(),
      "selected":false,
      "active":true,
    }
  )


  function SelectCard(CardKey){
    console.log('SelectCard')
    setPeople(oldPeople=>{
      return oldPeople.map(el=>{

        return el.key === CardKey
                ? { ...el, 'state': el.state === 'active'?'selected': 'active'}
                : { ...el, 'state':'active'}
          })
    })
  }

  function DiscardCard(CardKey){
    console.log('DiscardCard')
    setPeople(oldPeople=>{
      return oldPeople.map(el=>{
        return el.key === CardKey
                ? { ...el, 'state': el.state === 'discarded'?'active': 'discarded'}
                : { ...el}
          })
    })
  }

  const cards = people.map(el=>{
    return <Card 
            key = {el.key} 
            item={el} 
            onPress={()=>SelectCard(el.key)}
            onDiscard={()=>DiscardCard(el.key)}
          />
  })

  
  return (
    <div className="App">
      <div className='container'>
        <div className='left'>
          <div className='cards'>
            {cards}
          </div>
        </div>
        <div className = 'right'>
          <h4>You are: </h4>
          <Card key = {myCard.key} item={myCard}/>
        </div>
     </div>
     
    </div>
  )
}

export default App

import { useState } from 'react'

function Card(props) {
  //const [count, setCount] = useState(0)

  function getClassName(state) {
    switch (state) {
      case "active":
        return "";
      case "selected":
        return "overlay-selected";
      case "discarded":
        return "overlay-discarded";
      case "complete":
        return "overlay-complete";
      default:
        return "";
    }
  }

  

  const className = `card ${getClassName(props.item.state)}`

  return (
    <div 
        className={className} 
        onClick={(event)=>{
            props.onPress()}}>
        <img className='card-img' alt='Card Image' src={props.item.img} />
        <h3 className='card-title'>{props.item.name} </h3>
        { props.item.state === 'selected' ? 
        
            <div className='card-cta'>
                <button 
                    className='btn btn-back'
                    onClick={ props.item.selected ?  (event)=>
                        { 
                            props.onPress
                            //event.stopPropagation()
                        }
                         : ()=>{}}
                >Back</button>
                <button 
                    className='btn btn-discard'
                    onClick={ 
                        (event) =>{
                            //event.stopPropagation()
                            props.onDiscard
                            }
                        }
                >Discard</button>
            </div>
        : 
        <p className='card-description'>{props.item.description} </p>  
    
        }
        
    </div>
  )
}

export default Card


为了阻止事件冒泡到其他处理程序,您需要调用stopPropagation关于活动。

然后,正如另一个问题中提到的,您需要实际运行您传递的处理程序。为了调用代码块中的处理程序,您需要添加()在它的名字之后。

所以对于背部你需要

onClick={
  props.item.selected
    ? (e) => {
        e.stopPropagation();
        props.onPress();
      }
    : undefined
}

对于丢弃你想要的

onClick={(e) => {
  e.stopPropagation();
  props.onDiscard();
}}

Demo at https://codesandbox.io/s/competent-swartz-d05x9y https://codesandbox.io/s/competent-swartz-d05x9y

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单击 btn 而不触发 div 单击未按预期工作 的相关文章

随机推荐

  • ipython/jupyter 中的 tk 问题

    我正在尝试编写一个用于从 ipython jupyter 笔记本启动的 gui 但在笔记本中使用 tkinter 时遇到了麻烦 特别是在让 tk gui 窗口正常关闭方面 如何从 jupyter 制作 启动 tkinter gui 然后在不
  • Bugzilla 还是 Mantis? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • PHP date_sun_info 错误时间

    我正在尝试使用 PHPdate sun info函数获取全天太阳某些位置的时间信息 目前我正在使用类似于中的代码文档 http php net manual en function date sun info php sun info da
  • 使用MockWebServer暂停功能测试

    我正在测试使用 MockWebServer 的挂起函数返回结果的 api 但它不适用于 runBlockingTest testCoroutineDispatcher testCorounieScope 除非launch使用builder
  • 有没有办法列出Git中未修改的文件?

    我从另一个来源以 tarball 的形式获取了一些更改 我想知道哪些文件没有更改 目标是 Git 克隆 因此可以轻松查看新增内容和更改内容 有人知道如何获取未更改内容的列表 不包括未跟踪的内容 吗 编辑 换句话说 我希望利用 Git 来查找
  • django-tastypie:无法访问脱水中的bundle.request(self,bundle)

    我发现有人有同样的问题 但他的安慰对我不起作用 看Django Tastypie 如何访问 Bundle 中的 Http request 对象 https stackoverflow com questions 7389632 我正在尝试应
  • Strapi v4 使用补丁包自定义页面

    我想用我的自定义文本更改登录页面内的文本 我做了一些改变node modules strapi admin src pages AuthPage components Login BaseLogin js 在编辑该文件之前 我安装patch
  • 使用 Selenium for C# 登录 Facebook

    我一直在使用 Selenium C 框架并尝试进行 facebook 登录 但没有任何运气 这是我到目前为止得到的 基于这篇文章 使用 Selenium 测试 Facebook Connect 应用程序 https stackoverflo
  • UIView 内的 UIButton 目标操作

    我有一个习惯UIView我创建了一个UIButton 在该视图中 我有以下代码 func setupViews menuControlButton addTarget self action toggleButton forControlE
  • 在Python中整齐地绘制PMF

    有没有一个库可以帮助我在 python 中整齐地绘制样本的概率质量函数 如下所示 通过matplotlib pyplot的stem模块 matplotlib pyplot stem args kwargs from matplotlib p
  • 如何从一组重叠的圆计算多边形集?

    这个问题是一些计算细节的扩展这个问题 https stackoverflow com questions 1667310 combined area of overlapping circles 假设有一组 可能重叠的 圆 并且希望计算这组
  • PyQt5 的 OpenGL 模块和版本控制问题(调用不正确的 _QOpenGLFunctions_(ver))

    我一直在努力得到PyQt5 helloGL 示例代码 https github com baoboa pyqt5 blob master examples opengl hellogl py编译 当我尝试构建解决方案时 我得到 Traceb
  • Perl 单元测试只针对模块,而不针对程序吗?

    我在网上找到的文档和我拥有的书 Perl测试 或者说或者建议 Perl 的单元测试通常是在创建模块时完成的 这是真的 有没有办法使用单元测试实际程序Test More和表兄弟姐妹 当然 您可以使用测试脚本测试 更多 http search
  • 全日历与 UTC 和本地日期的混淆

    我确实让 fullcalendar 正常初始化 所以它代表当前日期 午夜 gt 午夜 1 天 1 小时时段 我从其他一些数据源获取带有时间戳的数据 格式为 YYYY MM DD HH mm 作为字符串传输 无时区信息 因此 我将该字符串转换
  • 如何安全地将 CGFloat 降低或提高到 int?

    我经常需要在地板或天花板上安装CGFloat to an int 用于计算数组索引 我永远看到的问题floorf theCGFloat or ceilf theCGFloat 是浮点不准确可能会带来麻烦 那如果我的CGFloat is 2
  • seaborn 箱线图的子图

    我有一个像这样的数据框 import seaborn as sns import pandas as pd pylab inline df pd DataFrame a one one two two one two one one one
  • React Native 中 fontAwesome 图标的圆形轮廓

    我想使用 fontAwesome 图标 使其位于圆圈的中间 我想将它用作一个图标项 我读到我们可以将它与圆形图标一起使用并将其放置在其中 但我无法使其工作 import IconFA from react native vector ico
  • 如何拆分 data.frame -> 将合并应用于子集 -> 合并到 data.frame 中

    我真的不知道如何在不使用 for 循环的情况下实现这一目标 x lt c a b c d gt x 1 a b c d data lt data frame x c a b a b c a a b c d name c one one tw
  • 异步方法中的异常未被捕获

    下面的代码没有捕获我的OperationCancelEException 它是通过调用抛出的ct ThrowIfCancellationRequested public partial class TitleWindow Window IA
  • 单击 btn 而不触发 div 单击未按预期工作

    代码沙盒 https codesandbox io s currying breeze depdc9 file package json https codesandbox io s currying breeze depdc9 file