отключите другую кнопку в группе кнопок при нажатии одной кнопки

#javascript #reactjs #ajax

Вопрос:

У меня есть массив данных

 const projectTypeValues = [ { name: 'Hour', value: 'hour'}, { name: 'Day', value: 'day'}, { name: 'Session', value: 'session'}, { name: 'project', value: 'project'}]  

Оттуда я показываю кнопки в группе кнопок пользовательского интерфейса материала через цикл.

 {projectTypeValues.map(element=gt;  lt;Button variant="contained" color="primary"gt;{element.name}lt;/Buttongt;  )}  

как реализовать функцию onClick, которая отключит другие кнопки в цикле, кроме той, на которую был нажат?

Комментарии:

1. Добавьте атрибут данных в кнопку, после загрузки страницы (чтобы кнопка существовала в html) добавьте список событий с помощью querySelectorAll и создайте свою собственную функцию.

2. Вы можете добавить disabled атрибут в зависимости от вашего состояния

Ответ №1:

Вы можете управлять им, сохраняя выбранное значение кнопки в состоянии и проверяя disabled время. Вы можете использовать атрибут кнопки disabled для отключения. Вы можете сохранить unique значение для соответствующей кнопки отключить как name или id .

Если мы используем name для выбора кнопку, значит, нам нужно проверить вот так.

 disabled={currentSelect amp;amp; currentSelect !== element.name}  

Пример:

 const projectTypeValues = [  { name: "Hour", value: "hour" },  { name: "Day", value: "day" },  { name: "Session", value: "session" },  { name: "project", value: "project" } ]; const App = () =gt; {  const [currentSelect, setSelect] = React.useState(null);  console.log(currentSelect);  return (  lt;divgt;  {projectTypeValues.map((element) =gt; (  lt;div style={{ padding: "10px" }} key={element.name}gt;  lt;button  disabled={currentSelect amp;amp; currentSelect !== element.name}  variant="contained"  color="primary"  onClick={() =gt; setSelect(element.name)}  gt;  {element.name}  lt;/buttongt;  lt;/divgt;  ))}  lt;/divgt;  ); };  ReactDOM.render(lt;App /gt;, document.getElementById("root")); 
 lt;script  crossorigin  src="https://unpkg.com/react@17/umd/react.production.min.js" gt;lt;/scriptgt; lt;script  crossorigin  src="https://unpkg.com/react-dom@17/umd/react-dom.production.min.js" gt;lt;/scriptgt; lt;div id="root"gt;lt;/divgt; 

Ответ №2:

 import React from "react"; function App() {  const [disable, setDisable] = React.useState(false);   return (  lt;button variant="contained" color="primary"   disabled={disable} onClick={() =gt;   setDisable(true)}gt;  {element.name}   lt;/buttongt;  );  }  

Ответ №3:

Вы должны определить state для выбранной кнопки, что-то вроде этого:

const [selectedButtonIndex, setSelectedButtonIndex] = useState(-1)

затем вам нужно использовать map и получить индекс и disable или другие кнопки:

 {projectTypeValues.map((element, index)=gt;  lt;Button variant="contained" disabled={index !== -1 amp;amp; index !== selectedButtonIndex} onClick={() =gt; setSelectedButtonIndex(index)} color="primary"gt;{element.namelt;/Buttongt;  )}  

Примечание: Я начал с -1 начального значения, так как это изначально включает все кнопки, а затем блокирует ваш выбор. Вы можете использовать другое состояние, чтобы сигнализировать о том, что выбор сделан.