状态决定视图——基于状态的前端开发思考

在现在的前端社区,关于MVVM、Model driven view 之类的概念,已经算是非常普及了。React/Vue 这类框架可以算是代表。

而自己虽然有 React/Vue 的使用经验,也了解 MVVM,状态机等核心概念,但是却一直没有很好的应用。

直到前几天接手一个组件开发的需求,写之前尝试细细分析时,才突然想通这之间的联系。

Emmm……内容比较浅,并不是什么了不得的神兵利器。更多的是个人的感悟。

个人困惑

自己在前一段时间里,陷入了如何写好代码的困惑之中,在学习了《重构》、《代码整洁之道》等知识之后,确实有一些好转。但是写代码总是要重构才能好一些些,也是很麻烦的事情,于是就有了如下的思考。

前端与状态

现在的前端开发中,对于状态的管理是重中之重。

而使用 React/Vue 这类 MVVM 框架,通过组件化、自动绑定等方式,能有效降低前端开发时的复杂度。

MVVM

提到状态就不得不提到MVVM框架,而MVVM的框架的核心,并不是双向绑定或者依赖收集什么的,而是: 状态决定视图 。

用代码描述就是:

View = ViewModel(Model)

理想情况下,ViewModel是纯函数,给定相同的Model,产出相同的View。

随着前端的发展,Web应用的状态管理愈发复杂,然而由于前端的一些特性:

  • 代码开源
  • 请求透明
  • 不保存用户数据

也决定了前端只负责整个Web应用上的视觉和交互层,凡是涉及到数据的,后端必然要做严谨的校验,不相信任何前端的请求。

所以前端的核心工作,就是提供一个友善的人机交互的操作界面。当然,这也符合广义上的前端定义。

而 MVVM 的出现,能有效的提高前端开发的效率和品质,从而得到了大规模的发展与应用。

复杂度

在《代码大全2》这本书中,有句让我印象深刻的话:

软件工程的本质即是管理复杂度。

细细想来,也确实是如此。

前端开发自然也属于软件开发,管理复杂度恰恰也是前端目前的核心问题。

有限状态机

那么如何更好的管理前端软件的复杂度? React 的状态机思想给出了自己的答案。

状态机是我在学习计算机中,时常听到的一个概念,比如学 React 时,会提到 React 就是个状态机,听团队关于编译原理的分享时,也会听到状态机。所以就去专门补习了这个概念。

有限状态机在维基百科上的描述如下:

有限状态机(英语:finite-state machine,缩写:FSM)又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。

有限状态机并不是一个复杂的概念

简单说,它有三个特征:

  • 状态总数(state)是有限的。
  • 任一时刻,只处在一种状态之中。
  • 某种条件下,会从一种状态转变(transition)到另一种状态。
    它对JavaScript的意义在于,很多对象可以写成有限状态机。

启示

随着对状态决定视图与状态机两个概念的学习与思考,于是有了新的思路:

状态决定视图,Action则负责完成状态间的转移,那么写好代码的核心在于,用最恰当的状态去描述界面,用最恰当的动作去完成状态间的转移。

Emmm……很简单的概念,但是自己之前一直没有想的很清楚。

总结

随着对这个概念的了解,自己在开发时的思路也愈发的清晰化。

自己现在写代码之前,会思考一系列问题,想清楚再下手:

  • 这个页面有几种状态(初始化状态?成功状态?失败状态?出错状态?)
  • 描述这些状态需要什么参数
  • 在什么时候转变状态,需要改变哪些部分

把这些问题想清楚了,剩下的工作就是跟着思路,完成数据与UI部分。

作者:Lxxyx

来源:51CTO

时间: 2025-01-20 18:49:00

状态决定视图——基于状态的前端开发思考的相关文章

基于Cairngorm的Silverlight开发系列

  最近做了几个silverlight的项目都用到了MVC的开发架构,在silverlight中,MVC.MVVM等架构都很多.各个第三方的公司在推出自己的架构的同时也专门会发布一个for silverlight的版本(如CSLA .NET 3.6支持Silverlight 2 ).  我在做项目时选用了Cairngorm这个MVC框架,因为之前我做flex开发时就用的是他,silverlight中对这个框架进行了移植,用法.思路都是一致的,这里总结了一下自己的开发经验共享出来.   两个用Ca

WF从入门到精通(第十四章):基于状态的工作流

学习完本章,你将掌握: 1.理解状态机的概念以及它怎样被模拟到工作流处理中的 2.创建基于状态的工作流 3.运用初始(initial)和终止(terminal)状态条件 4.使用代码进行状态的切换 在第四章"活动和工作流类型介绍"中,我阐述过你使用WF所能创建的工作流类型,在那里我提到过基于状态的工作流.基于状态的工作流模型被认为是有限自动机(finite state machine).基于状态的工作流在工作流需要和外部事件进行许多交互的场合中大出风头.在事件触发并被工作流处理的时候,

android-如何更新视图的状态?

问题描述 如何更新视图的状态? 我在程序中创建了RealViewSwitcher 控件,然后使用一些代码在OnScreenSwitchListener 中来更新UI. public void onScreenSwitched(int screen) { //1 更新一些 text view //2 繁冗的程序 } 大量的程序执行完后,UI才更新了.如何同步更新 text views ? 解决方案 我理解的更新可以用Handler去做

哪种前端开发是基于c++语言的?

问题描述 哪种前端开发是基于c++语言的? c++源代码已经写出来并调试好了,现在想根据这个做出一种前端程序 可视化的,不知道该做哪种? 解决方案 C++实在不是什么好的应用程序编程语言,它糟糕到什么程度呢?即便你精通C++,你想用它开发一个应用程序的复杂度都不如再学一种语言,用那种语言来开发. 解决方案二: 你可以用C#写一个窗体 然后调用C++代码 解决方案三: Qt和MFC都是基于C++的,建议用Qt,这个跨平台,而且学习曲线比较平滑 解决方案四: Mfc,Qt算是目前两个好的Ui库了,然

基于jQuery实现多标签页切换的效果(web前端开发)_jquery

这里,实现多标签页效果的方法有两个,一个是基于DOM的,另一个是基于jquery的,此次我写的是一个对于一个电话套餐的不同,显示不同的标签页 方法一: 首先,我们要把页面的大体框架和样式写出来,html和css代码如下: <ul id="tab"> <li id="tab1" onclick="show(1)">10元套餐</li> <li id="tab2" onclick=&quo

跨平台的应用开发工具和前端开发工具

文章描述:前端开发者的跨平台移动应用开发策略及工具. 愉悦的周五,早些回到家,冲澡吃饭照顾猫咪家务完毕已然超过九点的样子.登录博客后台,进入编辑页面,才觉得些许轻松安逸.不坏,一天里能有这么一会沉浸在这样的感觉里,足够了. 在之前的一篇文章中,我们曾经讨论过,对于交互和视觉设计相关职能的从业人员来说,从传统Web行业向移动应用领域转型的过程中需要学习和注意的问题.这篇文章中提到过"混合型应用"的概念,以及与之相关的两本开发指导书籍.今天这篇文章的英文原文,就是来自这两本书的作者--移动

百度外卖如何做到前端开发配置化

内容来源:2017年5月13日,徐辛承在"H5梦工厂"进行<前端开发配置化方案>演讲分享.IT大咖说作为独家视频合作方,经主办方和讲者审阅授权发布.    阅读字数:2017  | 9分钟阅读 摘要前端开发的主要职能就是把网站的界面更好地呈现给用户,它涵盖的知识面非常广,既有具体的技术,又有抽象的理念.百度外卖高级前端工程师徐辛承,为我们带来关于百度外卖前端开发配置化方案的分享. 内部平台开发中的痛点 所有业务线由一个大的内部平台来完成,最后集中下放到APP中.这个系统的缺

[译]Angular vs React:谁更适合前端开发

本文讲的是[译]Angular vs React:谁更适合前端开发, 原文地址:Angular vs. React: Which Is Better for Web Development? 原文作者:Brandon Morelli 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者:龙骑将杨影枫 校对者:Larry.薛定谔的猫.逆寒 大家总在写文章争论,Angular 与 React 哪一个才是前端开发的更好选择(译者:在中国还要加上 vue :P).我

基于YUI的组件开发(1)【珍珠奶茶帮】

分享人:拔赤 导语:如今的前端开发越来越OO,也越来越注重重用,娴熟的用js写出OO的前端代码已然是一个前端工程师的基本素质之一.与此同时,网站的开发过程也越来越类似于堆积木.模块思想也逐渐深入的应用在大型网站的开发之中,指导网站的设计和架构,在今天[珍珠奶茶帮]的分享中,我们来对基于YUI的组件开发做深入探讨. 模块化的前端开发 在web技术迅猛发展的今天,大型网站的前端开发越来越依赖复杂的团队配合,而模块化思想则能有效的指导团队开发的效率提升和成本压缩.它使得我们在项目中将注意力放在颗粒化组