当前位置: 首页 > 面试题库 >

反应反模式?

虞正业
2023-03-14
问题内容

以下是React中的反模式吗?我喜欢这种模式,因为当实例化一个组件时,它在静态函数中为我提供了上下文。然后,我可以导入该类并调用静态方法来修改状态。还是可以通过更好的方式来完成?

// componentA.js



function bleedContext() {

  ComponentA.staticMethod = ComponentA.staticMethod.bind(this)

}



export default class ComponentA {

  static staticMethod() {

    this.setState({foo: 'bar'})

  }



  constructor() {

    this.state = {}

    bleedContext.call(this)

  }



  render() {

    return (

      ...

    )

  }

}



// componentB.js



import ComponentA from 'path/to/componentA'



export default class ComponentB {

  handleClick() {

    ComponentA.staticMethod()

  }



  render() {

    return (

      <button onClick={this.handleClick} />

    )

  }

}

问题答案:

显然,这取决于条件,可能是一种反模式,也可能是一个错误。静态类方法不应与类实例一起使用。staticMethod绑定到特定的组件实例和用途setState,这只能证明类是单例是合理的(尽管单例也经常是反模式)。如果期望有多个类实例,那么这将导致错误和内存泄漏,并且至少对于测试而言,每个React组件均应具有多个实例。

两个独立组件在React中彼此交互的一种正确方法是拥有一个提供此交互的公共父组件,例如:

class ModalContainer extends Component {
  modalRef = React.createRef();

  render() {
    return <>
      <Modal ref={this.modalRef} />
      <SomeComponentThatUsesModal modalRef={this.modalRef} />
    </>;
  }
}

上面示例的问题是,modalRef如果<SomeComponentThatUsesModal>嵌套,这将需要深入传递属性。

这个问题可以通过React上下文或其他第三方全局状态解决方案(例如Redux)来解决。

考虑到Modal类实例具有open方法,可以使用React 16.3上下文API完成此操作:

const ModalContext = React.createContext();

function getModal(modalRef) {
  return {
    open: data => modalRef.current.open(data);
    close: () => modalRef.current.close();
  }
}

class ModalContainer extends Component {
  modalRef = React.createRef();

  render() {
    return <>
      <Modal ref={this.modalRef} />
      <ModalContext.Provider value={getModal(this.modalRef)}>
        {this.props.children}
      </ModalContext.Provider>
    </>;
  }
}

然后,对于任何深层嵌套的组件模态对象,open可以通过context 使用with 和close方法:

const SomeComponentThatUsesModal = props => <div>
  <ModalContext.Consumer>
    {modal => <button onClick={() => modal.open('foo')} />}
  </ModalContext.Consumer>
</div>;

<ModalContainer>
  ...deeply nested component
  <SomeComponentThatUsesModal />
  ...
</ModalContainer>

这是一个演示。



 类似资料:
  • 我正在做我的项目,我注意到当严格模式打开时,它会将两个相同的元素推入我的数组。当严格模式关闭时,它只将一个元素推入数组。有什么解释为什么会这样吗? 这是我的状态。

  • 在软件工程中,一个反面模式(anti-pattern或antipattern)指的是在实践中明显出现但又低效或是有待优化的设计模式,是用来解决问题的带有共同性的不良方法。它们已经经过研究并分类,以防止日后重蹈覆辙,并能在研发尚未投产的系统时辨认出来。 软件设计 抽象倒置(Abstraction inversion):不把用户需要的功能直接提供出来,导致他们要用更上层的函数来重复实现 用意不明(Am

  • 我想在加载组件时进行api调用。我有以下代码: getProfile细节功能: 在这里,函数"getProfile细节"正在进行api调用,然后调度一个redux存储操作,该操作正在设置配置文件细节。 问题是,每次调用getProfile细节时,redux存储都会更新,组件会重新渲染,这反过来会触发组件didMount,并进入无休止的循环。 请建议如何构造这个。

  • 问题内容: 我已经实现了一个Modal组件,该组件在屏幕上显示一个模态对话框。通常,模态将有条件地显示。我可以通过两种方法在render函数中执行此操作: 在Modal组件中,我使用this.props.show为其自身添加了一个不同的类。如果为假,它将添加display:none以隐藏模式。 另一种方式是这样的: 这用于确定是否在渲染中添加Modal。 我想找出的是: 这两种方式有何不同? 其中

  • 我正在尝试为没有经验的霍尼韦尔CT50设备实施React Native Android模块。该模块将监听设备上内置激光扫描仪的扫描。 我已经在React本机站点上完成了正式的演练,我已经成功地设置了一个基本模块,可以在RN组件中接收到一个简单的值。到目前为止,我的代码如下所示: 霍尼韦尔CT50包装: 霍尼韦尔CT50模块: React Native Component(在组件中) 我正在努力理解

  • 我的理解是Spring Webflux提供了一个非阻塞/异步并发模型。然而,我得到了一个需要帮助的基本问题。作为一个免责声明,这种反应编程的整个概念对我来说是非常新的,我仍然处于这种范式转变的过程中。 请考虑以下代码: 我从文档中了解到,在调用“subscribe”函数之前,事件处理链不会发生任何事情。 我注意到代码总是按顺序运行,并且使用相同的线程。spring WebFlux的线程模型是什么?