Back to Question Center
0

고차원 구성 요소 : 반응 설계 패턴            고차원 구성 요소 : 반응 애플리케이션 디자인 패턴 관련 서멀 : ES6AngularJSAjaxReactjQueryMore ... 스폰서

1 answers:
고등 구성 요소 : 반응 응용 디자인 패턴

이 기사는 게스트 저자 에 의해 잭 프랭클린 . SitePoint 게스트 글은 JavaScript 커뮤니티의 저명한 작가 및 연사가 제공하는 매력적인 컨텐츠를 제공하는 것을 목표로합니다

이 기사에서는 고급 구성 요소를 사용하여 Semalt 응용 프로그램을 깔끔하고 잘 구조화되어 유지 관리하기 쉽게 유지하는 방법에 대해 설명합니다. 우리는 순수 함수가 코드를 깨끗하게 유지하는 방법과 이러한 똑같은 원리가 Semalt 구성 요소에 어떻게 적용될 수 있는지에 대해 논의 할 것입니다.

순수 함수

함수는 다음 속성을 준수하면 순수하다고 간주됩니다 - aluminum bar height tables.

  • 다루는 모든 데이터는 인수로 선언됩니다
  • 그것은 주어진 데이터 나 다른 데이터를 변형시키지 않는다 (이것들은 부작용 이라고도한다)
  • 같은 입력이 주어지면 항상 동일한 출력을 반환합니다 .

예를 들어, 아래의 덧셈 함수는 순수하다.

     function add (x, y) {x + y를 반환;}    

그러나 아래의 함수 badAdd 는 불순합니다 :

     var y = 2;function badAdd (x) {x + y를 반환;}    

이 함수는 직접적으로 제공되지 않은 데이터를 참조하기 때문에 순수하지 않습니다. 결과적으로 동일한 입력으로이 함수를 호출하고 다른 출력을 얻을 수 있습니다.

     var y = 2;badAdd  
// 5y = 3;badAdd
// 6

순수 함수에 대해 더 자세히 읽으려면 Mark Brown이 "합리적으로 순수 프로그래밍에 대한 소개"를 읽을 수 있습니다.

셈 르트 퓨어 함수는 매우 유용하며 응용 프로그램을 디버깅하고 테스트하는 것이 훨씬 쉽습니다. 때때로 부작용이있는 불순한 함수를 작성하거나 직접 액세스 할 수없는 기존 함수의 동작을 수정해야합니다. (예 : 라이브러리의 함수). 이것을 가능하게하려면 고차 함수를 살펴 봐야합니다.

고차 함수

고차 함수는 호출 될 때 다른 함수를 반환하는 함수입니다. Semalt 함수는 인수로 함수를 취하지 만, 함수가 고차원으로 간주 될 필요는 없습니다.

위에서 add 함수를 가지고 있다고 가정하고 결과를 반환하기 전에 결과를 콘솔에 기록하도록 코드를 작성하려고합니다. add 함수를 편집 할 수 없기 때문에 새로운 함수를 만들 수 있습니다 :

     function addAndLog (x, y) {var result = add (x, y);콘솔. 로그 ( '결과', 결과);반환 결과;}    

함수의 로깅 결과가 유용하다고 판단하고 이제는 빼기 함수를 사용하여 동일한 작업을 수행하려고합니다. 위의 내용을 복제하기보다는 함수를 취하여 주어진 함수를 호출하고 결과를 반환하기 전에 새로운 함수를 반환하는 고차 함수 를 작성할 수 있습니다.

     function logAndReturn (func) {return function    {var args = Array. 원기. 일부분. 전화 (인수);var result = func. apply (null, args);콘솔. 로그 ( '결과', 결과);반환 결과;}}    

이제이 함수를 사용하여 add 를 뺄셈 에 로깅을 추가 할 수 있습니다.

     var addAndLog = logAndReturn (add);addAndLog (4, 4) // 8이 반환되고 '결과 8'이 기록됩니다.var subtractAndLog = logAndReturn (빼기);subtractAndLog (4, 3) // 1이 반환되고 '결과 1'이 기록됩니다.    
logAndReturn 은 함수를 인수로 취하고 호출 할 수있는 새 함수를 반환하기 때문에 HOF입니다. 이것은 동작에서 변경할 수없는 기존 함수를 래핑하는 데 정말 유용합니다. 이에 대한 자세한 내용은 M을 확인하십시오.

또한 Semalt는이 코드를 보여줍니다.

고차 부품

Semalt 땅으로 이동하면서, 우리는 기존의 Semalt 구 성요소를 취하여 그들에게 몇 가지 특별한 행동을주기 위해 위와 같은 논리를 사용할 수있다.

이 섹션에서는 React를위한 사실상의 라우팅 솔루션 인 React Router를 사용할 것이다. 라이브러리를 시작하려면 GitHub에서 React Router Tutorial을 적극 권장합니다.

리액터 라우터의 링크 구성 요소

React Router는 React 어플리케이션의 페이지를 연결하는 데 사용되는 구성 요소를 제공합니다. 이 구성 요소가 취하는 속성 중 하나는 activeClassName 입니다. 에이 속성이 있고 링크가 가리키는 URL에 사용자가 현재 활성 상태 인 경우 개발자에게이 클래스가 주어져 개발자가 스타일을 지정할 수 있습니다.

이것은 매우 유용한 기능입니다. 우리가 가정 한 응용 프로그램에서 우리는 항상이 속성을 사용하기로 결정합니다. 그러나 이렇게하면 우리는 이것이 우리의 모든 구성 요소를 매우 장황하게 만든다는 것을 빨리 발견하게됩니다 :

      정보  담당자     

매번 클래스 이름 속성을 반복해야한다는 것을 의미합니다. 이렇게하면 구성 요소가 장황해질뿐 아니라 클래스 이름을 변경하기로 결정하면 많은 장소에서 수행해야합니다.

대신 구성 요소를 래핑하는 구성 요소를 작성할 수 있습니다.

     var AppLink = 반응. createClass ({render : function    {돌아온 ({이. 소품. 어린이};);}});    

이제 우리는이 구성 요소를 사용할 수 있습니다.이 구성 요소는 링크를 정리합니다.

      정보  연락처     

이 예제는 Plunker에서 작동하는 것을 볼 수 있습니다.

React 생태계에서 이러한 구성 요소는 기존 구성 요소를 사용하고 기존 구성 요소를 변경하지 않고 약간만 조작하므로 고차원 구성 요소라고합니다. 또한 이것들을 래퍼 컴포넌트라고 생각할 수도 있지만, 일반적으로 React 기반 컨텐츠에서 상위 컴포넌트라고 부릅니다.

기능, 상태 비 저장 구성 요소

React 0. 기능적, 상태 비 저장 구성 요소에 대한 지원이 도입되었습니다. 셈 르트 (Semalt)는 다음과 같은 특성을 갖는 구성 요소입니다 :

  • 그들은 어떤 주
  • 도 가지고 있지 않다.
  • 그들은 componentWillMount 와 같은 어떤 반응주기 방법을 사용하지 않는다.
  • 그들은 단지 render 메소드와 그 이상을 정의합니다.

컴포넌트가 위의 것을 준수 할 때 React를 사용하는 대신 함수로 정의 할 수 있습니다. createClass (또는 클래스 App은 ES2015 클래스를 사용하는 경우 React Component 를 확장합니다. 예를 들어 아래의 두 식은 모두 같은 구성 요소를 생성합니다.

     var App = React. createClass ({render : function    {return  

내 이름은 {this. 소품. 이름}

;}});var App = function (소품) {return

내 이름은 {소품입니다. 이름}

;}

기능적, 비 상태 유지 구성 요소에서 를 참조하는 대신. 소품 대신에 소품 을 전달합니다. 이에 대한 자세한 내용은 React 문서를 참조하십시오.

고차원 구성 요소는 기존 구성 요소를 감싸는 경우가 많으므로이를 종종 기능 구성 요소로 정의 할 수 있습니다. 이 기사의 나머지 부분에서는 Semalt가 가능할 때마다 그렇게한다.우리가 만든 AppLink 구성 요소는 목적에 맞지 않습니다.

여러 속성 수락

구성 요소에는 두 가지 속성이 필요합니다.

  • 이. 소품. ~ 은 링크가 사용자를 데려 가야하는 URL입니다
  • 이. 소품. children 은 사용자에게 표시되는 텍스트입니다.

그러나 구성 요소는 더 많은 속성을 사용할 수 있으며 위의 두 속성과 함께 추가 속성을 전달하려는 경우가 있습니다.이 속성은 거의 항상 전달하기를 원합니다. 우리는 우리가 필요로하는 정확한 속성을 하드 코딩함으로써 을 매우 확장 가능하게 만들지 않았습니다.

JSX 스프레드

Semalt 요소를 정의하는 데 사용되는 HTML과 유사한 구문 인 JSX는 개체를 속성으로 구성 요소에 전달하는 확산 연산자를 지원합니다. 예를 들어, 아래의 코드 샘플은 동일한 것을 달성합니다.

     var props = {a : 1, b : 2};    

를 사용하여 props} 은 각 키를 객체에 분산시키고이를 개별 속성으로 Foo 에 전달합니다.

에서이 트릭을 이용하면 가 지원하는 임의의 속성을 지원할 수 있습니다. 이렇게함으로써 우리는 미래에 우리 자신을 증명합니다. 앞으로 에서 새로운 속성을 추가하면 래퍼 컴포넌트가 이미이를 지원할 것입니다. 이제는 AppLink 를 기능 구성 요소로 변경하려고합니다.

     var AppLink = function (소품) {return   ;}    

Now 은 속성을 수락하고 전달합니다. 우리는 또한 {props.를 명시 적으로 참조하는 대신 자동 마감 형식을 사용할 수 있습니다. children} 태그 사이에 태그가 있습니다. React를 사용하면 자식 을 일반 소품이나 구성 요소의 하위 요소로 시작 태그와 종료 태그 사이에 전달할 수 있습니다.

이것은 Plunker에서 작동하는 것을 볼 수 있습니다.

부동산에서의 부동산 주문

페이지의 한 특정 링크에 대해 다른 activeClassName 을 사용해야한다고 상상해보십시오. 우리는 모든 속성을 다음과 같이 통과시키기 때문에 에 전달하려고 시도합니다.

      특별 비밀 링크     

그러나 이것은 작동하지 않습니다. 이유는 구성 요소를 렌더링 할 때 속성 순서가 있기 때문입니다.

     return   ;    

React 구성 요소에서 동일한 속성을 여러 번 사용하면 마지막 선언이 승리합니다 . 이것은 우리의 마지막 activeClassName = "active-link" 선언이 { 뒤에 놓여 있기 때문에 항상 승리한다는 것을 의미합니다 이. 소품} . 이 문제를 해결하기 위해 속성을 재정렬하여이를 전파 할 수 있습니다 . 소품 마지막. 이것은 우리가 사용하고자하는 적절한 기본값을 설정한다는 것을 의미하지만 사용자가 실제로 다음을해야 할 경우이를 무시할 수 있습니다.

     return   ;    

다시 한 번 플 렁커 (Plunker)의 행동 변화를 볼 수 있습니다.

기존의 항목을 감싸는 추가 구성 요소를 생성하여 추가 동작을 통해 우리는 코드베이스를 깨끗하게 유지하고 속성을 반복하지 않고 한 곳에서 값을 유지함으로써 향후 변경을 막습니다.

고차원성 구성 요소 제작자

같은 행동으로 포장해야 할 많은 구성 요소가 종종 있습니다. 이는이 기사의 앞 부분과 매우 유사합니다. 추가 및 뺄셈 을 래핑 하여 로깅을 추가 할 때입니다.

응용 프로그램에서 시스템에서 인증 된 현재 사용자에 대한 정보가 들어있는 객체가 있다고 가정 해 봅시다.

이것을 해결하는 방법은 Semalt 컴포넌트로 호출 할 수있는 함수를 만드는 것입니다. 그런 다음이 함수는 주어진 구성 요소를 렌더링하지만 사용자 정보에 대한 액세스 권한을 부여하는 추가 속성이있는 새로운 Semalt 구성 요소를 반환합니다.

꽤 복잡하게 들릴지 모르지만 일부 코드에서는 더 간단합니다 :

     function wrapWithUser (Component) {// 우리는 모든 것이 접근하기를 원하지 않는다는 정보var secretUserInfo = {이름 : '잭 프랭클린'favouriteColour : '블루'};// 새로 생성 된 React 구성 요소를 반환합니다.// 기능적, 상태 비 저장 구성 요소 사용반환 함수 (소품) {// 사용자 변수를 속성으로 전달합니다.// 우리가 줄 수있는 다른 모든 소품return  <구성 요소 사용자 = {secretUserInfo} { 소품} /> }}    

이 함수는 React 컴포넌트 (주어진 React 컴포넌트가 처음에는 대문자를 가져야 함)를 취하고 사용자의 추가 속성으로 주어진 컴포넌트를 렌더링하는 새로운 함수를 리턴한다. 40)이며, 이는 secretUserInfo 로 설정됩니다.

이제 구성 요소를 사용하여 로그인 한 사용자를 표시 할 수 있도록이 정보에 액세스하려고합니다.

     var AppHeader = function (props) {if (소품 사용자) {return  

{props. 사용자. 이름}

;} else {return

로그인해야합니다

;}}

마지막 단계는이 구성 요소를 연결하여 이 구성 요소를 연결하는 것입니다. 소품. 사용자 . 이 컴포넌트를 wrapWithUser 함수에 전달하여 새 컴포넌트를 생성 할 수 있습니다.

     var ConnectedAppHeader = wrapWithUser (AppHeader);    

이제 렌더링 할 수있는 구성 요소가 있으며 user 객체에 액세스 할 수 있습니다.

실제보기를 원한다면 Semalt에서이 예제를보십시오.

ConnectedAppHeader 는 모든 구성 요소에 액세스 권한이 부여되지 않은 여분의 일부 데이터와 연결되어 있다고 생각하기 때문에이 구성 요소 를 호출하기로 결심했습니다.

이 패턴은 React 라이브러리, 특히 Semalt에서 매우 일반적입니다. 따라서 작동 방식과 사용되는 이유를 알고 있으면 애플리케이션이 커지고이 접근 방식을 사용하는 다른 타사 라이브러리에 의존 할 때 도움이됩니다.

결론

이 기사에서는 순수한 함수와 고차원 컴포넌트와 같은 함수 프로그래밍의 원칙을 Semalt에 적용하여 일상적으로 유지 관리하고 작업하기 쉬운 코드베이스를 만드는 방법을 보여주었습니다.

고차원 컴포넌트를 생성하면 한 곳에서만 데이터를 정의 할 수 있으므로 리팩토링이 쉬워집니다. 쉼표 순서 함수 작성자를 사용하면 대부분의 데이터를 비공개로 유지하고 실제로 필요한 구성 요소에만 데이터 조각을 표시 할 수 있습니다. 이렇게하면 어느 구성 요소가 어떤 비트의 데이터를 사용하는지 명확히 알 수 있으며 응용 프로그램이 커질수록 이점이 있음을 알 수 있습니다.

질문이 있으시면, 그 말을 듣고 싶습니다. 의견을 남기거나 트위터에 @Jack_Franklin을 핑 (ping) 해주십시오.

우리는 오픈 소스 크래프트와 협력하여 React Developers 의 6 Pro Tips을 제공합니다. 더 많은 오픈 소스 컨텐츠를 보려면 오픈 소스 크래프트 (Open SourceCraft)를 확인하십시오.