목차
결합 및 응집력
Building Components
No props
비용 개체 전달
只传递必要的属性
传递map或者array的属性
传递一个格式化的子对象
环境为王
웹 프론트엔드 JS 튜토리얼 React 컴포넌트를 구축하는 가장 완벽한 방법

React 컴포넌트를 구축하는 가장 완벽한 방법

Jan 23, 2018 am 10:55 AM
react 방법

저는 React의 가장 큰 장점은 충분히 간단하다는 점이라고 생각하기 때문에 React를 매우 좋아합니다. 단순한 것과 쉬운 것에는 차이가 있습니다. 즉, React도 쉽다는 뜻입니다. 물론, 핵심 내용을 익히고 나면 다른 모든 것이 제자리를 찾을 것입니다. 더 어려운 부분은 아래에서 다루겠습니다.

결합 및 응집력

이러한 지표(결합 및 응집력)는 프로그래밍 습관을 바꾸는 데 다소 어려움을 가져옵니다. 클래스 기반 객체 지향 프로그래밍에 자주 사용됩니다. 또한 React 컴포넌트를 작성할 때에도 동일한 규칙을 참조하고 적용할 것입니다.

커플링은 요소 간의 상호 연결 및 종속성을 나타냅니다. 한 요소를 변경하고 다른 요소를 동시에 업데이트해야 하는 경우 이를 긴밀한 결합이라고 합니다. 느슨한 결합이란 한 요소가 변경되면 다른 요소를 변경할 필요가 없음을 의미합니다. 예를 들어 은행 이체 금액 기능을 보여줍니다. 표시된 금액이 환율 계산에 의존하는 경우 내부 변환 구조가 변경되면 표시된 코드가 업데이트됩니다. 요소 인터페이스를 기반으로 느슨하게 결합된 시스템을 설계하면 요소의 변경 사항이 뷰 레이어 표시에 영향을 미치지 않습니다. 분명히 느슨하게 결합된 구성 요소는 관리 및 제어가 더 쉽습니다.

응집력은 구성 요소가 한 가지만 담당하는지 여부입니다. 이 지표는 단일 원칙과 Unix 원칙을 따릅니다. 즉, 한 가지에 집중하고 이를 잘 수행하는 것입니다. 형식화된 계정 잔액 표시를 위해 관련 환율을 계산하고 내역 보기 권한이 있는지 확인해야 하는 경우 여기에는 많은 기능적 책임이 포함되며 이러한 기능은 서로 종속되지 않습니다. 아마도 허가 처리와 환율은 서로 다른 구성요소여야 할 것입니다. 반면 정수부, 소수부, 통화 표시부 등 여러 구성요소가 있고 프로그래머가 잔액을 표시하려면 조립할 구성요소를 모두 찾아야 합니다. 문제는 응집력이 높은 구성 요소를 만드는 것입니다.

Building Components

구성요소를 만드는 방법에는 여러 가지가 있습니다. 우리는 구성 요소를 합리적인 범위 내에서 재사용할 수 있기를 원합니다. 또한 우리는 더 큰 구성 요소 내에서 사용할 수 있는 작은 구성 요소를 만들고 싶습니다. 이상적으로 우리는 시스템을 더 쉽게 관리하고 확장할 수 있도록 느슨하게 결합되고 고도로 집계된 구성 요소를 구축하려고 합니다. React 컴포넌트의 Prop은 함수의 매개변수와 유사하며 상태 비저장 함수를 갖는 컴포넌트로 간주될 수도 있습니다. 컴포넌트에서 props를 어떻게 정의하는지, 컴포넌트를 어떻게 재사용할 수 있는지 생각해 볼 필요가 있습니다.

다음으로 비용 관리 시스템을 배경으로 비용의 세부 형식을 분석하고 구성 요소 구축 방법을 소개합니다.

type Expense {
      description: string
      category: string
      amount: number
      doneAt: moment
    }
로그인 후 복사

모델에 따르면 비용 형식에 대한 프로그램 모델링 방법은 다음과 같습니다.

  • 소품 없음

  • 비용 객체 전달

  • 필요한 속성 전달

  • 모든 속성의 맵 전달

  • 형식화된 하위 객체 전달

다음은 논의된다 위의 배송 방법을 별도로 사용하면 장단점이 있습니다. 그러나 사용 시나리오 및 종속 시스템에 따라 위 방법 중 하나를 사용하는 경우 항상 주의를 기울여야 합니다. 그것이 우리도 하는 일입니다. 적절하게 추상적인 장면을 구축하는 것입니다.

No props

이것은 정적 데이터를 쓰는 구성 요소를 구축하는 가장 간단한 솔루션입니다.

const ExpenseDetails = () => (
      <p className=&#39;expense-details&#39;>
         <p>Category: <span>Food</span></p>
         <p>Description: <span>Lunch</span></p>
         <p>Amount: <span>10.15</span></p>
         <p>Date: <span>2017-10-12</span></p>
      </p>
    )
로그인 후 복사

props를 전달하지 않으면 유연성이 제공되지 않으며 구성 요소는 단일 장면에서만 사용할 수 있습니다. 비용 세부사항 예시에서 우리는 처음에 컴포넌트가 일부 props를 받아들여야 한다는 것을 알 수 있습니다. 그러나 일부 시나리오에서는 소품을 사용하지 않는 것도 좋은 해결책입니다. 첫째, 상표, 로고, 회사 정보 등 쉽게 변경할 수 없는 콘텐츠가 포함된 소품이 포함된 일부 구성 요소를 사용할 수 있습니다.

const Logo = () => (
      <p className=&#39;logo&#39;>
       <img src=&#39;/logo.png&#39; alt=&#39;DayOne logo&#39;/>
      </p>
    )
로그인 후 복사

컴포넌트를 가능한 한 작게 작성하면 시스템 유지 관리가 더 쉬워집니다. 정보를 한 곳에 보관하고 한 곳에서만 수정하면 됩니다. 여러 곳에 중복된 코드를 작성하지 마세요.

비용 개체 전달

비용 세부 정보가 결정되면 데이터를 구성 요소에 전달해야 합니다. 먼저 비용 개체를 전달해야 합니다.

const ExpenseDetails = ({ expense }) => (
      <p className=&#39;expense-details&#39;>
         <p>Category: <span>{expense.category}</span></p>
         <p>Description: <span>{expense.description}</span></p>
         <p>Amount: <span>{expense.amount}</span></p>
         <p>Date: <span>{expense.doneAt}</span></p>
      </p>
    )
로그인 후 복사

비용 개체를 비용 세부 정보 구성 요소에 전달하는 것이 합리적입니다. 비용 세부 정보 형식은 일관성이 뛰어나며 비용 데이터를 표시합니다. 형식을 변경해야 할 때마다 여기에서만 수정할 수 있습니다. 비용 세부 정보의 형식을 변경해도 비용 개체 자체에는 부작용이 없습니다.

이 구성 요소는 비용 개체와 밀접하게 연결되어 있습니다. 이것이 나쁜 것입니까? 물론 그렇지 않습니다. 그러나 이것이 우리 시스템에 어떤 영향을 미치는지 알아야 합니다. 객체를 소품으로 전달하면 비용 세부 정보 구성 요소는 비용 내부 구조에 의존합니다. 비용의 내부 구조를 변경하면 비용 세부 구성 요소도 변경해야 합니다. 물론 한 곳에서만 수정하면 됩니다.

이 디자인은 향후 변화에 어떻게 적응하나요? 필드를 추가, 변경 또는 삭제하는 경우 구성 요소 하나만 변경하면 됩니다. 다른 형식의 달력 디스플레이를 추가해야 하면 어떻게 됩니까? 달력 서식을 위한 새로운 소품을 추가할 수 있습니다.

rreee

我们开始增加属性来使组件更加灵活。如果只有几个选项,那么一切都是很ok的。系统业务开始扩展后问题就来了,在不同的场景下我们需要维护大量的props。

const ExpenseDetails = ({ expense, dateFormat, withCurrency, currencyFormat, isOverdue, isPaid ... })
로그인 후 복사

 

增加props可以使得组件重用性更好,但你可能设计了多重功能职责的组件。这种规则也同样在函数写法中运用。可以用多个参数来创建一个函数,当参数的数目超过3个或者4个时候,意味着这个函数在做很多事情了,也许这时候应该将函数拆成更小的函数来的更加简单。

随着组件props的增加,我们将其拆分成定义明确的组件,比如:OverdueExpenseDetails, PaidExpenseDetails等。

只传递必要的属性

为了减少对象自身的内容,我们可以只传递必要的属性值。

const ExpenseDetails = ({ category, description, amount, date }) => (
      <p className=&#39;expense-details&#39;>
         <p>Category: <span>{category}</span></p>
         <p>Description: <span>{description}</span></p>
         <p>Amount: <span>{amount}</span></p>
         <p>Date: <span>{date}</span></p>
      </p>
    )
로그인 후 복사

 

我们分别传递属性,这样我们将一部分工作责任转移给了组件使用者。如果费用的内部结构发生变化,他将不会影响费用明细的格式化。但可能影响每个使用组件的地方,因为我们可能需要修改props。当我们以独立的属性传递props时候,一个组件将更加抽象了。

只传递需要的字段对未来设计改动是如何影响的?增加、更新或者删除字段将不会很容易。无论何时我们要增加一个字段,我们不仅仅要改变费用细节的实现,也需要改变每个使用组件的地方。另外一个方面,支持多种日历格式化几乎是现成的,我们可以传递日历作为prop,也可以传递格式化后的日历。

<ExpenseDetails 
      category={expense.category} 
      description={expense.description}
      amount={expense.amount}
      date={expense.doneAt.format(&#39;YYYY-MM-DD&#39;)}
    />
로그인 후 복사

 

决定如何展示特定的字段应该在掌握在具体使用组件的人手中,这将不是费用明细组件关心的内容。

传递map或者array的属性

为了达到组件抽象化,我们可以传递一个map的属性值。

const ExpenseDetails = ({ expense }) => (
      <p class=&#39;expense-details&#39;>
      {
        _.reduce(expense, (acc, value, key) => {
          acc.push(<p>{key}<span>{value}</span></p>)
        }, [])
      }
      </p>
    )
로그인 후 복사

 

使用组件的人控制费用明细的格式化,传递给组件的对象格式则必须正确。

const expense = {
      "Category": "Food",
      "Description": "Lunch",
      "Amount": 10.15,
      "Date": 2017-10-12
    }
로그인 후 복사

 

这个方案有很多缺陷,我们很难控制组件展示的样式,并且展示顺序也没有指定。因此,如果我们需要某种顺序的话,可以采用array代替map来解决这个问题。但是仍然还有缺陷。

传递map 和array作为props 不与费用耦合,也根本与它不一致。增加和删除新属性虽然只改变了prop,但是我们无法控制组件本身的格式。如果我们只改变类别的格式化,这不是一个可行的办法。(确切地说,总有一个办法来解决,例如,传递另外一个格式化后的props。这个解决方案似乎不再简单了。)

传递一个格式化的子对象

我们也可以只通过直接传对一个子对象,这样就能考虑更少的组件内需要如何展示。

const ExpenseDetails = ({ children }) => (
      <p class=&#39;expense-details&#39;>
        { children }
      </p>
    )
로그인 후 복사

 

在这种情况下,费用明细只是一个提供结构和样式的容器。展示所有信息则是使用组件的人必须提供的。

<ExpenseDetails>
      <p>Category: <span>{expense.category}</span></p>
      <p>Description: <span>{expense.description}</span></p>
      <p>Amount: <span>{expense.amount}</span></p>
      <p>Date: <span>{expense.doneAt}</span></p>
    </ExpenseDetails>
로그인 후 복사

 

在费用明细这个案例中,我们需要重复许多工作,因此这也许不是一个好的解决方案。尽管如此,灵活性则是巨大的,因为有可能有很多不同的格式化操作。增删改只需要改变使用组件时候传入的值。日期格式也是一样的,我们虽然失去了功能内聚的特点,但这也是我们不得不付出的代价。

环境为王

正如你所看到,我们讨论了它们的不同优缺点和可能性。哪一个最好呢,这取决于:

  • 项目本身

  • 项目阶段

  • 组件自身,需要很多特殊的组件组成还是只需要简单的一些选项值

  • 自己的习惯

  • 使用环境-适合频繁的改变和被多次使用

没有一个万能的解决方案,一个方案也并不能适用所有场景。我们如何构建组件对于系统的维护和系统可扩展方面有着深远的影响。这完全依赖于组件所使用的环境。非常幸运的是,我们有很多可使用的方案。组件是功能的抽象集合,它既能构建小系统也能构建大系统。所以这仅仅只是一个选择问题。

相关推荐:

store优化React组件的方法详解

如何在React组件“外”使用父组件的Props

React组件的生命周期函数是什么

위 내용은 React 컴포넌트를 구축하는 가장 완벽한 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Tomato Free Novel 앱에서 소설 쓰는 방법 Tomato Novel에서 소설 쓰는 방법에 대한 튜토리얼을 공유하세요. Tomato Free Novel 앱에서 소설 쓰는 방법 Tomato Novel에서 소설 쓰는 방법에 대한 튜토리얼을 공유하세요. Mar 28, 2024 pm 12:50 PM

Tomato Novel은 매우 인기 있는 소설 읽기 소프트웨어입니다. 우리는 종종 Tomato Novel에서 읽을 새로운 소설과 만화를 가지고 있습니다. 많은 친구들도 용돈을 벌고 소설의 내용을 편집하고 싶어합니다. 글로 쓰고 싶은데, 그 안에 소설을 어떻게 쓰는지 친구들도 모르니까, 소설 쓰는 방법에 대한 소개를 함께 살펴보는 시간을 가져보겠습니다. 토마토 소설을 사용하여 소설을 쓰는 방법에 대한 튜토리얼을 공유하세요. 1. 먼저 휴대폰에서 토마토 무료 소설 앱을 열고 개인 센터 - 작가 센터를 클릭하세요. 2. 토마토 작가 도우미 페이지로 이동하여 새로 만들기를 클릭하세요. 소설의 끝 부분에 예약하십시오.

WeChat에서 삭제된 연락처를 복구하는 방법(삭제된 연락처를 복구하는 방법을 알려주는 간단한 튜토리얼) WeChat에서 삭제된 연락처를 복구하는 방법(삭제된 연락처를 복구하는 방법을 알려주는 간단한 튜토리얼) May 01, 2024 pm 12:01 PM

불행하게도 사람들은 어떤 이유로든 실수로 특정 연락처를 삭제하는 경우가 많습니다. WeChat은 널리 사용되는 소셜 소프트웨어입니다. 사용자가 이 문제를 해결할 수 있도록 이 문서에서는 삭제된 연락처를 간단한 방법으로 검색하는 방법을 소개합니다. 1. WeChat 연락처 삭제 메커니즘을 이해하면 삭제된 연락처를 검색할 수 있습니다. WeChat의 연락처 삭제 메커니즘은 연락처를 주소록에서 제거하지만 완전히 삭제하지는 않습니다. 2. WeChat에 내장된 "연락처 복구" 기능을 사용하세요. WeChat은 "연락처 복구"를 제공하여 시간과 에너지를 절약합니다. 사용자는 이 기능을 통해 이전에 삭제한 연락처를 빠르게 검색할 수 있습니다. 3. WeChat 설정 페이지에 들어가서 오른쪽 하단을 클릭하고 WeChat 애플리케이션 "나"를 열고 오른쪽 상단에 있는 설정 아이콘을 클릭하여 설정 페이지로 들어갑니다.

휴대폰에서 글꼴 크기를 설정하는 방법(휴대폰에서 글꼴 크기를 쉽게 조정) 휴대폰에서 글꼴 크기를 설정하는 방법(휴대폰에서 글꼴 크기를 쉽게 조정) May 07, 2024 pm 03:34 PM

휴대폰이 사람들의 일상 생활에서 중요한 도구가 되면서 글꼴 크기 설정은 중요한 개인화 요구 사항이 되었습니다. 다양한 사용자의 요구를 충족하기 위해 이 기사에서는 간단한 조작을 통해 휴대폰 사용 경험을 개선하고 휴대폰의 글꼴 크기를 조정하는 방법을 소개합니다. 휴대폰의 글꼴 크기를 조정해야 하는 이유 - 글꼴 크기를 조정하면 텍스트가 더 명확하고 읽기 쉬워집니다. - 다양한 연령대의 사용자의 읽기 요구에 적합 - 시력이 좋지 않은 사용자가 글꼴 크기를 사용하는 것이 편리합니다. 휴대폰 시스템의 설정 기능 - 시스템 설정 인터페이스에 들어가는 방법 - 찾기에서 설정 인터페이스의 "디스플레이" 옵션을 입력합니다. - "글꼴 크기" 옵션을 찾아 타사를 통해 글꼴 크기를 조정합니다. 애플리케이션 - 글꼴 크기 조정을 지원하는 애플리케이션 다운로드 및 설치 - 애플리케이션을 열고 관련 설정 인터페이스로 진입 - 개인에 따라

모바일 드래곤 알 부화의 비밀이 공개됩니다(모바일 드래곤 알을 성공적으로 부화하는 방법을 단계별로 알려드립니다) 모바일 드래곤 알 부화의 비밀이 공개됩니다(모바일 드래곤 알을 성공적으로 부화하는 방법을 단계별로 알려드립니다) May 04, 2024 pm 06:01 PM

모바일 게임은 기술의 발전과 함께 사람들의 삶에 없어서는 안될 부분이 되었습니다. 귀여운 드래곤 알 이미지와 흥미로운 부화 과정으로 많은 플레이어들의 관심을 끌었으며, 특히 주목을 받은 게임 중 하나가 드래곤 알 모바일 버전이다. 플레이어가 게임에서 자신만의 드래곤을 더 잘 육성하고 성장시킬 수 있도록 이 글에서는 모바일 버전에서 드래곤 알을 부화시키는 방법을 소개합니다. 1. 적절한 유형의 드래곤 알을 선택하십시오. 플레이어는 게임에서 제공되는 다양한 유형의 드래곤 알 속성과 능력을 기반으로 자신이 좋아하고 적합한 드래곤 알 유형을 신중하게 선택해야 합니다. 2. 부화기의 레벨을 업그레이드하세요. 플레이어는 작업을 완료하고 소품을 수집하여 부화기의 레벨을 향상시켜야 합니다. 부화기의 레벨에 따라 부화 속도와 부화 성공률이 결정됩니다. 3. 플레이어가 게임에 참여하는데 필요한 자원을 수집하세요.

빨리 익히세요: Huawei 휴대폰에서 두 개의 WeChat 계정을 여는 방법 공개! 빨리 익히세요: Huawei 휴대폰에서 두 개의 WeChat 계정을 여는 방법 공개! Mar 23, 2024 am 10:42 AM

현대 사회에서 휴대폰은 우리 삶에 없어서는 안 될 필수품이 되었습니다. 일상적인 의사소통, 업무, 생활을 위한 중요한 도구로 WeChat이 자주 사용됩니다. 그러나 서로 다른 거래를 처리할 때 두 개의 WeChat 계정을 분리해야 할 수도 있습니다. 이를 위해서는 휴대폰이 동시에 두 개의 WeChat 계정에 로그인하는 기능을 지원해야 합니다. 국내 유명 브랜드인 화웨이 휴대폰은 많은 사람들이 사용하고 있습니다. 그렇다면 화웨이 휴대폰에서 위챗 계정을 2개 개설하는 방법은 무엇일까요? 이 방법의 비밀을 공개해보겠습니다. 우선, Huawei 휴대폰에서 두 개의 WeChat 계정을 동시에 사용해야 합니다.

Go 언어의 방법과 기능의 차이점과 응용 시나리오 분석 Go 언어의 방법과 기능의 차이점과 응용 시나리오 분석 Apr 04, 2024 am 09:24 AM

Go 언어 메소드와 함수의 차이점은 구조와의 연관성에 있습니다. 메소드는 구조와 연관되어 구조 데이터를 조작하는 데 사용되며, 메소드는 유형과 독립적이며 일반 작업을 수행하는 데 사용됩니다.

PHP, Vue 및 React: 가장 적합한 프런트엔드 프레임워크를 선택하는 방법은 무엇입니까? PHP, Vue 및 React: 가장 적합한 프런트엔드 프레임워크를 선택하는 방법은 무엇입니까? Mar 15, 2024 pm 05:48 PM

PHP, Vue 및 React: 가장 적합한 프런트엔드 프레임워크를 선택하는 방법은 무엇입니까? 인터넷 기술이 지속적으로 발전함에 따라 프런트엔드 프레임워크는 웹 개발에서 중요한 역할을 합니다. PHP, Vue, React는 세 가지 대표적인 프론트엔드 프레임워크로 각각 고유한 특성과 장점을 가지고 있습니다. 사용할 프런트 엔드 프레임워크를 선택할 때 개발자는 프로젝트 요구 사항, 팀 기술 및 개인 선호도를 기반으로 정보를 바탕으로 결정을 내려야 합니다. 이 글에서는 세 가지 프론트엔드 프레임워크인 PHP, Vue, React의 특징과 용도를 비교해보겠습니다.

휴대폰 화면 보호를 위한 휴대폰 화면 보호 필름 선택 방법(휴대폰 화면 보호 필름 구매 시 핵심 포인트 및 팁) 휴대폰 화면 보호를 위한 휴대폰 화면 보호 필름 선택 방법(휴대폰 화면 보호 필름 구매 시 핵심 포인트 및 팁) May 07, 2024 pm 05:55 PM

스마트폰의 대중화와 함께 휴대폰 필름은 없어서는 안 될 액세서리 중 하나로 자리 잡았습니다. 수명을 연장하려면 휴대폰 화면을 보호하는 데 적합한 휴대폰 필름을 선택하세요. 독자들이 자신에게 가장 적합한 휴대폰 필름을 선택할 수 있도록 돕기 위해 이 글에서는 휴대폰 필름 구매 시 몇 가지 핵심 포인트와 기술을 소개하겠습니다. 휴대폰 필름의 재질과 종류(PET필름, TPU 등)를 이해한다. 휴대폰 필름은 강화유리를 비롯해 다양한 소재로 만들어진다. PET 필름은 상대적으로 부드럽고 강화 유리 필름은 긁힘 방지 기능이 좋으며 TPU는 충격 방지 성능이 좋습니다. 선택할 때 개인의 취향과 필요에 따라 결정될 수 있습니다. 화면 보호 수준을 고려하십시오. 휴대폰 필름의 종류에 따라 화면 보호 수준이 다릅니다. PET 필름은 주로 긁힘 방지 역할을 하는 반면 강화 유리 필름은 낙하 방지 기능이 더 좋습니다. 더 나은 것을 선택할 수 있습니다

See all articles