首页 > 其他分享 >5.前端设计模式之容器/展现模式

5.前端设计模式之容器/展现模式

时间:2023-09-11 20:33:14浏览次数:47  
标签:容器 前端 视图 React 组件 import 设计模式 dogs useDogImages

Enforce separation of concerns by separating the view from the application logic

通过将视图层和应用逻辑分离实现关注点分离 

这个有点像Java应用开发中经常看到的MVC架构模式,实现数据、业务逻辑和展示层分离。

这个模式在React中需要两个组件实现:容器组件主要负责获取数据,获取到数据后把数据交给视图组件,视图组件负责根据数据展现界面。

示例应用显示一组宠物狗图片:

容器组件DogImagesContainer只关心怎么获取数据不关系怎么展现数据。负责访问API获取宠物狗图片URL并交给视图组件DogImages:

import React from "react";
import DogImages from "./DogImages";

export default class DogImagesContainer extends React.Component {
  constructor() {
    super();
    this.state = {
      dogs: []
    };
  }

  componentDidMount() {
    fetch("https://dog.ceo/api/breed/labrador/images/random/6")
      .then(res => res.json())
      .then(({ message }) => this.setState({ dogs: message }));
  }

  render() {
    return <DogImages dogs={this.state.dogs} />;
  }
}

视图组件DogImages不关心怎么获取数据,只关系怎么展现数据:

import React from "react";

export default function DogImages({ dogs }) {
  return dogs.map((dog, i) => <img src={dog} key={i} alt="Dog" />);
}

这样就实现了关注点分离。完整代码

React 16.8后新增了Hooks功能,使用hook可以更简洁的实现关注点分离,使用自定义hook useDogImages负责怎么获取数据:

import { useState, useEffect } from "react";

export default function useDogImages() {
  const [dogs, setDogs] = useState([]);

  useEffect(() => {
    async function fetchDogs() {
      const res = await fetch(
        "https://dog.ceo/api/breed/labrador/images/random/6"
      );
      const { message } = await res.json();
      setDogs(message);
    }

    fetchDogs();
  }, []);

  return dogs;
}

在视图组件中使用自定义hook useDogImages拿到需要的数据并展现:

import React from "react";
import useDogImages from "./useDogImages";

export default function DogImages() {
  const dogs = useDogImages();

  return dogs.map((dog, i) => <img src={dog} key={i} alt="Dog" />);
}

完整代码 

5.前端设计模式之容器/展现模式_React

标签:容器,前端,视图,React,组件,import,设计模式,dogs,useDogImages
From: https://blog.51cto.com/u_14256460/7438167

相关文章

  • 【设计模式】备忘录模式Memento - 在聊天会话中记录历史消息
    (目录)相较于其他设计模式,备忘录模式不算太常用,但好在这个模式理解、掌握起来并不难,代码实现也比较简单,应用场景更是比较明确和有限。一般应用于编辑器或会话上下文中防丢失、撤销、恢复等场景中。模式原理分析备忘录模式的原始定义是:捕获并外部化对象的内部状态,以便以后可......
  • vue中使用xlsx插件前端读取解析excel文件
    问题描述工作中一般都是后端去解析excel数据,前端使用上传组件去将excel组件丢给后端,后端使用一些插件去解析excel(比如hutool工具类)不过有些情况下,前端也需要去做一些excel的解析,比如产品经理说,在上传excel文件之前,要做一个excel的图表化预览审核查看啥的,没问题的话,再丢给后端去......
  • fyne container.NewHSplit水平分割容器 Go golang
    环境:gofyne 要求:go项目中将窗口分成左右两个容器,实现窗口分割效果:实现代码:1packagemain23import(4"fyne.io/fyne/v2"5"fyne.io/fyne/v2/app"6"fyne.io/fyne/v2/container"7"fyne.io/fyne/v2/widget"8)91......
  • 基础设施SIG月度动态:「龙蜥大讲堂」基础设施系列专题分享完美收官,容器镜像构建 2.0 版
    基础设施SIG(OpenAnolisInfraSIG)目标:负责OpenAnolis社区基础设施工程平台的建设,包括官网、Bugzilla、Maillist、ABS、ANAS、CI门禁以及社区DevOps相关的研发工程系统。01SIG整体进展1.龙蜥大讲堂-基础设施系列专题分享完美收官,8月邀请了多位SIG核心贡献者分享了包括......
  • 前端代码规范与最佳实践
    1.代码规范的重要性在前端开发中,代码规范是非常重要的。它可以提高代码的可读性、可维护性和可扩展性,减少bug的产生,并且方便多人协作开发。本文将介绍一些前端代码规范的最佳实践,并给出一些示例。2.HTML代码规范2.1使用语义化的标签使用语义化的HTML标签可以增加代码的可读......
  • 最简单的前端分页---思路就是监听分页变化,然后slice数据源
    element版本的背景有些页面显示数据量不大,或者后端分页比较复杂;不考虑性能情况下前端分页不失为比较好的选择。实现技术点:VUE+Element(el-table,el-pagination)DEMO<template><divclass="app-container"><divclass="content"><el-tablev-loa......
  • 设计模式--禅
    设计模式视频一、六大设计原则1、单一职责一个方法尽可能做一件事情单一职责原则(SingleResponsibilityPrinciple,SRP)2、接口隔离原则尽量依赖最小的接口六大设计模式原则-接口隔离原则3、依赖倒置原则:高层模块不应该依赖低层模块(基础模块),两者都应该依赖其抽象,传递的是抽象抽象不应......
  • 前端生成二进制文件并下载
    //生成十六进制数据consthexData='7E02000000010000000aB77E';//这里是示例的十六进制数据//将十六进制数据转换为字节数组constdata=hexToBytes(hexData);//创建Blob对象constblob=newBlob([data],{type:'application/octet-stream'});//创建下载链......
  • Spring源码分析(七)容器的扩展点(FactoryBean)
    在上篇文章中我已经对容器的第一个扩展点(BeanFactoryPostProcessor)做了一系列的介绍。其中主要介绍了Spring容器中BeanFactoryPostProcessor的执行流程,以及Spring自身利用了BeanFactoryPostProcessor完成了什么功能,对于一些细节问题可能说的不够仔细,但是当前阶段我想要做的......
  • 纯前端也可以访问文件系统!
    https://www.cnblogs.com/songyao666/p/17691691.html 前言周末逛github的时候,发现我们只需要在github域名上加上1s他就能够打开一个vscode窗口来阅读代码,比起在github仓库中查看更加方便然后我就想网页端vscode能不能打开我本地的项目呢,带着这个疑惑我打开了网页版vscode,它......