React에서 상위 컴포넌트 인스턴스에 액세스할 수 있는 방법이 있습니까?
기능적인 접근법이 아니라는 것을 알고 있습니다.this.parent
React 컴포넌트 인스턴스에서 상위 컴포넌트로 연결되는 속성을 찾을 수 없지만 필요한 경우 커스텀 작업을 수행할 수 있는지 알아보고 있습니다.
React가 기능적인 "방법"이 아니라고 설명하는 데 시간을 낭비하기 전에, 제가 달성하고자 하는 다음과 같은 이유로 이것이 필요하다는 것을 이해하십시오.
렌더링 모델이 상위 구성요소/템플릿을 고려하는 Meteor의 Spacebar 템플릿 엔진용 트랜스필러를 만듭니다.
이를 위해 출력 jsx를 수정하는 트랜스필러를 이미 만들었습니다.나는 이것을 통과함으로써 한다.parent={this}
구성되는 모든 하위 구성 요소에서.다만, 그 후, 추가 전위 변경 없이 상위 컴포넌트 인스턴스에 액세스 할 수 있는 방법을 모르는 것일지도 모른다는 생각이 들었습니다.
어떤 팁이라도 주시면 감사하겠습니다.
자녀로부터 부모의 소품이나 기능에 액세스 할 필요가 있어도 문제 없습니다.
요점은 리액트 내부 API와 문서화되어 있지 않은 API를 사용하면 안 된다는 것입니다.
우선, 이러한 접근법이 변경(코드 위반)될 가능성이 높으며, 무엇보다도 더 깔끔한 접근법이 많이 있습니다.
어린이에게 소품 전달
class Parent extends React.Component {
constructor(props) {
super(props)
this.fn = this.fn.bind(this)
}
fn() {
console.log('parent')
}
render() {
return <Child fn={this.fn} />
}
}
const Child = ({ fn }) => <button onClick={fn}>Click me!</button>
콘텍스트 사용(직접 부모/자녀 관계가 없는 경우)
class Parent extends React.Component {
constructor(props) {
super(props)
this.fn = this.fn.bind(this)
}
getChildContext() {
return {
fn: this.fn,
}
}
fn() {
console.log('parent')
}
render() {
return <Child fn={this.fn} />
}
}
Parent.childContextTypes = {
fn: React.PropTypes.func,
}
const Child = (props, { fn }) => <button onClick={fn}>Click me!</button>
Child.contextTypes = {
fn: React.PropTypes.func,
}
React 0.13 이상용 업데이트
Component._owner
React 0.13에서는 권장되지 않습니다._currentElement
열쇠로서 존재하지 않게 되다this._reactInternalInstance
따라서 아래 솔루션을 사용하여 던집니다.Uncaught TypeError: Cannot read property '_owner' of undefined
.
대안은 React 16에서this._reactInternalFiber._debugOwner.stateNode
.
이 방법은 거의 항상 좋은 방법은 아니라는 것을 이미 알고 계시겠지만, 질문을 잘 읽지 못하는 분들을 위해 다시 한 번 말씀드리지만, 이것은 일반적으로 React에서 작업을 수행하는 부적절한 방법입니다.
퍼블릭 API에는 원하는 것을 얻을 수 있는 것이 없습니다.React internals를 사용하여 이 정보를 얻을 수 있지만 개인 API이기 때문에 언제든지 문제가 발생할 수 있습니다.
반복한다: 이 코드를 어떤 종류의 프로덕션 코드에도 사용하면 안 됩니다.
는 ,, 음, 음, 음, 다, 다, 다, 다를 사용하여 얻을 수 있습니다.this. _reactInternalInstance
이, 을 수 . , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ._currentElement
소유자의 인스턴스(instance)를 클릭합니다._owner._instance
.
다음은 예를 제시하겠습니다.
var Parent = React.createClass({
render() {
return <Child v="test" />;
},
doAThing() {
console.log("I'm the parent, doing a thing.", this.props.testing);
}
});
var Child = React.createClass({
render() {
return <button onClick={this.onClick}>{this.props.v}</button>
},
onClick() {
var parent = this._reactInternalInstance._currentElement._owner._instance;
console.log("parent:", parent);
parent.doAThing();
}
});
ReactDOM.render(<Parent testing={true} />, container);
JSFiddle의 예를 들어보겠습니다.http://jsfiddle.net/BinaryMuse/j8uaq85e/
React 16에서 테스트 완료
저는 비슷한 콘텍스트를 사용하여 장난치고 있었습니다.이 글을 읽는 사람은 거의 없습니다.대부분의 경우 부모에게 접근하지 않는 것이 좋습니다.
사용할 때 항상 표시 목록의 첫 번째 홀더를 참조할 수 있는 홀더를 만들었습니다. 그러니 괜찮으시다면 '부모'입니다.이렇게 생겼죠.
const ParentContext = React.createContext(null);
// function to apply to your react component class
export default function createParentTracker(componentClass){
class Holder extends React.PureComponent {
refToInstance
render(){
return(
<ParentContext.Consumer>
{parent => {
console.log('I am:', this, ' my parent is:',parent ? parent.name : 'null');
return(
<ParentContext.Provider value={this}>
<componentClass ref={inst=>refToInstance=inst} parent={parent} {...this.props} />
</ParentContext.Provider>
)}
}
</ ParentContext.Consumer>
)
}
}
// return wrapped component to be exported in place of yours
return Holder;
}
그런 다음 다음과 같이 내보내면 반응 구성요소를 메서드에 전달합니다.
class MyComponent extends React.Component {
_doSomethingWithParent(){
console.log(this.props.parent); // holder
console.log(this.props.parent.refToInstance); // component
}
}
// export wrapped component instead of your own
export default createParentTracker(MyComponent);
이 방법으로 함수를 내보내는 컴포넌트는 부모 홀더를 지주(또는 계층 위에 아무것도 없는 경우에는 null)로 전달합니다.여기서 refToInstance를 가져올 수 있습니다.그러나 모든 것이 마운트될 때까지 정의되지 않습니다.
언급URL : https://stackoverflow.com/questions/34257665/is-there-any-way-to-access-the-parent-component-instance-in-react
'source' 카테고리의 다른 글
$.ajax가 포함된 쿼리 문자열 대신 JSON을 전송하려면 어떻게 해야 합니까? (0) | 2023.02.13 |
---|---|
잭슨 동적 속성 이름 (0) | 2023.02.13 |
이름/값 구조를 위한 JSON 스키마 작성 방법 (0) | 2023.02.13 |
ngCordova를 사용한 애니메이션 방향 화살표 "주변" 스타일 (0) | 2023.02.13 |
왜 ng-transclude의 범위가 지시문의 범위의 하위 항목이 아닌가? - 지시문에 분리된 범위가 있는 경우? (0) | 2023.02.13 |