【问题标题】:Should React/Redux development be Object Oriented Programming or Functional Programming? [closed]React/Redux 开发应该是面向对象编程还是函数式编程? [关闭]
【发布时间】:2018-03-20 18:48:42
【问题描述】:

编辑(2021-02-12): 自从提出这个问题以来,我花了很多时间研究 React 和 Redux 应用程序,我可以理解为什么可能没有一个正确的答案,因为它取决于用例,并且两种解决方案都可以用于实现相同的目标。但是,我仍然相信,如果将其记录在案(尤其是对新手而言),说明人们选择一种方法而不是另一种方法的原因,那将是有益的。遗憾的是,说一切都基于意见并不能提供任何指导。

这里有一个相关的 SO 问答:React functional stateless component, PureComponent, Component; what are the differences and when should we use what?


我最近加入了 React 和 Redux 生态系统;虽然我可以欣赏 React 提供的组件(以及更多)和 Redux 的三个原则之间的清晰组织;我很难决定什么是最好的发展方式;面向对象还是函数式?

在 React/Redux 之前,我们曾经使用 ES6 类进行开发;它为面向对象编程提供了非常整洁的语法,尤其是继承。所有组件类都建立在以下简单结构之上:

export default class MyComponent extends React.Component {
    constructor(){
        // initialise state here
    }

    componentWillMount(){
        // populate state here
    }

    componentDidMount(){
        // update UI/bind listeners here
    }

    render(){
        // output HTML here
    }
}

在引入 Redux 之后,我开始觉得上面的结构不再是我所追求的,因为组件不再保持自己的状态;但相反,状态来自 Redux 存储,并使用 connect 方法和 mapStateToProps 作为道具传递。连同不可变数据的概念,这似乎有利于函数式编程方法,其中所有函数都是一等函数。上面的组件现在开始看起来像:

const MyComponent = ({ myPropA, onEvent }) => {
    // output HTML here
}

const mapStateToProps = state => {
    return {
        myPropA: state.myPropA
   }
}

const mapDispatchToProps = dispatch => {
    return {
        onEvent: data => dispatch({
            type: 'ACTION_NAME',
            data
        });
   }
}

connect(mapStateToProps, mapDispatchToProps)(MyComponent);

函数式编程方法似乎更适合 React/Redux 组合,但我不禁觉得错过了一些有用的 OOP。关于 React/Redux 技术堆栈的最佳实践是什么?似乎每个人都在做不同的事情;但是有推荐或最佳实践吗?说表示(哑)组件是功能组件而容器(智能)是类组件是否明智?或者,当您需要组件生命周期时,它应该是一个类,否则是一个功能组件?

我知道 OOP 与 FP 是一个广泛的话题;但是在 React/Redux 的范围内,我希望有一个正确的答案。 :)

【问题讨论】:

  • 谁投了反对票,为什么?这实际上是一个有效的问题!我在使用 Angular 和 Redux(后来的 ngrx)时问过自己这个问题。
  • 这真的取决于你喜欢用你的组件做什么。我目前将它们混合在一起,因为 React 组件可以在需要时更强大(比如让生命周期事件可用)
  • 我不同意它是基于意见的。当然,开发人员可以两者兼而有之,但应该有对与错或好与更好。开发者的选择背后一定有原因。对于更传统的编程语言,例如 Java,可以讨论是否/何时应该使用一种设计模式而不是另一种。
  • @KevinFarrugia 我以为我说过,这取决于用例,当我需要生命周期事件时,我会混合它们。有点像 Olivier 提到的,取决于它们是展示组件还是容器组件(尽管从术语上我更喜欢哑/智能组件的想法)
  • 谢谢@Icepickle。我并不是专门针对您,而是更多地指的是在现代 JavaScript 中一切似乎都是“基于意见”的问题。 :) 虽然stackoverflow.com/questions/40703675/… 可以回答这个问题,但我遇到了这个链接(问的方式略有不同)。

标签: javascript reactjs oop functional-programming redux


【解决方案1】:

问题更多的是,我应该使用无状态组件还是有状态组件?

如果您只需要组件的属性,那么它是一个无状态组件,您可以使用函数式编程来创建它。它使您的代码行数更少,也更易于阅读和测试。

如果您需要管理组件内部的状态,那么它就是一个有状态的组件,您需要像以前一样使用 ES6 类来描述它的行为。

我在许多项目中看到了演示组件和容器组件之间的区别。

Presentational Components 仅渲染来自 props 的数据,因此是无状态组件,可以使用函数创建。这些组件不知道redux,测试这些组件真的很容易。

容器组件管理一个状态并且知道 redux,他们派发动作并订阅 redux 状态。它们是有状态的组件,可以使用 ES6 类创建。

你可以在redux documentation找到这些解释

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 2013-11-20
    • 2015-09-13
    • 2011-11-16
    相关资源
    最近更新 更多