클래스 기반 컴포넌트에서 React.forwardRef를 사용하는 방법
React.forwardRef를 사용하려고 하는데 클래스 기반 컴포넌트(HOC가 아닌)에서 작동하는 방법을 고민하고 있습니다.
문서 예제에서는 요소 및 기능 구성 요소를 사용하며, 심지어 상위 구성 요소에 대한 함수 클래스를 래핑합니다.
그래서 이런 거부터 시작해서ref.js
파일:
const TextInput = React.forwardRef(
(props, ref) => (<input type="text" placeholder="Hello World" ref={ref} />)
);
대신 다음과 같이 정의합니다.
class TextInput extends React.Component {
render() {
let { props, ref } = React.forwardRef((props, ref) => ({ props, ref }));
return <input type="text" placeholder="Hello World" ref={ref} />;
}
}
또는
class TextInput extends React.Component {
render() {
return (
React.forwardRef((props, ref) => (<input type="text" placeholder="Hello World" ref={ref} />))
);
}
}
동작만 :/
그리고, 나도 알아, 심판은 반응하는 방식이 아니야.서드파티 캔버스 라이브러리를 사용하려고 하는데, 일부 툴을 다른 컴포넌트에 추가하고 싶기 때문에 이벤트 청취자가 필요하기 때문에 라이프 사이클 방법이 필요합니다.나중에 다른 길로 갈 수도 있지만, 저는 이것을 시도해 보고 싶습니다.
의사 선생님이 가능하대요!
참조 전달은 DOM 컴포넌트에 한정되지 않습니다.클래스 컴포넌트 인스턴스에도 참조를 전달할 수 있습니다.
를 참조해 주세요.
그러나 그 후에는 클래스뿐만 아니라 HOC를 사용합니다.
항상 같은 소품을 사용하여ref
는 도우미를 사용하여 클래스 내보내기를 프록시함으로써 실행할 수 있습니다.
class ElemComponent extends Component {
render() {
return (
<div ref={this.props.innerRef}>
Div has a ref
</div>
)
}
}
export default React.forwardRef((props, ref) => <ElemComponent
innerRef={ref} {...props}
/>);
따라서 기본적으로는 참조를 전달하기 위해 다른 소품을 사용해야 하지만 허브 아래에서 수행할 수 있습니다.일반인들이 그것을 일반 심판으로 사용하는 것이 중요하다.
class BeautifulInput extends React.Component {
const { innerRef, ...props } = this.props;
render() (
return (
<div style={{backgroundColor: "blue"}}>
<input ref={innerRef} {...props} />
</div>
)
)
}
const BeautifulInputForwardingRef = React.forwardRef((props, ref) => (
<BeautifulInput {...props} innerRef={ref}/>
));
const App = () => (
<BeautifulInputForwardingRef ref={ref => ref && ref.focus()} />
)
참조를 클래스로 전달하려면 다른 소품 이름을 사용해야 합니다. innerRef
는 많은 라이브러리에서 일반적으로 사용됩니다.
기본적으로 이것은 HOC 기능일 뿐입니다.수업에서 사용하고 싶다면, 혼자서 할 수 있고, 일반 소품을 사용할 수 있습니다.
class TextInput extends React.Component {
render() {
<input ref={this.props.forwardRef} />
}
}
const ref = React.createRef();
<TextInput forwardRef={ref} />
이 패턴은 예를 들어 에서 사용됩니다.styled-components
라고 합니다.innerRef
거기.
이것은, 다음의 경우에 고차 컴포넌트를 사용해 실시할 수 있습니다.
import React, { forwardRef } from 'react'
const withForwardedRef = Comp => {
const handle = (props, ref) =>
<Comp {...props} forwardedRef={ref} />
const name = Comp.displayName || Comp.name
handle.displayName = `withForwardedRef(${name})`
return forwardRef(handle)
}
export default withForwardedRef
다음으로 컴포넌트 파일에서 다음을 수행합니다.
class Boop extends React.Component {
render() {
const { forwardedRef } = this.props
return (
<div ref={forwardedRef} />
)
}
}
export default withForwardedRef(Boop)
테스트로 작업을 먼저 하고 패키지도 발행했습니다.react-with-forwarded-ref
: https://www.npmjs.com/package/react-with-forwarded-ref
이 기능을 여러 가지 다른 컴포넌트에서 재사용해야 하는 경우 다음과 같은 방법으로 내보낼 수 있습니다.withForwardingRef
const withForwardingRef = <Props extends {[_: string]: any}>(BaseComponent: React.ReactType<Props>) =>
React.forwardRef((props, ref) => <BaseComponent {...props} forwardedRef={ref} />);
export default withForwardingRef;
사용방법:
const Comp = ({forwardedRef}) => (
<input ref={forwardedRef} />
)
const EnhanceComponent = withForwardingRef<Props>(Comp); // Now Comp has a prop called forwardedRef
아직 결합하는데 어려움을 겪고 있는 사람이 있다면React.forwardRef()
리액트 리듀스와 같은 HOC를 사용하여connect()
이렇게 작동하게 된 거죠
export default connect(mapStateToProps, mapDispatchToProps)(
React.forwardRef((props, ref) => <MyComponent innerRef={ref} {...props} />)
);
언급URL : https://stackoverflow.com/questions/51526461/how-to-use-react-forwardref-in-a-class-based-component
'programing' 카테고리의 다른 글
도커 컨테이너에서 mongodb 쉘을 시작하는 방법은 무엇입니까? (0) | 2023.02.25 |
---|---|
각도와 동일한 각도는 무엇입니까?JS $watch? (0) | 2023.02.25 |
TypeScript에서 문자열 유형 배열 테스트 (0) | 2023.02.25 |
'Access-Control-Allow-Origin' 헤더는 여러 값 '*, *'을 포함하지만 하나만 허용됩니다. (0) | 2023.02.25 |
MongoDB: '_id'가 아닌 'id' 출력 (0) | 2023.02.25 |