Я не уверен, почему я не могу передать массив распространения в качестве значения атрибута в выражении 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}
/>
)
.....
Большое спасибо



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Выдает ошибку, потому что ожидаемый синтаксис - это строка с именами классов, разделенными пробелами.
Вы можете распространять массив в другой массив или в список аргументов, но не в строковую переменную.
Вам нужно соединить свой массив с пробелами, чтобы получить строку в качестве вывода и передать ее как 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(' '));
Какая именно ошибка вылетает? Обратите внимание, что 2 кода не эквивалентны, оператор расширения для
arrayне возвращает строку, как это делаетjoin