Отображение активной кнопки

В моем приложении много кнопок. Теперь я хочу сделать их динамически активными, то есть, если пользователь предполагает, что нажимает первую кнопку, эта кнопка должна иметь другой цвет, чем другие кнопки.

То есть в моем приложении есть разные диаграммы, если пользователь нажимает кнопку, чтобы отобразить первую диаграмму, кнопка для этого должна иметь зеленый цвет, а оставшаяся - # 841584

Как я могу этого добиться?

 <View style = {button}>
  <Button
    style
    onPress = {() => this.changeHistoryChart(1)}
    title = "Today"
    color = "#841584"
  />
  <Button
    onPress = {() => this.changeHistoryChart(7)}
    title = "1W"
    color = "#841584"
  />
  <Button
    onPress = {() => this.changeHistoryChart(30)}
    title = "1M"
    color = "#841584"
  />
  <Button
    onPress = {() => this.changeHistoryChart(90)}
    title = "3M"
    color = "#841584"
  />
  <Button
    onPress = {() => this.changeHistoryChart(180)}
    title = "6M"
    color = "#841584"
  />
  <Button
    onPress = {() => this.changeHistoryChart(365)}
    title = "1Y"
    color = "#841584"
  />
</View>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
56
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Во-первых, все ваши кнопки должны иметь что-то вроде этого

<Button
  style
  onPress = {() => this.changeHistoryChart(1)}
  title = "Today"
  color = {this.state.chosenButton === 1 ? 'red': "#841584"} // Put whatever color you like instead of red
/>

Это состояние selectedButton будет служить для контроля того, какая кнопка нажата, что означает, что все ваши кнопки должны иметь различное состояние внутри цветовой опоры, которое имеет тот же номер, что и тот, который вы передаете в функции changeHistoryChart this.state.chosenButton === 7 и так далее ...

Внутри changeHistoryChart делать

this.setState({chosenButton: theNumberYouPassedAsPropToChangeHistoryChart})

Это должно решить вашу проблему

Самый простой способ, который я могу придумать, - это просто создать функцию, которая будет возвращать цвет на основе заданного значения и текущей диаграммы истории и вызывать это при установке цвета вашей кнопки. Например:

changeHistoryChart(val) {
  this.setState({currentChart: val});
}

getButtonColour(val) {
  return val === this.state.currentChart? '#0F0' : '#841584';
}

Я не совсем уверен, как выглядит функция changeHistoryChart, так что это всего лишь простая оценка. Затем при рендеринге кнопки вы можете сделать что-то вроде:

<Button 
   onPress = {()=>this.changeHistoryChart(365)}
   title = "1Y"
   color = {this.getButtonColour(365)} />
  1. определить массив кнопок, например ["1 м", "3 м", ..]
  2. использовать функцию карты для рендеринга вида
  3. setState ({currentIndex: index}) при нажатии кнопки
  4. color = {this.state.currentIndex === index? 'красный': "# 841584"}

Я попробовал это, и это сработало, кстати, это долгий путь; Сначала установите флаг для каждого из них, например:

constructor(props){
super(props);
  this.state = {
    button_1 : false,
    button_2 : false,
    button_3 : false,
    button_4 : false,
  }

затем для каждого Button выполните следующее:

 <Button
      title = "Button 1"
      color = {this.state.button_1 ? "green" : "gray"}
      onPress = {() => {
                  this.setState({
                       button_1: !this.state.button_1,
                       button_2: false,
                       button_3: false,
                       button_4: false
                         });
               }}
  />

 <Button
      title = "Button 2"
      color = {this.state.button_2 ? "green" : "gray"}
      onPress = {() => {
                  this.setState({
                       button_1: false,
                       button_2: !this.state.button_2,
                       button_3: false,
                       button_4: false
                         });
               }}
  />

сделайте это и для других кнопок, это будет работать

Да, я изначально думал о той же идее, но по какой-то причине я не фанат создания дополнительных состояний в компоненте. Я думаю о реализации Lazar Answer, но все же спасибо :)

iRohitBhatia 21.09.2018 10:20

@KuchBhi Я много искал об этой проблеме, но не нашел другого способа ее решить, я знал именно так.

Mojtaba Moshfeghi far 21.09.2018 10:46

Другие вопросы по теме