화살표 함수() => {}를 사용하여 이를 올바르게 바인딩합니다.
8275 단어 beginnersjavascriptwebdev
this.props
isundefined
in a callback but I know that it does have a value in my component!
이게 뭔가요 ?
이것이 쉽게 발생할 수 있는 경우의 예를 살펴보겠습니다. 다음은 클릭 이벤트 리스너를 추가한 aBar Chart에 대한 코드 섹션입니다.
이 예제는 React로 작성되었지만 Angular, Typescript 및 모든 클래스 기반 코드에서 동일한 경험을 할 것입니다.
class ChartExample extends Component {
constructor(props) {
super(props);
this.state = {
options: {
series: [
{
listeners: {
nodeClick: function (event) {
// Do something with our props
console.log("Props are:", this.props)
},
},
},
],
},
};
}
render() {
return (
<div className="wrapper">
<AgChartsReact options={this.state.options} />
</div>
);
}
}
render(<ChartExample test={'Test Value'} />, document.querySelector('#root'));
이 코드의 핵심 부분은 리스너를 정의하는 다음 섹션입니다.
listeners:
{
nodeClick: function (event) {
// Do something with our props
console.log("Props are:", this.props)
}
}
구성 요소가
props
를 수신하면 콘솔에 기록될 것으로 예상됩니다. 그러나 노드를 클릭하면 위의 코드 로그undefined
가 기록됩니다. 이Plunker에서 직접 확인할 수 있습니다.화살표 기능 수정
순전히 구문 변경처럼 보이는 것을 만들고 함수 정의를 동등한 화살표 형식으로 바꾼 다음 다시 시도하면 갑자기 소품이 콘솔에 올바르게 기록됩니다! 업데이트됨Plunker
listeners: {
nodeClick: (event) => {
// props are defined
console.log("Props are:", this.props)
},
},
여기서 무슨 일이 일어나고 있으며 구문
(event) => {}
을 사용하면 갑자기 this.props
가 올바른 값을 갖게 되는 이유는 무엇입니까!?이 화살표 기능 바인딩
이것이 작동하는 이유에 대한 짧은 대답은 기본적으로 화살표 함수가 주변 범위의 값에 바인딩
this
하기 때문입니다. 따라서 우리의 예에서 this
는 this.props
가 올바르게 정의됨을 의미하는 구성 요소 클래스에 올바르게 바인딩됩니다. 표준function
을 사용할 때 정의this
는 구성 요소에 바인딩되지 않고 대신 이벤트가 발생한 클래스의 값을 갖습니다.이 주제에 대해 더 깊이 알고 싶다면 Understanding Arrow Functions in JavaScript을 추천합니다.
바인드를 사용한 대체 수정
콜백을 정의할 때 이것을 명시적으로 바인딩하여 원래 코드를 수정할 수도 있다는 점을 언급할 가치가 있습니다.
listeners: {
nodeClick: function (event) {
console.log("Props are:", this)
}.bind(this),
},
결론
this.props
또는 그 문제에 대해 this.anyClassProp
가 특정 값을 포함할 것으로 예상할 때 정의되지 않았다는 사실에 놀랐다면 this
를 사용하고 있는 컨텍스트를 확인할 수 있습니다. 단순히 함수 정의를 화살표 함수로 업데이트하면 문제가 해결될 수 있습니다.이러한 문제의 결과로 사용자의 혼란을 피하기 위해 기본적으로 화살표 기능을 사용하도록 모든 AG Grid 예제를 크게 업데이트했습니다.
Reference
이 문제에 관하여(화살표 함수() => {}를 사용하여 이를 올바르게 바인딩합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/scooperdev/use-arrow-function-to-correctly-binds-this-1dnp텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)