当前位置: 首页 > 知识库问答 >
问题:

在React高阶组件中传播道具的目的是什么?

潘英豪
2023-03-14

我试图理解React的高阶组件结构,但是所有的参考资料都假设您已经理解了在编写:BaseComponent{…this.props}{…this.state}时,spread操作符在高阶组件中的作用。如果组件已经作为道具传入,为什么有必要像这样展开道具?

import React, { Component } from 'react';

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

export default EnhanceComponent;

共有3个答案

荆树
2023-03-14

简单回答:

传播道具不是强制性的

如果你想保留一个组件的道具,包装后在那里,然后在包装组件中传播道具,否则不要传播它。

姚星腾
2023-03-14

例如,你有一个组件,你想增强它:

const Message = props => (
  <div className={props.type}>
    <p>{props.message}</p>
  </div>
)

const EnhancedMessage = enhance(Message);

然后,您可以在代码中的某个地方使用增强组件:

<EnhancedMessage type="alert" message="Something went wrong" />

如果您不传播传递给HOC的道具,那么Message组件将如何了解传递的道具?

昌乐生
2023-03-14

答案在文件中直接解释:

约定:将不相关的道具传递到包装组件HOC向组件添加功能。他们不应该彻底改变合同。从HOC返回的组件应该具有与包装组件类似的接口。

HOC应通过与其特定关注点无关的道具。大多数HOC包含的渲染方法如下所示:

要理解这一点,您应该知道{…this.props}的作用。就你而言

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

export default EnhanceComponent;

EnhanceComponent HOC执行一个简单的操作,将状态名称添加到当前呈现的组件中,因此本质上,当您使用此HOC时,您应该能够将原始组件所需的道具直接传递给它,而不是在HOC中使用它们,这就是{…this.props}扩展语法的目的。您可以阅读此答案以了解有关工作原理的更多详细信息

考虑使用简单组件的情况

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

定义为

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

         ...
      }
   }

如果在这个组件上使用HOC,比如

const EnhancedMyComponent = EnhanceComponent(MyComponent);

你会把它渲染成

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

现在如果你不写{...this.props}在你的HOC中,那么MyComponent将不再有class NameonClark作为道具

 类似资料:
  • 我指的是这个创建React高阶组件的例子,摘自本文。 我正在努力完全理解 下面是我对上述代码的理解: 我们通过名称定义了一个HOC,它接受一个React组件(BaseComponent)。BaseComponent附带了它的props(称为P),它返回一个新的React组件,该组件接受props P 如何使用此HOC?以下尝试给出了一个打字脚本错误,即传递了太多参数: Modal React组件具

  • 我正在构建一个网页,实现了每个组件共享的通用样式(相同的背景、边框和标题样式)。所以我想我应该制作一个HOC,它接受每个组件的内部内容以及一个标题,并返回一个外部组件,它封装了这个内部组件和标题。起初,我在尝试让它发挥作用时遇到了很多问题,因为我是一个新的反应者,但现在它终于起作用了,但我仍然不明白怎么做。 这是我的HOC 这是WrappedComponent: 这是ListsComponent

  • 在react中,您可以设置进入组件的道具的道具类型。对于我的一个道具,我希望值为null或一行JSX。React文档没有涵盖JSX应该使用的propType。 在测试时,我发现它在使用对象或元素的propTypes时不会抛出错误。当使用另一个符号(如符号)时,我会得到一个错误,表示它是一个对象。如果它是一个对象,当它是一个元素时,它肯定会抱怨。 JSX的正确类型是什么?

  • 我使用的是dev-express中的react-grid库,库中有一个表组件,我们可以向它传递单元格组件,在CustomCell中,我使用的是Material UI中的菜单 在上述情况下,菜单工作良好, 但是我想要传递道具到这个组件,我尝试了以下操作 在这种情况下菜单不工作,我想知道是否有一个替代的方法来实现第二种情况。

  • 状态保存在MyPayments组件中(它是本地状态--尽管您可以看到连接的组件,但我几乎不使用Redux)。 它具有以下结构: 数组作为道具传递给子组件(连接的)-您可以在上面的屏幕截图中看到它。我认为连接的组件将它进一步传递到组件。但是...

  • 本文向大家介绍React.js中的高阶组件,包括了React.js中的高阶组件的使用技巧和注意事项,需要的朋友参考一下 高阶部分简称为hoc。这是一种接收组件并返回具有附加功能的新组件的模式。 // hoc是自定义JavaScript函数的名称 我们使用带有状态和/或道具的组件来构建UI。hoc用类似的方法从提供的组件中构建一个新组件。 使用hoc在React中成为一个横切关注点。这些组件将负责单