Реагировать - Условный рендеринг JSX - PullRequest
0 голосов
/ 20 сентября 2019

Я хотел спросить, есть ли лучший способ написать этот React Code.По сути, есть 2 кнопки, и одна всегда «активна».Проблема заключается в следующем:

    // Menu Config
let menuMessages = false
let menuSentMessages = false
if (menu === 'messages') {
    menuMessages = true
} else {
    menuSentMessages = true
}

В идеале я мог бы сделать: className = {menuMessages == 'messages'?'active': ''}

const Account = () => {
const [menu, setMenu] = useState('messages')

// Menu Config
let menuMessages = false
let menuSentMessages = false
if (menu === 'messages') {
    menuMessages = true
} else {
    menuSentMessages = true
}

return (
        <main className="messages">
            <div className="wrapper">

                <section className="controls">
                    <button
                        onClick={() => setMenu('messages')}
                        className={menuMessages ? 'active' : ''}
                    >
                        Messages
                    </button>
                    <button
                        onClick={() => setMenu('sent')}
                        className={menuSentMessages ? 'active' : ''}
                    >
                        Sent Messages
                    </button>
                </section>

            </div>
        </main>
)}export default Account

Ответы [ 4 ]

3 голосов
/ 20 сентября 2019

Я не понимаю, для чего "меню", но вот мое решение

const Account = () => {
  const [menu, setMenu] = useState("messages");
  const [menuMessages, setMenuMessages] = useState(false);
  const [menuSentMessages, setMenuSentMessages] = useState(false);

  const onClick = type => {
    setMenu(type);
    if (type === "messages") {
      setMenuMessages(true);
    } else {
      setMenuSentMessages(true);
    }
  };

  return (
    <main className="messages">
      <div className="wrapper">
        <section className="controls">
          <button
            onClick={() => onClick("messages")}
            className={menuMessages ? "active" : ""}
          >
            Messages
          </button>
          <button
            onClick={() => onClick("sent")}
            className={menuSentMessages ? "active" : ""}
          >
            Sent Messages
          </button>
        </section>
      </div>
    </main>
  );
};
2 голосов
/ 20 сентября 2019

Вы можете сделать это следующим образом:

const Account = () => {
  const [menu, setMenu] = useState('messages')

  return (
    <main className="messages">
      <div className="wrapper">
        <section className="controls">
          <button onClick={() => setMenu('messages')}
                  className={menu === 'messages' ? 'active' : ''}>
            Messages
          </button>
          <button onClick={() => setMenu('sent')}
                  className={menu === 'sent' ? 'active' : ''}>
            Sent Messages
          </button>
        </section>
      </div>
    </main>
  )}export default Account
0 голосов
/ 20 сентября 2019

Вы можете переместить чеки внутри JSX.


return (
        <main className="messages">
            <div className="wrapper">

                <section className="controls">
                    <button
                        onClick={() => setMenu('messages')}
                        className={menu === 'messages' ? 'active' : ''}
                    >
                        Messages
                    </button>
                    <button
                        onClick={() => setMenu('sent')}
                        className={menu === 'sent' ? 'active' : ''}
                    >
                        Sent Messages
                    </button>
                </section>

            </div>
        </main>
);
0 голосов
/ 20 сентября 2019

Может быть лучше использовать состояние типа Boolean, например 'isSent'.

const Account = () => {
  const [isSent, setIsSent] = useState(false)

  return (
        <main className="messages">
            <div className="wrapper">
                <section className="controls">
                      <button
                         onClick={() => setIsSent(false)}
                         className={isSent ? 'active' : ''}
                       >
                          Messages
                      </button>
                      <button
                         onClick={() => setIsSent(true)}
                         className={isSent ? '' : 'active'}
                       >
                          Sent Messages
                      </button>
                  }
                </section>
            </div>
        </main>
  )
}

export default Account;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...