React 16의 class 대 className


84

React 16이 속성을 DOM으로 전달할 수 있음을 확인했습니다. 따라서 className 대신 'class'를 사용할 수 있습니다.

이전 버전의 React와 역 호환되는 것 외에도 className을 클래스보다 사용하는 것이 장점이 있는지 궁금합니다.


className은 유일하게 지원되는 속성이지만 v16에서는 "다른 표준 React 이름을 가진 알려진 속성"이 변경되었습니다. v15에서는 React가 경고하고 무시하고 v16에서는 경고하지만 값을 문자열로 변환하여 전달합니다. 문서는 "지원되는 모든 속성에 대해 항상 표준 React 이름을 사용하십시오"라는 질문에 대한 명확한 답변을 제공합니다. reactjs.org/blog/2017/09/08/…
lifeisfoo

답변:


107

class는 javascript의 키워드이고 JSX는 javascript의 확장입니다. 즉 사용 반작용 왜 주요 이유 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.


안녕, 설탄. 대답을 좀 더 설명해 주시겠습니까? 클래스가 자바 스크립트의 키워드 인 이유는 무엇입니까?
데이비드 A. 프랑스어

1
@ DavidA.French 확장 답변. 다른 답변도 참조하십시오.
Sulthan

1
Sulthan 대단히 감사합니다! 매우 도움이되었습니다.
데이비드 A. 프랑스어

2
props.class = 'css' 이것은 완전히 유효합니다
daGo

31

React 팀은 실제로 다가오는 미래 ( source ) class 대신 다음 으로 전환 할 것입니다 .className

  • classNameclass( # 4331 , 아래 # 13525 (주석) 참조). 이것은 수없이 제안되었습니다. 우리는 이미 React 16의 DOM 노드에 클래스를 전달하는 것을 허용하고 있습니다. 이것이 생성하는 혼란은 보호하려는 구문 제한의 가치가 없습니다.

전환하고 둘 다 지원하지 않는 이유는 무엇입니까?

경고없이 두 가지를 모두 지원하면 커뮤니티가 어느 것을 사용할지 분할됩니다. class prop을받는 npm의 각 구성 요소는 둘 다 전달해야합니다. 중간에 심지어 하나의 구성 요소가 하나 개의 소품을 연주하고 구현하지 않는 경우, 클래스는 분실 - 또는 당신과 함께 끝나는 위험이 classclassName그 충돌을 해결에 반응위한 방법으로, 서로 "의견이 맞지"아래에. 그래서 우리는 그것이 현상 유지보다 더 나쁠 것이라고 생각하고 이것을 피하고 싶습니다.

따라서 계속 지켜봐주십시오. 이것이 API가 기대하는 한
계속 사용할 것 className입니다.


4
더 이상 그렇지 않은 것 같습니다. 참조 (끝) : github.com/facebook/react/pull/10169
machineghost

2
@machineghost # 13525 (전환 만들기)는 2018 년 8 월 31 일에 열렸습니다. 반면 # 10169는 2017 년 8 월 4 일에 닫혔습니다. 그래서 여전히 관련성이 있다고 생각합니다.
Maor Refaeli

3
관련이 없습니다. 그들은 class키워드이기 때문에 많은 표현에서 사용할 수 없다는 것을 깨달았습니다 .
Sulthan

16

이미 주어진 다른 좋은 답변들 위에 조금 더 빛을 비추기 위해 :

React가 전통적인 DOM 클래스 대신 className을 사용한다는 것을 알 수 있습니다. 문서에서 "JSX는 JavaScript이므로 class 및 for와 같은 식별자는 XML 속성 이름으로 사용하지 않는 것이 좋습니다. 대신 React DOM 구성 요소는 각각 className 및 htmlFor와 같은 DOM 속성 이름을 기대합니다."

http://buildwithreact.com/tutorial/jsx

또한 zpao (React 기여자 / 페이스 북 직원) 를 인용합니다.

DOM 구성 요소는 (대부분) JS API를 사용하므로 JS 속성 (node.class가 아닌 node.className)을 사용하도록 선택했습니다.


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
그래도 왜 이렇게 추천합니까?
데이비드 A. 프랑스어


3

reactJS의 클래스 대 className 클래스는 자바 스크립트에있는 함수만큼 reactJS의 예약어 또는 키워드입니다. 이것이 클래스를 지칭하기 위해 "className"이라는 단어를 사용하는 이유입니다.


2

이에 대한 React 팀의 실제 설명은 없지만 ES2015 +에 도입 된 이후 Javascript의 예약어 "class"와 구별되는 것으로 가정합니다.

요소를 생성하는 동안 요소 구성에서 "클래스"를 사용하더라도 컴파일 / 렌더링 오류가 발생하지 않습니다.


2

ReactJS에서 우리는 모두 알고 있듯이 HTML이 아닌 JSX를 다루고 있습니다. JSX는 기본 자바 스크립트 DOM API이기 때문에 className을 사용하기를 원합니다! 클래스가 JS에서 예약 된 키워드 인 것은 우리가 className을 사용하지 않고 대신 클래스를 사용하는 주된 이유가 아닙니다. DOM API를 참조하기 때문입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.