提问者:小点点

React/Redux开发应该是面向对象编程还是函数编程?[关闭]


编辑(2021-02-12):自从问了这个问题,我花了很多时间在React上

有一个相关的SO问题

我最近加入了React

在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方法和mapstatetrops作为道具传递。加上不可变数据的概念,这似乎有利于函数式编程方法,其中所有函数都是一级函数。上面的组件现在开始看起来像:

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 vs FP是一个广泛的话题;然而在React/Redux的范围内,我希望有一个正确的答案。:)


共1个答案

匿名用户

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

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

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

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

呈现组件仅呈现来自道具的数据,因此是无状态组件,可以使用函数创建。这些组件不知道redux,测试这些组件非常容易。

容器组件管理一个状态并知道redux,它们分派操作并订阅redux状态。它们是状态完整的组件,可以使用ES6类创建。

您可以在redux文档中找到这些解释