使用 JavaScript 对象和 React 限制环境中的单个按钮点击

Limiting single button clicks in an environment using JavaScript objects and React

在这个程序中,当用户点击按钮时,按钮就像图片下面一样处于活动状态。 Image

这些都是用javascript对象制作的。如果单击按钮,对象值将更改按钮的值。 如果高级用户在程序中单击多个按钮,则应禁用前一个按钮。

这些代码由原子设计模式组成,相关代码如下。 关于该页面的第一个代码。

const SeeAll = () => {
const [on, setOn] = useState({
    sum: false,
    payWith: false,
    sale: false,
    cashInput: false,
    cashSum: false,
    credit: false,
    creditCom: false
});

const setDetail = (key, e) => {
    let value = on[key];

    setOn({
        ...on,
        [key]: !value
    })
}

return (
    /*생략*/
                    <Receipt
                        map="false"
                        event={setDetail}
                        on={on}/>
    /*생략*/
)
}

第二个代码包含这些按钮。

const SellerReceipt = ({
    posNum,
    posName,
    order,
    call,
    map,
    event,
    on
}) => {
return (
    /*생략*/

        <Btn placeholder="매출 합계" event={() => event('sum')} onKey={on["sum"]} />
        <Btn placeholder="결제 수단 별 매출내역" event={() => event('payWith')}  onKey={on["payWith"]}/>
        <Btn placeholder="할인 매출내역" event={() => event('sale')}  onKey={on["sale"]}/>
        <Btn placeholder="현금시재 입력내역" event={() => event('cashInput')}  onKey={on["cashInput"]}/>
        <Btn placeholder="현금 정산액" event={() => event('cashSum')}  onKey={on["cashSum"]}/>
        <Btn placeholder="신용카드정산 내역" event={() => event('credit')}  onKey={on["credit"]}/>
        <Btn placeholder="카드사별 매출내역" event={() => event('creditCom')}  onKey={on["creditCom"]}/>
    </div>

)
}

关于Button的第三个代码。

const SellerBtn = ({placeholder, event, onKey}) => {
return (
    <button
        onClick={event}
        className="sellerBtn"
        style={{
            backgroundColor: `${onKey
                ? 'rgb(100,100,100)'
                : 'rgb(238,238,238)'}`,
            color: `${onKey
                ? 'white'
                : 'black'}`
        }}>{placeholder}</button>
)
}

谢谢。

如果我没理解错的话,你总是希望你的按钮是相互排斥的。如果是这样,最简单的解决方案应该是:

const SeeAll = () => {
  const [on, setOn] = useState(null); // or empty string, since you want nothing selected in the beginning
  const setDetail = (key, e) => {
  // button already clicked? set it to null
    setOn(on === key ? null : key)
  }
  return (...)
}

const SellerReceipt = ({ posNum, posName, order, call, map, event, on }) => { 
  return ( 
        <Btn placeholder="매출 합계" event={() => event('sum')} onKey={on === "sum"} />
        <Btn placeholder="결제 수단 별 매출내역" event={() => event('payWith')}  onKey={on === "payWith"}/>
        // more buttons
    </div>
  )
}