浅谈MVVM ——Model-View-View-Model

news2024/11/17 21:56:28

浅谈MVVM ——Model-View-View-Model

前言:

笔者最近接到这样一个机器人项目,接入他们的机器人平台做二次开发,开发自己的opk移植到机器人上做医院展示使用。opk是必须使用机器人厂家提供的经过一定封装过的,该opk的架构是MVVM。笔者是首次写这样的结构,所以想浅谈自己的一些理解。

正文:

MVVM框架搭建的前端程序,把数据和页面进行了分离,分别为View层、ViewModel层和Model层。他们之间的交互如图所示:
在这里插入图片描述

View层(视图层)的主要职责是页面的渲染,也仅仅是用于页面的渲染。

Model层(模型层)的主要职责是封装核心数据。模型是指代表真实状态内容的领域模型(面向对象),或指代表内容的数据访问层(以数据为中心)。

ViewModel(视图模型层)就像是一个桥梁用于连接View层和Model层,负责它们之间的数据通信。百度上是这样说的:视图模型是暴露公共属性和命令的视图的抽象。MVVM没有MVC模式的控制器,也没有MVP模式的presenter,有的是一个绑定器。在视图模型中,绑定器在视图和数据绑定器之间进行通信。

笔者才接触这样框架的时候有这样的疑惑,一个页面是由组件和数据渲染出来的,那么只要有View负责渲染组件,Model负责分发数据不就可以了?弄出一个ViewModel是为了什么,这不是使得页面和数据之间的通信多走了一层,何必呢?

我们可以结合代码进行一定的理解:

View.ts: 这是一段View里面的代码,其实你并不需要关心太多,它最大的最用只是render出组件。我们可以看到View里面拿到ViewModel处理过的数据放在了组件里面。

export class DemoScreen extends BaseComponent<BaseComponentProps, DemoViewModel, DemoVoice> {

    public viewModel: DemoViewModel;

    public constructor(props: BaseComponentProps) {
        super(props);

        this.viewModel = new DemoViewModel();
        let voice = new DemoVoice(this.viewModel);

        //关联ViewModel及Voice的生命周期到当前界面上
        this.setViewModel(this.viewModel);
        this.setVoice(voice);

    }

    public componentDidMount() {
        //重写界面的didMount,必须调用super
        super.componentDidMount();
    }

    public componentWillMount() {

    }

    public componentWillUnmount() {
        //重写界面的Unmount,必须调用super
        super.componentWillUnmount();
    }

    public render() {
        speechApi.setRecognizeMode(true);
        return (
             <View>
                <Text style={{ fontSize: 17, color: 'red' }}> {demoModel.getInfoText()}</Text>
            </View>
        );

    }
}

Model.ts:相对应的,这是一段Model里面的代码。可以看出这里面只负责set和get数据,除此之外没有别的操作了。

export class DemoModel {
    @observable private infoText = 'Hello Robot!';

    @action
    public setInfoText(infoText: string) {
        console.log('DemoVoice Set info text : ' + infoText);
        this.infoText = infoText;
    }

    public getInfoText(): string {
        return this.infoText;
    }
}

export const demoModel = new DemoModel();

ViewModel.ts: 真正的数据处理就在ViewMode里面了。这样做的好处是View和Model都是很纯粹的,View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。并且开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xaml代码。

export class DemoViewModel extends BaseViewModel {

    public constructor() {
        //super参数为ViewModel与Trigger相互通信的标识,必须保证与Trigger的一致
        super('Demo');
    }

    public onStart() {

    }

    public onStop() {

    }

    public exit() {
        //发送消息到Trigger中,eventId为消息id, data为携带的数据
        this._apiTrigger(1001, '');
    }

    public showSpeechText(text: string) {
        console.log('DemoVoice : set ' + text);
        demoModel.setInfoText(text);
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/72878.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

48W字?GitHub上下载量破百万的阿里:图解Java、网络、算法笔记

Java基础这个东西&#xff0c;无论在哪个公司都被看得尤为重要&#xff0c;而面试中关于基础的问题也是层出不穷。所以基础可以说是重中之重&#xff0c;当你的基础打牢了&#xff0c;其他的也就没有那么重要了。 说到基础&#xff0c;无外乎操作系统&#xff0c;网络&#xf…

pikachu-CSRF-SSRF-RCE速通

pikachu-CSRF-SSRF-RCE速通 目录pikachu-CSRF-SSRF-RCE速通CSRFCSRF(get)CSRF(post)CSRF TokenSSRFSSRF(curl)SSRF(file_get_content)RCEexec "ping"RCE exec "eval"CSRF 跨站请求伪造&#xff0c;说的通俗一点就是攻击者构造出某个网站的数据包请求并部署…

p3.第一章 基础入门 -- Python编程基本概念 (三)

1.2.2 Python语言 1.2.2.1 Python发展 1989年圣诞节期间&#xff0c;为了打发无聊的时间&#xff0c;荷兰人Guido van Rossum&#xff08;吉多范罗苏姆&#xff09;&#xff08;数学、计算机双硕士&#xff0c;2005年加入Google&#xff0c;2013年加入DropBox&#xff09;&am…

JavaUUID的理解

可笑&#xff0c;你竟然不知道 Java 如何生成 UUID - 沉默王二博客 UUID是通用唯一标识符的意思&#xff0c;就是唯一不重复的一串字符。 UUID的用途&#xff1a; 随机生成的文件名&#xff1b;Java Web 应用程序的 sessionID&#xff1b;数据库表的主键&#xff1b;事务 ID&…

EMQ 助力阿里云洛神云网络构建新一代“亿级并发、百万级吞吐”NLB 网络型负载均衡系统

万物智联的数字化时代,我们正走在从“数据量变”到“连接质变”的道路上。在日益丰富的物联网应用场景中,实现海量设备与云端之间双向通信连接,分析并从中获得实时洞察成了打造成功物联网解决方案的核心推动因素。EMQ 映云科技(以下简称“EMQ”)作为全球领先的开源物联网基础设…

UE在TextRender上显示中文文本

文章目录 1.实现目标2.实现过程2.1 添加字体2.2 创建字体材质2.3 将字体应用到TextRender3.参考资料1.实现目标 UE的UMG可以正常支持中文,但是TextRender并不支持中文,因此需要添加本地离线中文字体库,使TextRender显示中文。 2.实现过程 2.1 添加字体 (1)选择User Int…

day6bom操作浏览器

apis-day6bom-操作浏览器 文章目录apis-day6bom-操作浏览器1、window对象1.1BOM(浏览器对象模型1.2定时器-延时函数1.3JS执行机制&#xff08;重要&#xff09;1.4 location对象1.5 navigator对象1.6histroy对象&#xff08;用的少&#xff09;2、swiper插件3、本地存储&#x…

当前的数字化,CIO 们到底需要什么?

“做数字化&#xff0c;没人、没钱、没资源&#xff0c;但还要做效果&#xff0c;该怎么办&#xff1f;” 这是很多 CIO 当下都面临的困境。 那么&#xff0c;对于不同企业来说&#xff0c;到底该如何有效探索数字化转型之路呢&#xff1f; 数字化转型的三个阶段 Gartner 把…

简易黑客初级教程:黑客技术,分享教学

前言 第一节&#xff0c;伸展运动。这节操我们要准备道具&#xff0c;俗话说&#xff1a;“工欲善其事&#xff0c;必先利其器”(是这样吗?哎!文化低……)说得有道理&#xff0c;我们要学习黑客技术&#xff0c;一点必要的工具必不可少。 1&#xff0c;一台属于自己的可以上…

【面试题】2023 中级前端面试题

前言 从前端学习到找一份合适的工作&#xff0c;大大小小的面试必不可少&#xff0c;所以我对初级前端面试题进行了初步整理&#xff0c;也方便自己查阅&#xff0c;也希望对小伙伴们有所帮助&#xff01; 给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&…

C语言——内存中数据存储的详解(整型与浮点型)

文章目录1.数据类型的详细介绍1.1数据类型介绍1.2类型的基本归类整型类型浮点类型构造类型指针类型空类型2.整型在内存中的存储2.1原码、反码、补码2.2大小端存储大小端存储存在的意义编写一个程序判断当前机器的存储方式是大端存储还是小端存储2.3经典习题练习一练习二练习三c…

Prometheus部署Prometheus Server、Pushgateway、Node exporter、AlertManager

目录1. 安装Prometheus Server1.1 下载解压1.2 修改配置文件prometheus.yml1.3 启动Prometheus Server2. 安装Pushgateway2.1 下载解压2.2 启动Pushgateway3. 安装Node Exporter3.1 下载解压3.2 启动Node Exporter4. 安装Alertmanager4.1 下载解压4.2 启动Alertmanager1. 安装P…

CS5518 MIPI转LVDS转换方案芯片|DSI转LVDS转换方案芯片

CS5518 是一款MIPI DSI 至 LVDS 转换器方案芯片。 Capstone CS5518是一款MIPI DSI输入、LVDS输出转换芯片。MIPI DSI 支持多达4个局域网&#xff0c;每条通道以最大 1Gbps 的速度运行。LVDS支持18位或24位像素&#xff0c;25Mhz至154Mhz&#xff0c;采用VESA或JEIDA格式。它只…

CMake中target_sources的使用

CMake中的target_sources命令用于将源添加到target&#xff0c;其格式如下&#xff1a; target_sources(<target><INTERFACE|PUBLIC|PRIVATE> [items1...][<INTERFACE|PUBLIC|PRIVATE> [items2...] ...]) # general formtarget_sources(<target>[<…

网络安全之反序列化漏洞分析

简介 FastJson是alibaba的一款开源JSON解析库&#xff0c;可用于将Java对象转换为其JSON表示形式&#xff0c;也可以用于将JSON字符串转换为等效的Java对象分别通过toJSONString和parseObject/parse来实现序列化和反序列化。 使用 对于序列化的方法toJSONString()有多个重载…

LSTM反向传播原理——LSTM从零实现系列(2)

一、LSTM反向传播介绍 LSTM的反向传播过程相对复杂&#xff0c;主要因为其对应的控制门较多&#xff0c;而对于每一个控制门我们都需要求导&#xff0c;所以工作量较大。 首先我们根据LSTM结构图分析一下每个控制门的求导过程。在讲解反向传播之前&#xff0c;先了解一些要用到…

web课程设计网页规划与设计:鲜花网站设计——基于HTML+CSS+JavaScript制作网上鲜花网页设计(5页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

redis的热key、大key

目录 1.概述 2.查找方法 2.1.知道具体哪个key有问题 2.2.不知道具体哪个key有问题 3.处理方法 3.1.大key的处理方法 3.2.热key的处理方法 1.概述 大key&#xff1a; 含有较大数据或含有大量成员的Key称之为大Key&#xff0c;常见的大key如&#xff1a; String类型的Ke…

用友降运维成本实践:OceanBase替换MySQL,实现高可用

导语&#xff1a;随着业务模型的不断变化使运维难度越来越大&#xff0c;用友IT内部采用任务调度中心XXL-JOB和配置管理中心Nacos来实现公司IT分布式任务调度和微服务开发。但XXL-JOB和Nacos集群数量的增多又使其支撑系统MySQL难以招架。 为了寻找一款既能提供高可用又能统一管…

git常用命令(linux和windows通用)

本文的命令已可满足日常需求 配置用户信息 git config --global user.name “github用户名” git config --global user.email “github绑定邮箱"查看配置信息 git config --global user.name git config --global user.email~/.bashrc文件介绍 ~指当前用户的根目录&…