현재 위치 - 회사기업대전 - 정보 컨설팅 - React 의 여러 구성 요소 통신 방법에 대한 자세한 설명

React 의 여러 구성 요소 통신 방법에 대한 자세한 설명

순서

React 를 처음 시작하면 React 의 단방향 데이터 흐름 특성으로 인해 구성 요소 간 통신에 문제가 발생할 수 있습니다. 다음 문장 에서 자세한 소개 를 해 드릴 것 입니다. 시작하기 전에 먼저 그림 을 한 장 보세요.

반응 구성 요소 통신

구성 요소 간 통신이 필요한 몇 가지 상황.

모 어셈블리와 자 어셈블리가 통신합니다.

서브어셈블리는 모 피쳐 어셈블리와 통신합니다.

크로스 레벨 구성 요소 통신

중첩된 관계가 없는 구성 요소 간의 통신입니다.

1. 모 피쳐 어셈블리와 자 피쳐 간의 통신.

도달 데이터 흐름은 단방향이며 모 어셈블리와 자 어셈블리 간의 통신도 가장 일반적입니다. 모 피쳐 어셈블리는 props 를 통해 필요한 정보를 서브어셈블리에 전달합니다.

Child.jsx

"React" 에서 react 가져오기

Prop-types 에서 PropTypes 가져오기

기본 함수 1 차 하위 구성요소 ({name }) {

Return & lth1> 안녕하세요, {name}</h1> 을 눌러 섹션을 인쇄할 수도 있습니다

}

Child.propTypes = {

Name:prop types. string. is 가 필요합니다.

}

Parent.jsx

"React" 에서 react, {Component };;

' 에서 1 차 하위 구성요소를 가져옵니다. /child';

클래스 상위 확장 구성 요소 {

Render() {

반환 (

& ltdiv & gt

& ltchild name = "Sara "/& gt;;

& lt/div & gt;;

);

}

}

기본 상위 내보내기 :

2. 서브어셈블리가 모 피쳐 어셈블리와 통신합니다.

콜백 함수 사용

사용자 정의 이벤트 메커니즘 사용

콜백 기능

구현은 하위 구성 요소에서 구성 요소 숨기기 버튼을 클릭하여 자신의 기능을 숨길 수 있습니다.

List3.jsx

"React" 에서 react, {Component };;

Prop-types 에서 PropTypes 가져오기

범주 목록 3 확장 구성 요소 {

정적 속성 유형 = {

Hideconponent: proptypes.func.is 가 필요합니다.

}

Render() {

반환 (

& ltdiv & gt

하하, 저는 목록 3 입니다

& ltbuttononclick = {this.props.hideconfonent} > List3 구성 요소 숨기기

& lt/div & gt;;

);

}

}

기본 목록 3 내보내기

응용 프로그램, jsx

"React" 에서 react, {Component };;

' 에서 목록 3 을 가져옵니다. /components/list3';

기본 클래스 응용 프로그램 확장 구성 요소 내보내기 {

생성자 (... args) {

슈퍼 (... args);

This.state = {

IsShowList3: 거짓,

}

}

Show component =()= & gt;; {

This.setState({

IsShowList3: 네,

});

}

Hideconfonent =()= & gt;; {

This.setState({

IsShowList3: 거짓,

});

}

Render() {

반환 (

& ltdiv & gt

& ltbuttononclick = {this.show component} > 표시 목록 구성 요소

{

This.state.isShowList3?

& ltlist3 hideconfonent = {this.hideconfonent}/>

다음 중 하나를 수행합니다.

비어 있습니다

}

& lt/div & gt;;

);

}

}

구현 방법을 살펴보면 콜백 함수가 내부 상태를 변환하는 전통적인 함수이기 때문에 일반적으로 setState 및 콜백 함수가 쌍으로 나타나는 기존 콜백 함수와 동일하다는 것을 알 수 있습니다.

3. 크로스 레벨 구성 요소 통신

레이어 구성요소는 소품을 통과합니다.

예를 들어 어셈블리 a 와 어셈블리 b 간에 통신하려면 먼저 어셈블리 a 와 어셈블리 b 의 모 피쳐 어셈블리를 찾아야 합니다. A 는 먼저 c 구성 요소와 통신하고 c 구성 요소는 props 및 b 구성 요소를 통해 통신합니다. 이때 구성 요소 C 가 미들웨어의 역할을 합니다.

컨텍스트 사용

Context 는 어디에서나 액세스할 수 있는 큰 컨테이너처럼 전역 변수입니다. 우리는 소통할 정보를 문맥에 두고 다른 구성 요소에서 자유롭게 얻을 수 있다.

그러나 React 당국은 대량의 컨텍스트를 사용하는 것을 권장하지 않는다. 레이어 전달을 줄일 수는 있지만 구성 요소 구조가 복잡할 때 컨텍스트가 어디서 왔는지 알 수 없습니다. 그리고 문맥은 글로벌 변수이며, 응용혼란을 초래한 주범이다.

컨텍스트 사용

다음 예제의 구성 요소 관계: ListItem 은 List 의 하위 구성 요소이고 List 는 app 의 하위 구성 요소입니다.

ListItem.jsx

"React" 에서 react, {Component };;

Prop-types 에서 PropTypes 가져오기

클래스 ListItem 확장 구성 요소 {

//서브어셈블리는 컨텍스트를 사용할 것이라고 선언합니다.

정적 컨텍스트 유형 = {

Color: PropTypes.string,

}

정적 속성 유형 = {

값: PropTypes.string,

}

Render() {

Const {value} = this.props

반환 (

& lt 리 스타일 = {{background: this.context.color}} >

& ltspan & gt{ value} & lt/span>.

& lt/ 리>

);

}

}

기본 목록 항목 내보내기

List.jsx

' 에서 ListItem 을 가져옵니다. /listitem';

범주 목록 확장 구성 요소 {

//부모 구성 요소는 컨텍스트를 지원한다고 선언합니다.

정적 childContextTypes = {

Color: PropTypes.string,

}

정적 속성 유형 = {

목록: prop types.array,

}

//제공 함수는 해당 컨텍스트 객체를 반환합니다.

GetChildContext() {

반환 {

색상:' 빨강',

}

}

Render() {

Const {list} = this.props

반환 (

& ltdiv & gt

& ltul & gt

{

List.map((entry, index)= & gt;;

& ltlistitemkey = {`list-$ {index} `} value = {entry.text}/> 그리고,

) 을 참조하십시오

}

& lt/ul & gt;;

& lt/div & gt;;

);

}

}

기본 목록 내보내기

App.jsx

"React" 에서 react, {Component };;

' 에서 목록을 가져옵니다. /구성 요소/목록';

상수 목록 = [

{

텍스트: "테마 1",

},

{

텍스트: 주제 2,

},

];

기본 클래스 응용 프로그램 확장 구성 요소 내보내기 {

Render() {

반환 (

& ltdiv & gt

& lt 디렉토리

List={list}

/>

& lt/div & gt;;

);

}

}

4. 중첩 관계가없는 구성 요소 통신

사용자 정의 이벤트 메커니즘 사용

ComponentDidMount 이벤트에서 구성 요소 설치가 완료되면 이벤트에 가입합니다. 구성 요소를 제거할 때 componentWillUnmount 이벤트의 이벤트 가입을 취소합니다.

일반적인 게시/가입 모드를 예로 들면 브라우저 버전의 Node.js 이벤트 모듈을 사용하여 구현됩니다.

사용자 정의 이벤트 사용.

다음 예제의 구성 요소 관계: 목록1및 목록 2 는 중첩된 관계가 없고 App 는 상위 구성 요소입니다.

목록 2 의 버튼 중 하나를 클릭하여 목록1의 정보 표시를 변경하는 기능을 구현합니다.

먼저 프로젝트에 이벤트 패키지를 설치해야 합니다.

Npm 설치 이벤트-저장

Src 아래에 새 util 디렉토리를 만들고 그 안에 events.js 를 구성합니다.

[이벤트] 에서 {eventemitter};

기본 새 eventemitter () 내보내기;

목록1.jsx

"React" 에서 react, {Component };;

방사체 가져오기' ../util/events' 에서

범주 목록 확장 구성 요소 {

시공사 {

슈퍼 (소품);

This.state = {

메시지: "목록 1",

}

}

Componentidmount(){

//구성 요소가 로드된 후 사용자 정의 이벤트를 선언합니다.

This.eventemitter = emitter.addlistener ('changemessage', (message)= & gt;; {

This.setState({

뉴스,

});

});

}

ComponentWillUnmount() {

Emitter.removelistener (this.eventemitter);

}

Render() {

반환 (

& ltdiv & gt

{this.state.message}

& lt/div & gt;;

);

}

}

기본 목록 내보내기

List2.jsx

"React" 에서 react, {Component };;

방사체 가져오기' ../util/events' 에서

범주 목록 2 확장 구성 요소 {

Handleclick = (message) = > {

Emitter.emit('changeMessage', message);

}

Render() {

반환 (

& ltdiv & gt

& ltbuttononclick = {this.handleclick.bind (this,' list2')} > List 1 구성 요소에 표시되는 정보를 변경하려면 I 를 클릭합니다

& lt/div & gt;;

);

}

}

APP.jsx

"React" 에서 react, {Component };;

목록 1 을 (를)' 에서 가져옵니다. /components/list1';

' 에서 목록 2 를 가져옵니다. /components/list2';

기본 클래스 응용 프로그램 확장 구성 요소 내보내기 {

Render() {

반환 (

& ltdiv & gt

& ltList 1/>

& ltList2/>

& lt/div & gt;;

);

}

}

사용자 정의 이벤트는 일반적인 게시-가입 모드이며 구성 요소 간 통신은 이벤트 객체에 리스너를 추가하고 이벤트를 트리거하여 수행됩니다.

요약

모 어셈블리와 자 피쳐 간의 통신: props

하위 구성 요소와 상위 구성 요소 간의 통신: 콜백 함수/사용자 정의 이벤트

계층 간 구성 요소 통신: 계층 구성 요소별로 props/context 전달

중첩된 관계가 없는 구성 요소 간 통신: 사용자 정의 이벤트

구성 요소와 통신할 때 주로 비즈니스의 구체적인 요구 사항에 따라 가장 적합한 것을 선택합니다.

비즈니스 논리가 어느 정도 복잡할 경우 Mobx, Redux 등의 상태 관리 도구를 도입하는 것을 고려해 볼 수 있습니다.

요약

copyright 2024회사기업대전