Использование оператора распространения в выражении jsx

Я не уверен, почему я не могу передать массив распространения в качестве значения атрибута в выражении JSX.

Оператор распространения разрешается в значение, которое, как я полагаю, ожидает выражение JSX: значение после оценки выражения.

Обратите внимание, что я пытаюсь распространить массив как значение в атрибуте className кнопки в моем JSX:

....
   render() {
    const {on, className = '', ...props} = this.props
    const btnClassName = [
      className,
      'btn',
      on ? 'btn-on' : 'btn-off',
    ]

    return (
       <button
          className = {...btnClassName} // this throws an error
          aria-label = "Toggle"
          {...props}
        />
     )
.....

Это работает так, как ожидалось: Обратите внимание, что здесь я передаю массив (после .join() его элементов) в качестве значения в атрибуте className кнопки в моем JSX:

....
   render() {
    const {on, className = '', ...props} = this.props
    const btnClassName = [
      className,
      'btn',
      on ? 'btn-on' : 'btn-off',
    ].join(' ')

    return (
         <button
          className = {btnClassName} // this works as expected
          aria-label = "Toggle"
          {...props}
        />
    )
.....

Большое спасибо

Какая именно ошибка вылетает? Обратите внимание, что 2 кода не эквивалентны, оператор расширения для array не возвращает строку, как это делает join

Kaddath 07.03.2019 12:02
Поведение ключевого слова "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) для оценки ваших знаний,...
2
1
292
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Выдает ошибку, потому что ожидаемый синтаксис - это строка с именами классов, разделенными пробелами.

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

Вам нужно соединить свой массив с пробелами, чтобы получить строку в качестве вывода и передать ее как className.

This can be misleading since there is no difference when you console.info() an array joined with spaces with the same array but spread.

Но это только потому, что вы распространяете массив в список аргументов console.info(), а console.info() будет разделять каждый аргумент пробелами перед их печатью:

const classes = ['class1', 'class2', 'class3'];

const join = (...args) => args.join(' ');

console.info(...classes); // console.info() joins the arguments with a space automatically
console.info(join(...classes));
console.info(classes.join(' '));

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