使用 JS 快速理解 Container/Presentational Pattern

简介: 在现代Web前端开发中,构建可维护、可扩展的应用程序变得越来越重要。为了实现这一目标,开发者需要遵循一些设计模式和最佳实践。其中之一是Container/Presentational(容器/展示)模式,它是一种用于组织和管理前端代码的技术。本文将深入探讨Container/Presentational模式的概念,介绍如何使用JavaScript实现它,并探讨它在开发中的应用场景、优点和缺点。我们还将介绍一些知名项目中使用到这种模式的实际案例。

什么是Container/Presentational模式?

Container/Presentational模式是一种前端开发技术,旨在将应用程序的逻辑和展示分离。它通过将组件分为两个独立的类别来实现这种分离:容器组件(Container Components)和展示组件(Presentational Components)。

容器组件负责处理数据逻辑、与后端交互以及状态管理等复杂任务。它们通常包含了业务逻辑和状态,并通过props将数据和函数传递给展示组件。展示组件则负责展示数据、处理用户交互和渲染界面。

Container/Presentational模式的核心思想是将组件的关注点分离,使得每个组件都可以专注于自己的职责。这种分离提高了代码的可维护性和可重用性,使得团队成员可以更好地协作开发。

使用JavaScript实现Container/Presentational模式

下面我们将介绍如何使用JavaScript实现Container/Presentational模式。我们将以React为例进行说明,因为React是目前广泛应用的前端框架,同时也对Container/Presentational模式提供了良好的支持。

创建容器组件

容器组件负责处理数据逻辑和状态管理。在React中,可以通过创建一个类组件来实现容器组件的功能。


class UserContainer extends React.Component {
   
  constructor(props) {
   
    super(props);
    this.state = {
   
      users: [],
      loading: true,
    };
  }

  componentDidMount() {
   
    // 从后端获取用户数据
    fetch('/api/users')
      .then(response => response.json())
      .then(users => {
   
        this.setState({
    users, loading: false });
      });
  }

  render() {
   
    const {
    users, loading } = this.state;
    if (loading) {
   
      return <div>Loading...</div>;
    }
    return <UserList users={
   users} />;
  }
}

在这个例子中,UserContainer组件通过在componentDidMount生命周期方法中获取用户数据,并将数据存储在组件的状态中。一旦数据加载完成,它会渲染展示组件UserList并将用户数据作为props传递给它。

创建展示组件

展示组件负责展示数据、处理用户交互和渲染界面。在React中,展示组件通常是无状态的函数组件。


function UserList({
    users }) {
   
  return (
    <ul>
      {
   users.map(user => (
        <li key={
   user.id}>{
   user.name}</li>
      ))}
    </ul>
  );
}

在这个例子中,UserList是一个展示组件,它接收一个名为users的props,并根据用户数据渲染一个用户列表。

组合容器和展示组件

最后,我们需要将容器组件和展示组件组合在一起,以构建完整的界面。


function App() {
   
  return <UserContainer />;
}

在这个例子中,App组件作为顶层组件,将UserContainer作为子组件进行渲染。

开发中的应用场景

Container/Presentational模式适用于各种前端开发场景,尤其适用于大型应用程序或需要与后端交互的复杂场景。下面是一些常见的应用场景:

  • 数据获取和处理:容器组件可以负责从后端获取数据,并对数据进行处理和转换,然后将处理后的数据传递给展示组件进行渲染。

  • 状态管理:容器组件可以负责管理应用程序的状态,并将状态传递给展示组件。这种方式可以帮助我们更好地组织和管理应用程序的状态逻辑。

  • 条件渲染和事件处理:容器组件可以处理用户交互事件,并根据条件来决定展示哪些展示组件或渲染哪些内容。

  • 复用和测试:通过将逻辑和展示分离,我们可以更容易地复用展示组件,并对它们进行单元测试,而不需要关心容器组件的复杂逻辑。

优点和缺点

Container/Presentational模式具有一些明显的优点,但也有一些潜在的缺点。

优点

  • 分离关注点:Container/Presentational模式能够将组件的关注点清晰地分离,使得每个组件都可以专注于自己的职责,提高代码的可维护性和可重用性。

  • 提高可测试性:由于容器组件通常包含了复杂的逻辑,而展示组件通常是无状态的,因此我们可以更轻松地对展示组件进行单元测试,而不需要关心容器组件的状态和依赖。

  • 提高团队协作:通过明确组件的职责和接口,Container/Presentational模式可以提高团队成员之间的协作效率,使得不同角色的开发者可以并行工作,并更好地理解和修改彼此的代码。

缺点

  • 引入额外的抽象层次:使用Container/Presentational模式可能会引入一些额外的抽象层次和代码结构,对于简单的应用程序可能会显得繁琐和冗余。

  • 学习成本和维护成本:使用Container/Presentational模式需要一定的学习成本,特别是对于新手来说。同时,维护大量的容器和展示组件也可能增加代码的复杂性。

知名项目中的应用

Container/Presentational模式在许多知名项目中得到了广泛应用。以下是一些使用该模式的实际案例:

  • React:React是一个流行的前端框架,它鼓励开发者使用Container/Presentational模式来组织和管理组件代码。

  • Redux:Redux是一个流行的状态管理库,它通过使用Container/Presentational模式来分离组件的数据逻辑和展示逻辑。

  • Angular:Angular是另一个常用的前端框架,它使用类似的概念来组织组件代码,将业务逻辑和展示逻辑分离。

  • Vue:Vue是一款渐进式JavaScript框架,它提供了一些工具和推荐做法,帮助开发者使用Container/Presentational模式来构建可维护的应用程序。

结论

Container/Presentational模式是一种在Web前端开发中广泛使用的技术,它能够帮助开发者组织和管理前端代码,提高代码的可维护性和可重用性。通过将组件的关注点分离,我们可以更好地复用和测试组件,并提高团队成员之间的协作效率。

在本文中,我们介绍了Container/Presentational模式的概念,并使用JavaScript和React提供了示例代码。我们还讨论了它的应用场景、优点和缺点,并列举了一些知名项目中使用到该模式的实际案例。

希望本文能帮助新手从入门到精通Container/Presentational模式,并在实际项目中应用这一技术,提升Web前端开发的质量和效率。

目录
相关文章
|
设计模式 缓存 JavaScript
JavaScript 的优雅编程技巧:Singleton Pattern
JavaScript 的优雅编程技巧:Singleton Pattern
|
设计模式 JavaScript 调度
JS案例:Observer Pattern(观察者模式)和Publisher-Subscriber Pattern(发布者/订阅者模式)
JS案例:Observer Pattern(观察者模式)和Publisher-Subscriber Pattern(发布者/订阅者模式)
134 0
JS案例:Observer Pattern(观察者模式)和Publisher-Subscriber Pattern(发布者/订阅者模式)
|
JavaScript 前端开发
深入理解 JavaScript 单例模式 (Singleton Pattern)
<button>Owen</button> <div id="modal"> <div class="main"> <div> 我是弹框 </div> </div> </div>
553 0
|
JavaScript
Js Pattern - Self Define Function
This pattern is useful when your function has some initial preparatory work to do andit needs to do it only once.
961 0
|
JavaScript 容器
Js Pattern - Namespace Pattern
bad code // BEFORE: 5 globals // Warning: antipattern // constructors function Parent() {} function Child() {} // a variable var some_var...
646 0
|
JavaScript 前端开发 设计模式
JavaScript设计模式学习(四)单件(Singleton Pattern)
  单件是JavaScript中最基本、最有用的设计模式,而你今后也会经常的使用这个模式。通过单件,我们可以把统一到一个逻辑单元中并且提供一个唯一的入口,这就保证你所有的引用都是用的这个全局资源。
910 0
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
96 2
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的小区物流配送系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的小区物流配送系统附带文章源码部署视频讲解等
123 4
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的宠物援助平台附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的宠物援助平台附带文章源码部署视频讲解等
82 4
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的宠物交易平台附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的宠物交易平台附带文章源码部署视频讲解等
73 4