RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1563474
Accepted
rabbit
rabbit
Asked:2024-01-27 16:45:10 +0000 UTC2024-01-27 16:45:10 +0000 UTC 2024-01-27 16:45:10 +0000 UTC

将按钮单击状态传递给数组对象并从反应集合中禁用按钮单击

  • 772

我有一个按钮集合,我想确保当单击某个按钮时,其他集合中的类似按钮不会被单击。

例如:

<div>
 <button>A-1</button>
 <button>A-2</button>
 <button>A-3</button>
 <button>B-1</button>
 <button>B-2</button>
 <button>B-3</button>
</div>

<div>
 <button>A-1</button>
 <button>A-2</button>
 <button>A-3</button>
 <button>B-1</button>
 <button>B-2</button>
 <button>B-3</button>
</div>

当我单击一个按钮时B-3,我希望B-3除当前按钮之外的所有按钮都是这样的disabled。

例如,我单击按钮B-3,B-3除了当前的之外,所有内容都被禁用。

这实际上很容易做到,但我想将按下的按钮状态存储在数组对象的键的挂钩中。并将按下按钮的状态传递给钩子,如下所示B-*:

const [Buttons, setButtons] = useState([{ ClickedButtons: [null, null] }]);

null #1 - `A-*` кнопки
null #2 - `B-*` кнопки

我不太明白如何将按下按钮的状态输入到这个钩子中并禁用所有类似的按钮。请帮帮我。

<ClickedButtons id={1} />
<ClickedButtons id={2} />
<ClickedButtons id={3} />

<ButtonShow clickFn={btnClick} id={1} buttons={buttons} />
<ButtonShow clickFn={btnClick} id={2} buttons={buttons} />
<ButtonShow clickFn={btnClick} id={3} buttons={buttons} />
reactjs
  • 2 2 个回答
  • 42 Views

2 个回答

  • Voted
  1. ksa
    2024-01-27T22:34:15Z2024-01-27T22:34:15Z

    当我单击 B-3 按钮时,我希望除当前按钮之外的所有 B-3 按钮都被禁用。

    我会建议这个选项...

    const arr = [
      ['A-1', 'A-2', 'A-3', 'B-1', 'B-2', 'B-3'],
      ['A-1', 'A-2', 'A-3', 'B-1', 'B-2', 'B-3'],
    ]
    
    //
    function App() {
      const [slct, setSlct] = React.useState({})
      console.log(slct)
      return <section>
        {arr.map((a, i) => <Blk key={i} arr={a} line={i} set={setSlct} slct={slct} />)}
      </section>
    }
    //
    function Blk({arr, line, set, slct}) {
      const act = e => {
        const o = e.target
        const ol = o.closest('.blk')
        const i = +ol.dataset.line
        const v = o.textContent
        set(old => {
          if (old[v] !== undefined) delete old[v]
          else old[v] = i
          return {...old}
        })
      }
      return <div className="blk" data-line={line}>
        {arr.map(v => <button className={cls(v)} onClick={act} key={v} disabled={dis(v)}>{v}</button>)}
      </div>
      //
      function cls(v) {
        if (slct[v] === line) return 'on'
        return null
      }
      //
      function dis(v) {
        if (slct[v] === undefined) return false
        if (slct[v] !== line) return true
        return false
      }
    }
    
    const domContainer = document.querySelector('#like_button_container');
    const root = ReactDOM.createRoot(domContainer);
    root.render(<App />);
    .blk {
      margin: 10px;
    }
    .on {
      background-color: green;
    }
    <div id="like_button_container"></div>
    <script src="https://unpkg.com/react@18/umd/react.development.js" crossorigin></script>
    <script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js" crossorigin></script>

    • 1
  2. Best Answer
    SwaD
    2024-01-27T22:54:04Z2024-01-27T22:54:04Z

    您可以实现此行为,例如,通过将单击所在的“容器”的 ID 保存到按钮状态并在渲染期间进行检查:

    • 如果没有点击clickId === 0,则该按钮处于活动状态
    • 如果有点击,那么我们检查点击是否在当前容器中
    • 如果在当前按钮中,则该按钮处于活动状态,否则不处于活动状态

    例如,我们为每个按钮创建以下结构:

    {
        name: "A-1", // Название кнопки
        clickId: 0, // Где нажата
        buttonId: 1, // ID кнопки
    },
    

    让我们创建一个负责渲染按钮及其状态的组件

    const ButtonShow = ({ buttons, id, clickFn }) => {
      return (
        <>
          {buttons.map((button) => (
            <button
              // По клику передаем Id кнопки и id контейнера
              onClick={() => clickFn(button.buttonId, id)}
              // Если заполнен клик и он не из этого контейнера, отключаем кнопку
              disabled={button.clickId && button.clickId !== id}
            >
              {button.name}
            </button>
          ))}
        </>
      );
    };
    

    在主组件中,我们创建一个处理按钮点击的状态和函数

    function App() {
      const [buttons, setButtons] = useState([...buttonsInit]);
    
      const btnClick = (btnId, rndId) => {
        setButtons((prev) => {
          return prev.map((btn) => {
            // Если ID кнопки не совпало, возвращаем элемент как есть
            if (btn.buttonId !== btnId) return btn;
            // Если ID контейнера совпадает, отключаем клик
            // Если нет, устанавливаем
            btn.clickId = rndId === btn.clickId ? 0 : rndId;
            return btn;
          });
        });
      };
    
      return (
        <div className="App">
          <hr />
          <ButtonShow clickFn={btnClick} id={1} buttons={buttons} />
          <br />
          <ButtonShow clickFn={btnClick} id={2} buttons={buttons} />
          <br />
          <ButtonShow clickFn={btnClick} id={3} buttons={buttons} />
          <br />
        </div>
      );
    }
    

    完整代码:

    const buttonsInit = [
      {
        name: "A-1",
        clickId: 0,
        buttonId: 1,
      },
      {
        name: "A-2",
        clickId: 0,
        buttonId: 2,
      },
      {
        name: "B-1",
        clickId: 0,
        buttonId: 3,
      },
      {
        name: "B-2",
        clickId: 0,
        buttonId: 4,
      },
    ];
    
    const ButtonShow = ({ buttons, id, clickFn }) => {
      return (
        <>
          {buttons.map((button) => (
            <button
              onClick={() => clickFn(button.buttonId, id)}
              disabled={button.clickId && button.clickId !== id}
            >
              {button.name}
            </button>
          ))}
        </>
      );
    };
    
    function App() {
      const [buttons, setButtons] = useState([...buttonsInit]);
    
      const btnClick = (btnId, rndId) => {
        setButtons((prev) => {
          return prev.map((btn) => {
            if (btn.buttonId !== btnId) return btn;
            btn.clickId = rndId === btn.clickId ? 0 : rndId;
            return btn;
          });
        });
      };
    
      return (
        <div className="App">
          <hr />
          <ButtonShow clickFn={btnClick} id={1} buttons={buttons} />
          <br />
          <ButtonShow clickFn={btnClick} id={2} buttons={buttons} />
          <br />
          <ButtonShow clickFn={btnClick} id={3} buttons={buttons} />
          <br />
        </div>
      );
    }

    沙箱中的工作示例

    • 1

相关问题

  • 如果图像在道具中,如何使背景图像做出反应?

  • 项目未显示

  • 引发错误:InvalidTokenError: Invalid token specified: Cannot read property 'replace' of undefined

  • 如何在没有 node.js 的情况下运行 react.js 应用程序

  • 如何从 React Native 中的导航堆栈中清除上一个屏幕?

  • 为什么渲染后会触发 Click 事件?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5