Передача className в компонент React

Я пытаюсь передать classname в material-ui Button component, но не могу заставить его работать. Ниже мои попытки.

Попытка 1:

attributes.map((attribute, index) => {
  const classString = 'classes.button' + index;
  console.info(classString)
  return (
    <Button className = {classString} onClick = {this.handleClick.bind(this, attribute)}> 
     {attribute} 
    </Button>
  )}
)}

Попытка 2:

attributes.map((attribute, index) => {
  const classString = 'classes.button' + index;
  console.info(classString)
  return (
    <Button className = {'${classString}'} onClick = {this.handleClick.bind(this, attribute)}>
      {attribute}
    </Button>
  )}
)}

Я также пробовал пакет npm classnames, но даже он не работает.

Любая помощь будет оценена, спасибо!

Поведение ключевого слова "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
2 241
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

https://reactjs.org/docs/faq-styling.html

  • className = {yourVariableName}
  • className = {'redDiv'}

с ограничением, что yourVariableName должен быть строкой или null / undefined.

trixn 18.04.2018 14:47
Ответ принят как подходящий

Я предполагаю, что classes - это объект с ключом button. // в примере material-ui они передают classes как props

Немного измените декларацию classString. Убедитесь, что вы передаете объект classes и у него есть ключ с именем button.

attributes.map((attribute, index) => {
  const classString = classes.button + `${index}`; // best practice to add string to a number
  return (
    <Button className = {classString} onClick = {this.handleClick.bind(this, attribute)}> 
      {attribute} 
     </Button>
  )}
)}

Если вы все еще сталкиваетесь с проблемой, проблема связана с объектом classes. Чтобы проверить это, измените строку const classString = classes.button + $ {index} ; на

const classString = 'random-class';

и проверьте, получает ли кнопка класс random-class

Редактировать:

Поскольку ваш объект classes выглядит примерно так:

{
  class1: _class2-something-15443",
  class2: ....,
  ...
}

вам следует соответственно изменить classString.

измените его на: const classString = classes[`class${index}`];

Еще лучше: const classString = `${classes.button}${index};` . Но я сомневаюсь, что добавление индекса массива в класс css - это вообще правильный подход. Вместо этого это должен быть id, если OP хочет применить css специально для этой кнопки, или это можно сделать иначе, используя только javascript.

trixn 18.04.2018 14:38

Абсолютно. Но пусть внесет ясность в вопрос. Это с передачей свойства className или значения, входящего в свойство className

Syam Pillai 18.04.2018 14:40

Да, конечно. Это был просто дополнительный комментарий, так что если OP не подумал об этом, он мог подумать об использовании другого решения. Это не лишает его шанса прояснить проблему, поскольку ваш ответ дает ему необходимые подсказки.

trixn 18.04.2018 14:45

Спасибо за ответ. Когда я меняю его на classes.button + '$ {index}', я получаю предупреждение с надписью «неожиданное строковое выражение шаблона», но оно по-прежнему не работает. И когда я меняю его на 'const classString =' classes.button '', который является исходным классом, кнопка все еще не получает класс, только когда я удаляю кавычки, кнопка получает его.

Joseph Tsui 18.04.2018 16:13

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

Joseph Tsui 18.04.2018 16:25

const classString = 'random-class'; пробовали?

Syam Pillai 18.04.2018 16:44

Я попробовал const classString = classes.button, и он работает, но const classString = 'classes.button' по-прежнему не работает.

Joseph Tsui 18.04.2018 16:47

Когда я регистрирую classes, я заметил одну вещь: я получаю объект, похожий на Object {class1: _class2-something-15443", etc}, я понятия не имею, что это означает, но я думаю, что это связано?

Joseph Tsui 18.04.2018 17:10

Material-UI реализует CSS-in-js и использует компонент более высокого порядка material-ui / styles 'withStyles'. Взгляните на демонстрацию кнопки на сайте, она очень полезна https://material-ui-next.com/demos/buttons/

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