簡體   English   中英

在 React 高階組件中傳播 props

[英]Spreading props in React Higher Order Components

我正在嘗試 go 非常深入地了解在 React HOC 中傳播道具的目的

所以以下面的例子為例;

const EnhanceComponent = BaseComponent => {
    return class EnhancedComponent extends Component {
        state = {
            name: 'You have been enhanced'
        }
        render() {
           return ( 
           <BaseComponent {...this.props} {...this.state} />   
        )
       }
    }
};

export default EnhanceComponent;

現在讓我們說 BaseComponent 的用法如下;

<BaseComponent className='wrapper-container' onClick={this.handleClick} />

我假設如果沒有在 HOC 中傳播道具,我們將無法訪問 BaseComponent 中的“this.props.className”或“this.props.onClick”。 那會是正確的理解嗎?

class BaseComponent extends React.Component {
      render() {
         const { className, onClick} = this.props;

         ...
      }
   }

現在要使用 HOC 本身,我們會說;

const EnhancedMyComponent = EnhanceComponent(MyComponent);

並將其渲染為

<EnhancedMyComponent className='wrapper-container' onClick={this.handleClick} />

現在,以下是我的 2 個具體問題;

  1. 我們最終渲染什么,即 BaseComponent 或 EnhancedMyComponent 或者使用 HOC 允許我們使用任何一種風格,例如在某些情況下,如果我們不想要增強的功能,我們只使用基本組件?

或者

<EnhancedMyComponent className='wrapper-container' onClick={this.handleClick} />
  1. 道具訪問問題,即如果我們不傳播道具,是否適用於上述兩種消費情況,即<BaseComponent /><EnhancedMyComponent />

1)我們最終渲染什么,即 BaseComponent 或 EnhancedMyComponent 或者使用 HOC 允許我們使用任何一種風格,例如在某些情況下,如果我們不想要增強的功能,我們只使用基本組件?

/ 使用 HOC 允許我們使用任何一種風格。 這完全取決於我們在 HOC 中包裝組件的位置,即在導出或在某個地方使用它時。

現在,在以下情況下,可以選擇在有或沒有 HOC 的情況下使用它

// BaseComponent.js 
        class BaseComponent extends React.Component {
                  render() {
                     const { className, onClick} = this.props;
            
                     ...
                  }
               }
    export default BaseComponent;
    
    // SomeComponent.js
    import BaseComponent from './BaseComponent';

    const MyComponent = EnhanceComponent(BaseComponent);
    class SomeComponent extends React.Component {
                  render() {
                     return ( 
                     ...
                     <MyComponent className={...} onClick={...} someExtraPropForHOC={...}/>
                     <BaseComponent  className={...} onClick={...} />
                     ...
                  )
               }

為了不允許任何人直接使用組件,將其包裝在 HOC 中並導出

// BaseComponent.js 
    class BaseComponent extends React.Component {
              render() {
                 const { className, onClick} = this.props;
        
                 ...
              }
           }
export default EnhanceComponent(BaseComponent);

// SomeComponent.js
import BaseComponent from './BaseComponent';
class SomeComponent extends React.Component {
              render() {
                 return ( 
                 ...
                 <BaseComponent className={...} onClick={...}/>
                 ...
              )
           }

2)如果我們不傳播道具,道具訪問問題是否適用於上述兩種消費情況,即AND?

/ 需要傳播道具,因為 HOC 不知道動態包裝的組件需要哪些道具。 所以通過所有即將到來的道具是唯一可能的方法。

class BaseComponent extends React.Component {
      render() {
         const { className, onClick} = this.props;

         ...
      }
   }

class CustomTextField extends React.Component {
      render() {
         const { className, onKeyPress, value} = this.props;

         ...
      }
   }

const EnhancedBaseComponent = EnhanceComponent(BaseComponent);
const EnhancedTextComponent = EnhanceComponent(CustomTextField);

現在在這種情況下, EnhancedBaseComponentEnhancedTextComponent都需要不同的 props,但是因為它們被包裝在 EnhanceComponent 中。 它不知道要通過哪些道具。 所以傳播它並將所有道具發送給它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM