класс против className в React 16


84

Я видел, что React 16 позволяет передавать атрибуты в DOM. Значит, это означает, что вместо className можно использовать class, верно?

Мне просто интересно, есть ли преимущества в использовании className по сравнению с class, помимо обратной совместимости с предыдущими версиями React.


className - единственный поддерживаемый атрибут, но в v16 произошло изменение «Известные атрибуты с другим каноническим именем React». В версии 15 React предупреждает и игнорирует их, в версии 16 предупреждает, но преобразует значения в строки и передает их. Документация дает четкий ответ на ваш вопрос: «всегда используйте каноническое именование React для всех поддерживаемых атрибутов». См. Responsejs.org/blog/2017/09/08/…
— lifeisfoo

Ответы:


107

class- ключевое слово в javascript, а JSX - это расширение javascript. Это основная причина, по которой React использует classNameвместо class.

В этом отношении ничего не изменилось.

Чтобы расширить это еще немного. А ключевое слово означает , что знак имеет особое значение в синтаксисе языка. Например в:

class MyClass extends React.Class {

Токен classозначает, что следующий токен является идентификатором, а то, что следует за ним, является объявлением класса. См. Ключевые слова Javascript + Зарезервированные слова .

Тот факт, что токен является ключевым словом, означает, что мы не можем использовать его в некоторых выражениях, например

// invalid in older versions on Javascript, valid in modern javascript
const props = {
  class: 'css class'
}

// valid in all versions of Javascript
const props = {
 'class': 'css class'
};

// invalid!
var class = 'css';

// valid
var clazz = 'css';

// invalid!
props.class = 'css';

// valid
props['class'] = 'css';

Одна из проблем заключается в том, что никто не может знать, не возникнет ли какая-то другая проблема в будущем. Каждый язык программирования все еще развивается, и его classможно использовать в новом конфликтующем синтаксисе.

Таких проблем нет с className.


Привет, Султан. не могли бы вы объяснить свой ответ еще немного? Почему class является ключевым словом в javascript, что делает className предпочтительной практикой?
— Дэвид А. Френч

1
@ DavidA.French Расширенный ответ. См. Также другие ответы.
— Sulthan

1
Большое спасибо, Султан! это было очень полезно.
— Дэвид А. Френч

4
props.class = 'css' это полностью верно
— daGo

31

Команда React фактически перейдет на, class а не className в ближайшем будущем ( источник ):

  • className→ class( # 4331 , см. Также # 13525 (комментарий) ниже). Это предлагалось бесчисленное количество раз. Мы уже позволяем передавать класс в узел DOM в React 16. Путаница, которую это создает, не стоит тех ограничений синтаксиса, от которых он пытается защитить.

Почему переключение и отсутствие поддержки обоих?

Если мы поддержим оба без предупреждений, то сообщество разделится на то, какой из них использовать. Каждый компонент в npm, который принимает свойство класса, должен будет не забыть пересылать оба. Если даже один компонент в середине не подыгрывать и реализует только одну опору, класс потеряется - или вы рискуете в конечном итоге с classи classNameна дне «согласный» друг с другом, не имея возможности для React разрешить этот конфликт. Поэтому мы думаем, что это было бы хуже, чем статус-кво, и хотим этого избежать.

Так что следите за обновлениями.
Я бы все равно использовал, classNameпока этого ожидает API.


4
Похоже, что это уже не так. См. (Конец): github.com/facebook/react/pull/10169
— machineghost

2
@machineghost # 13525 (сделать переход) был открыт 31 августа 2018 года. С другой стороны, # 10169 был закрыт 4 августа 2017 года. Так что я думаю, что он по-прежнему актуален.
— Maor Refaeli

3
Это не актуально. Они поняли, что classих нельзя использовать во многих выражениях, потому что это ключевое слово.
— Султан

16

Просто чтобы пролить немного больше света на другие уже приведенные хорошие ответы:

Вы заметите, что React использует className вместо традиционного класса DOM. Из документации: «Поскольку JSX - это JavaScript, идентификаторы, такие как class и for, не приветствуются в качестве имен атрибутов XML. Вместо этого компоненты React DOM ожидают имен свойств DOM, таких как className и htmlFor, соответственно».

http://buildwithreact.com/tutorial/jsx

Кроме того, процитирую zpao (участник React / сотрудник facebook)

Наши компоненты DOM используют (в основном) JS API, поэтому мы решили использовать свойства JS (node.className, а не node.class).


8

Документы React рекомендуют использовать cannonical React attributeимена вместо обычного именования Javascript, поэтому даже когда React позволяет передавать атрибуты в DOM, он выдает предупреждение.

Из документов:

Known attributes with a different canonical React name:

    <div tabindex="-1" />
    <div class="hi" />

React 15: Warns and ignores them.
React 16: Warns but converts values to strings and passes them through.
Note: always use the canonical React naming for all supported attributes.

1
Но почему он дает эту рекомендацию?
— Дэвид А. Френч


3

Класс против className в reactJS Класс - это зарезервированное слово или ключевое слово в reactJS, как и функция в javascript. Вот почему мы используем слово «className» для обозначения класса.


2

Команда React не дает реального объяснения этому, но можно предположить, что оно отличается от зарезервированного ключевого слова «класс» в Javascript с момента его появления в ES2015 +.

Даже если вы используете «класс» в конфигурации элемента при создании элемента, это не вызовет никаких ошибок компиляции / рендеринга.


2

В ReactJS мы имеем дело с JSX, а не с HTML, как вы все знаете. JSX хочет, чтобы вы использовали className, потому что это базовый Javascript DOM API! Класс, являющийся зарезервированным ключевым словом в JS, не является основной причиной, по которой мы не используем class, а вместо этого используем className. Это потому, что мы говорим об этом DOM API

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.