이벤트 핸들러의 React 구성 요소에 대한 참조 가져오기
이벤트 핸들러를 React 컴포넌트에 연결할 수 있습니다.이벤트 핸들러 내부에서 이 컴포넌트를 참조할 수 있는 방법이 있습니까?
var Foobar = React.createClass({
action: function () {
// ...
},
render: function () {
var child = React.Children.only(this.props.children),
props = _.omit(this.props, 'children');
return React.addons.cloneWithProps(child, props);
}
});
var App = React.createClass({
handleMouseEnter: function (event) {
// How to get reference to Foobar without using this.refs['foo']?
// I need to call *action* on it.
},
render: function () {
return (
<div>
<Foobar ref="foo" onMouseEnter={this.handleMouseEnter}>
...
</Foobar>
</div>
);
}
});
저는 vbarosh가 하는 질문을 이해하거나 적어도 저를 이 게시물로 이끈 비슷한 질문을 가지고 있다고 생각합니다.그래서 만약 이것이 원래의 질문에 답하지 않는다면 이곳에 도착한 다른 사람들에게 도움이 될 수 있기를 바란다.
이 경우 UI 작업에 대한 구성 옵션을 정의하기 위한 n개의 자식 수를 가진 React 구성 요소가 있습니다.자녀마다 입력이 나타내는 구성 옵션을 식별하는 참조가 다릅니다.그러면 자녀 컴포넌트에 공개되어 있는 메서드를 호출할 수 있도록 직접 참조에 액세스 할 수 있게 됩니다.(데이터 속성을 공개하고 jQuery를 사용하여 추출할 수 있지만, 이것은 많은 추가 홉과 퍼포먼스 문제인 것 같습니다.)
제 첫 번째 시도는 이렇습니다.
...
<Config ref="showDetails" onChange={this.handleChange} />
<Config ref="showAvatar" onChange={this.handleChange} />
...
모든 변경 이벤트를 단일 핸들러에 바인드한 후 이벤트를 디스패치한 타깃에서 ref를 추출하는 것이 이상적입니다.아쉽게도 파견된 사람은SyntheticEvent
타겟의 참조를 취득할 수 없기 때문에, 직접 콜을 발신할 수 없습니다.this.ref[name].methodIWantToCall()
.
React 문서에 있는 다음 문서에서 해결책을 찾을 수 있었습니다.
https://facebook.github.io/react/tips/communicate-between-components.html
JavaScript 바인딩을 활용하여 추가 인수를 전달할 수 있습니다.
...
<Config ref="showDetails" onChange={this.handleChange.bind(this, 'showDetails')} />
...
이제 핸들러에서 추가 데이터를 가져와 참조에 액세스할 수 있습니다.
handleChange: function(refName, event) {
this.refs[refName].myMethodIWantToCall()
}
문제는 바인딩 시 인수 순서가 변경되고 첫 번째 인수가 전달된 바인딩 값이고 이벤트가 두 번째 인수가 된다는 것입니다.도움이 됐으면 좋겠네요!
다음과 같이 핸들러를 자녀 컴포넌트의 루트 요소로 전파해야 합니다.
var Foobar = React.createClass({
action: function (e) {
this.props.onClick(this);
},
render: function () {
return <div onClick={this.action}>{this.props.children}</div>;
}
});
var App = React.createClass({
handleMouseEnter: function (foobar) {
console.log(foobar);
},
render: function () {
return (
<Foobar ref="foo" onClick={this.handleMouseEnter} />
);
}
});
handleMouseEnter
(및 onClick이 Foobar에 전달된 핸들러라는 설명)는 기본적으로 React에 의해 자동으로 바인드됩니다.App
두 경우 모두 인스턴스입니다.
이 점을 염두에 두고this.refs.foo
또는this.refs['foo']
설명하신 문맥에서 올바르게 동작해야 하며 올바른 접근법이 될 것입니다.
앱에서 핸들러를 유지해야 하는 설득력 있는 이유가 없다고 가정할 때 보다 깔끔한 해결책은 다음과 같이 핸들러를 Foobar에 완전히 포함시키는 것입니다.
var Foobar = React.createClass({
action: function () {
// ...
},
render: function () {
var child = React.Children.only(this.props.children),
props = _.omit(this.props, 'children');
return (
<div onClick={this.action} onMouseEnter={this.action}>
React.addons.cloneWithProps(child, props);
</div>
);
}
});
var App = React.createClass({
render: function () {
return (
<Foobar />
);
}
});
할 수 .addEventListener
.
스크롤 이벤트를 사용한 예는 다음과 같습니다.
componentDidMount() {
document.getElementById('theElementId').addEventListener('scroll', (e) => {
this.handleScroll(e, this);
});
}
handleScroll(event, _self) {
// Now you can access to the element using the param _self
}
render() {
return (
<div id="theElementId"></div>
)
}
하나의 은 바인드 하여 ''의 입니다.★★★★★★★★★★★★★★★★★★★★★★★★★★,this
:
componentDidMount() {
document.getElementById('theElementId').addEventListener('scroll', this.handleScroll.bind(this));
}
handleScroll(event) {
// Now you can access to the element using the param this
}
앱 컴포넌트를 보면 다음과 같은 것을 시도해 볼 수 있습니다.
var App = React.createClass({
handleMouseEnter: function (event) {
// reference it by using: this.refs[event._targetInst._currentElement.ref]
// same result as calling: this.refs.foo
console.log(this.refs[event._targetInst._currentElement.ref])
},
render: function () {
return (
<div>
<Foobar ref="foo" onMouseEnter={this.handleMouseEnter}>
...
</Foobar>
</div>
);
}
});
이게 도움이 됐으면 좋겠다.또한 리액트 컴포넌트를 ES6 방식으로 기술/삭제하고 있습니다.이 방법은 "this"의 동작도 조금 변화시킵니다.이게 여기서도 영향을 미칠지 모르겠네요.
언급URL : https://stackoverflow.com/questions/28049603/get-reference-to-react-component-in-event-handler
'programing' 카테고리의 다른 글
AngularJs ng클릭으로 다른 페이지로 이동(Ionic 프레임워크 사용) (0) | 2023.03.16 |
---|---|
웹 팩 빌드 vs 리액트 스크립트 빌드 (0) | 2023.03.16 |
심플하고 안전한 API 인증 시스템 (0) | 2023.03.16 |
Spring 4.1까지 사용 중인 Jackson Object Mapper를 입수하려면 어떻게 해야 합니까? (0) | 2023.03.16 |
spring-boot에서 swagger-ui를 완전히 비활성화하는 방법(/swagger-ui.html은 404를 반환해야 함 (0) | 2023.03.16 |