React의 이벤트 객체에서 사용자 정의 속성에 액세스하는 방법은 무엇입니까?


214

React는 http://facebook.github.io/react/docs/jsx-gotchas.html에 설명 된대로 사용자 정의 속성을 렌더링 할 수 있습니다 .

사용자 정의 속성을 사용하려면 접두사로 data-를 붙여야합니다.

<div data-custom-attribute="foo" />

그리고 이벤트 객체에서 액세스 할 수있는 방법을 찾을 수 없다는 것을 제외하고는 좋은 소식입니다.

render: function() {
...
<a data-tag={i} style={showStyle} onClick={this.removeTag}></a>
...
removeTag: function(event) {
    this.setState({inputVal: event.target????}); 
},

요소와 data-속성은 html로 잘 렌더링됩니다. 같은 표준 속성에 style액세스 할 수 있습니다 event.target.style. event.target나는 대신에 시도했다 :

 event.target.props.data.tag
 event.target.props.data["tag"]
 event.target.props["data-tag"]  
 event.target.data.tag
 event.target.data["tag"]
 event.target["data-tag"]

이 중 어느 것도 효과가 없었습니다.


1
한 의견이 누군가에게 도움이 될 수 있습니다 .React 16.7 이 저장소 (fe redux)에서만 변경하고 구성 요소에 묶은 경우 React 16.7이 다시 렌더링하지 않고 구성 요소의 사용자 정의 HTML 속성을 업데이트한다는 것을 알았습니다 . 이것은 컴포넌트에 fe가 aria-modal=true있고 변경 사항을 aria / data 속성 저장소로 푸시 하지만 결과 ReactJs가 aria /를 업데이트하지 않기 때문에 컴포넌트의 컨텐츠 또는 클래스 또는 변수와 같은 변경 사항은 없습니다. 해당 구성 요소의 데이터 속성. 나는 그것을 깨닫기 위해 하루 종일 엉망이었습니다.
AlexNikonov

답변:


171

요청한 것과 다른 방식으로 원하는 결과를 얻도록 돕기 위해 :

render: function() {
    ...
    <a data-tag={i} style={showStyle} onClick={this.removeTag.bind(null, i)}></a>
    ...
},
removeTag: function(i) {
    // do whatever
},

를 확인하십시오 bind(). 이것은 모두 자바 스크립트이므로 편리한 작업을 수행 할 수 있습니다. 더 이상 데이터를 추적하기 위해 DOM 노드에 데이터를 첨부 할 필요가 없습니다.

IMO 이것은 DOM 이벤트에 의존하는 것보다 훨씬 깨끗합니다.

2017 년 4 월 업데이트 : 요즘 onClick={() => this.removeTag(i)}대신 쓸 것입니다..bind


17
그러나 더 이상 이벤트 객체가 전달되지 않습니다.
chovy

9
@ chovy 내가 틀렸지 만 모든 자바 스크립트 기능이 본질적으로 가변적이지 않은 경우 나를 수정하십시오. 나는 이것을 테스트하지는 않았지만 "이벤트 객체"가 여전히 전달되고 있다고 가정합니다. 이전과 동일한 매개 변수 색인이 아닙니다. 위에서 설명한 방식으로 바인딩 unshift하는 것은 함수 인수 배열을 사용 하는 것과 같습니다 . "event object"가 index 인 0경우 이제 index 1입니다.
라이더 브룩스

8
@chovy 필요한 경우 할 수 있습니다. 그냥하세요removeTag: function(i, evt) {
Jared Forsyth

8
더 깨끗하지만 많은 바인딩을 수행하면 모든 바인딩에 성능이 저하됩니다.
El Yobo


297

event.target기본 DOM 노드를 제공하면 일반 DOM API를 사용하여 속성에 액세스해야합니다. 이를 수행하는 방법에 대한 문서는 다음과 같습니다 . 데이터 속성 사용 .

event.target.dataset.tag또는 중 하나를 수행 할 수 있습니다 event.target.getAttribute('data-tag'). 어느 쪽이든 작동합니다.


24
반응 0.13.3, IE10 event.target.dataset은 정의되어 있지 않지만 event.target.getAttribute('data-tag')작동합니다. 다른 브라우저는 괜찮습니다. 감사합니다
Andrey Borisko

이 접근 방식에 문제가 있습니까? 예를 들어 사용자가 어떤 버튼을 눌렀는지에 따라 문자열을 함수에 전달하고 싶습니다. 각 구성 요소에서 세 가지 기능을 사용하지 않기를 바랐습니다.
Michael J. Calkins

4
이 답변은 성능 측면에서 허용되는 것보다 낫습니다. 이런 식으로하는 것은 모든 렌더에 새로운 함수를 만들지 않는다는 것을 의미합니다 . 렌더링 할 때마다 새 함수를 만드는 것을 건너 뛸뿐만 아니라 함수 참조가 매번 동일하므로 순수한 (또는 메모 화 된) 구성 요소는 다른 함수로 인식하지 않습니다. 따라서 매번 전체 구성 요소를 불필요하게 다시 렌더링하지는 않습니다. shouldComponentUpdate함수 소품을 완전히 무시하지 않는 한 사용자 정의 구현에서도 동일한 문제가 발생합니다.
Michael Yaworski

완벽하게 정상적으로 작동
Ogbonna 비탈

1
나는 typescript를 사용합니다. 내 경우에는 사용해야했다event.currentTarget.getAttibute('data-tag')
karianpour

50

내가 찾은 가장 좋은 방법은 다음과 같습니다.

var attribute = event.target.attributes.getNamedItem('data-tag').value;

이러한 속성은 "NamedNodeMap"에 저장되며 getNamedItem 메소드로 쉽게 액세스 할 수 있습니다.


4
당신은 아마 .value실제 가치를 얻기 위해 를 추가하고 싶을 것입니다
Wikunia

나는를 추가 할 수있는 답변을 편집 한 .value@Wikunia 제안 것처럼 말을
fguillen

25

또는 클로저를 사용할 수 있습니다.

render: function() {
...
<a data-tag={i} style={showStyle} onClick={this.removeTag(i)}></a>
...
},
removeTag: function (i) {
    return function (e) {
    // and you get both `i` and the event `e`
    }.bind(this) //important to bind function 
}

3
고마워요, 튜더 솔루션을 시험해 보았고 바인딩 없이도 작동합니다. e.target에서 스타일을 전환하는 데 사용했습니다.
andriy_sof

내부 함수에 이벤트 인수가 포함된다는 것을 어떻게 알 수 있습니까?
jack.the.ripper

20
// Method inside the component
userClick(event){
 let tag = event.currentTarget.dataset.tag;
 console.log(tag); // should return Tagvalue
}
// when render element
<a data-tag="TagValue" onClick={this.userClick}>Click me</a>

1
다른 사람이 코드를 이해하도록 코드에 설명을 추가하십시오
Aniruddha Das

8

React v16.1.1 (2017) 기준으로 공식 솔루션은 다음과 같습니다. https://reactjs.org/docs/handling-events.html#passing-arguments-to-event-handlers

TLDR : OP는 다음을 수행해야합니다.

render: function() {
...
<a style={showStyle} onClick={(e) => this.removeTag(i, e)}></a>
...
removeTag: function(i, event) {
    this.setState({inputVal: i}); 
}

1
'i'는 어디에서 왔습니까?
Freshchris 2012

2
iOP가 어떻게 든 전달하려는 맞춤 속성입니다. a요소가 정의 될 때 범위 내에있는 일부 변수입니다 .
tytk

그것은 OP가 원하는 것이 아닙니다. onClick 핸들러를 사용하여 요소 (a)의 속성 값에 액세스하려고합니다.
디자인 : Adrian

1
필자의 요점은 공식 솔루션은 요소에 데이터 속성을 설정하는 대신 범위 내 변수로 이벤트 핸들러 함수를 정의하는 것입니다. 이것이 정말로 원한다면 요소의 속성에 액세스하는 것을 막지는 않지만 React에서 변수에 액세스하는 관용적 방법은 아닙니다.
tytk

8
<div className='btn' onClick={(e) =>
     console.log(e.currentTarget.attributes['tag'].value)}
     tag='bold'>
    <i className='fa fa-bold' />
</div>

그래서 e.currentTarget.attributes['tag'].value나를 위해 작동




3

나는 React에 대해 모른다. 그러나 일반적인 경우 다음과 같은 커스텀 속성을 전달할 수있다 :

1) HTML 태그 안에 data- prefix를 가진 새로운 속성을 정의하십시오.

data-mydatafield = "asdasdasdaad"

2) 자바 스크립트에서 얻을

e.target.attributes.getNamedItem("data-mydatafield").value 

내 말은 계속 null
Si8

3

누군가 React에서 event.target을 사용하려고하고 null 값을 찾으려면 SyntheticEvent가 event.target을 대체했기 때문입니다. SyntheticEvent는 이제 event.currentTarget.getAttribute ( 'data-username')에서와 같이 'currentTarget'을 보유합니다.

https://facebook.github.io/react/docs/events.html

React가 더 많은 브라우저에서 작동하도록하는 것처럼 보입니다. nativeEvent 속성을 통해 이전 속성에 액세스 할 수 있습니다.


3

dom 속성을 지정하는 대신 (느리게) 실제로 핸들러를 만드는 함수에 값을 매개 변수로 전달하십시오.

render: function() {
...
<a style={showStyle} onClick={this.removeTag(i)}></a>
...
removeTag = (customAttribute) => (event) => {
    this.setState({inputVal: customAttribute});
}

좋은 의견처럼 보입니다! 돔 속성 할당이 훨씬 느리다는 것을 어떻게 알 수
있습니까

2

간단하게 event.target.dataset 객체 를 사용할 수 있습니다 . 모든 데이터 속성을 가진 객체를 제공합니다.


0

React에서는 html 데이터가 필요 없으며 함수를 사용하여 다른 함수를 반환하십시오. 이와 같이 매우 간단한 사용자 정의 매개 변수 전송이며 사용자 정의 데이터 및 이벤트에 액세스 할 수 있습니다.

render: function() {
...
<a style={showStyle} onClick={this.removeTag(i)}></a>
...
removeTag: (i) => (event) => {
    this.setState({inputVal: i}); 
},
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.