记录一些最近写前端的思考总结,也算是给自己的技术随笔开个篇

在接触以 React,Vue 为代表的工程化前端框架前,我还是一个拿着 jQuery 手撸特效和手写 CSS 的切图仔,捣鼓 Vue 时接触到的一个非常核心的概念就叫做“双向绑定”,这里的双向绑定指的是视图(template)与状态(state)的双向绑定,状态的变化直接触发组件的渲染,不需要手写控制和更新渲染的 js 函数了(没错这是我之前干的事)

这篇要讨论的这个概念,应该也不是我发明的新词,叫 URL 与状态的双向绑定,字面意思来说,在刷新页面或跳转页面时解析 URL 并对应更新组件的状态,在组件状态更新时同步更新 URL,为什么要引入这种机制嘞?

比如我目前在做的一个项目是一个管理后台,在一个非常典型的日志查询场景,可以选择和调整很多查询参数进行查询,但是由此就引出了一个问题,如果按照目前 Vue 双向绑定的写法,变更查询组件的状态(选择或输入参数等)不会反映到 URL 上,这时如果我需要将一组查询好的结果分享给同事,只能复制当前的页面链接给他,让他进入后再选择和我一样的查询参数,可以看到有一部分没有包含在 URL 中的信息其实是被丢弃掉了,另外在进行站内跳转时也无法跳转的更“具体”,只能跳转到 router 定义的页面在初始渲染完成后的样子

这就引入URL与状态双向绑定的好处了,比如我在日志查询页面中选择查询方法为 POST ,等级为 ERROR 的日志,监听组件对应的状态变更,并更新URL(假设为?method=POST&level=ERROR),同理适用于其他的变更

当然做到监听组件状态更新 URL 只是做到了双向绑定的一向,要想让你的同事真的恢复到你当前页面的状态还需要实现另一向的操作,即将 URL 解析到组件状态,往往是在页面组件 mount 时解析当前的 URL 路径与QueryString,将其中的参数解析出来并与组件的状态进行同步,事实上就实现了

URL ⇔ 组件状态 ⇔ 组件视图

带给用户的直观体验就是视图与 URL 的绑定,这时如果你将浏览器中的链接粘贴给同事,他在打开时就可以复现你当前的组件状态,进而得到你目前的视图界面了

总结一下,实现 URL 与状态的双向绑定其实就是需要实现

  • 监听组件状态更新URL(通过 watch 或 $emit 等手段)

  • 将 URL 解析到组件状态(如在组件 mount 时将 URL 参数解析并赋值给组件的 data 状态)

带来的好处有

  • 分享链接可以让访问者完整复现当前页面的状态(至少是复现到你希望的粒度)

  • 站内跳转可以随心所欲跳转到任何可能的状态(而且仅通过 URL 这种 Web 原生的方式,而非使用 Vuex 之类的状态管理)

这样的功能业界其实也已经有过一些开源库能够自动实现组件状态与 URL 查询参数的绑定,奈何自动化的方案给出的 URL 都太过冗余,而我在命名方面又是一个强迫症,秉承着奥卡姆剃刀原则,我还是手动实现了每个状态的绑定与解析,虽然较为机械化,但是往往就是在这种时候,我可以听着音乐哼着歌,以近乎肌肉记忆的状态有节律地敲打键盘,把这些不需要思考的代码写好

比起调 infra 里那些摇摆不定,反复横跳,此起彼伏的 bug,写前端,调界面逐渐变成了一件放松身心的事~

写于 22 年 4 月

前端随笔0:URL与状态的双向绑定的更多相关文章

  1. Vue2.0源码阅读笔记--双向绑定实现原理

    上一篇 文章 了解了Vue.js的生命周期.这篇分析Observe Data过程,了解Vue.js的双向数据绑定实现原理. 一.实现双向绑定的做法 前端MVVM最令人激动的就是双向绑定机制了,实现双向 ...

  2. 如何在Vue2中实现组件props双向绑定

    Vue学习笔记-3 前言 Vue 2.x相比较Vue 1.x而言,升级变化除了实现了Virtual-Dom以外,给使用者最大不适就是移除的组件的props的双向绑定功能. 以往在Vue1.x中利用pr ...

  3. 前端笔记之微信小程序(二){{}}插值和MVVM模式&数据双向绑定&指令&API

    一.双花括号{{}}插值和MVVM模式 1.1 体会{{}}插值 index.wxml的标签不是html的那些标签,这里的view就是div. {{}}这样的插值写法,叫做mustache语法.mus ...

  4. zabbix添加对web页面url的状态监控

    zabbix3.0.4添加对web页面url的状态监控 1.应用集配置 在配置—>主机中打开主机列表,选择需要添加监控主机的web,创建应用集 2.web监测配置 选择web场景,再单击右上角的 ...

  5. 前端 | 自定义组件 v-model:Vue 如何实现双向绑定

    v-model 是 Vue 中一个常用的指令,常用于表单中的数据绑定.如下基本用法想必大家都很熟悉,data 中的 checked 属性的值就会随着多选框的状态实时变化. <el-checkbo ...

  6. 前端vue之属性指令、style和class、条件渲染、列表渲染、事件处理、数据双向绑定、表单控制、v-model进阶

    今日内容概要 属性指令 style和class 条件渲染 列表渲染 事件处理 数据的双向绑定 v-model进阶 购物车案例 内容详细 1.属性指令 <!DOCTYPE html> < ...

  7. vue2.0 双向绑定原理分析及简单实现

    Vue用了有一段时间了,每当有人问到Vue双向绑定是怎么回事的时候,总是不能给大家解释的很清楚,正好最近有时间把它梳理一下,让自己理解的更清楚,下次有人问我的时候,可以侃侃而谈. 一.首先介绍Obje ...

  8. <meta http-equiv="refresh" content="0; url=">是什么意思?

    页面定期刷新,如果加url的,则会重新定向到指定的网页,content后面跟的是时间(单位秒),把这句话加到指定网页的<head></head>里一般也用在实时性很强的应用中, ...

  9. ORACLE SQL前端补0的三种方式。

    前端补0的三种方式. select lpad(sal,8,'0') from emp;select to_char(sal,'00000000') from emp;select substr('00 ...

  10. HTML <meta> 标签 遇到<meta http-equiv="refresh" content="0; url=">详解

    页面定期刷新,如果加url的,则会重新定向到指定的网页,content后面跟的是时间(单位秒),把这句话加到指定网页的<head></head>里一般也用在实时性很强的应用中, ...

随机推荐

  1. [FCC] Cash Register 计算找零

    题目地址: https://chinese.freecodecamp.org/learn/javascript-algorithms-and-data-structures/javascript-al ...

  2. Qt网络编程-书接上文,浅谈TCP文件收发,以及心跳包

    qt网络编程-书接上文,浅谈文件收发 上文Qt网络编程-从0到多线程编程中谈到 在qt中的qtcpsocket通讯的用法,接下来浅谈一下关于tcp通讯的实际应用,当然了由于是浅谈,也不能保证其功能的完 ...

  3. 【转载】【Word】项目编号应用样式后出现黑框的解决方案

    本文中的宏代码来自: https://www.zhihu.com/question/38985919 Word使用项目编号后,出现黑框,如下图所示: 网上大多数解决方案在重新打开文档后,依然还是有黑框 ...

  4. Zookeeper详解(01) -概述

    Zookeeper详解(01) -概述 概念 Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目. Zookeeper从设计模式角度来理解,是一个基于观察者模式设计的分 ...

  5. 手撕AVL树(C++)

    阅读本文前,请确保您已经了解了二叉搜索树的相关内容(如定义.增删查改的方法以及效率等).否则,建议您先学习二叉搜索树.本文假定您对二叉搜索树有了足够的了解. 效率? 众所周知,在平衡条件下,对二叉搜索 ...

  6. (9)go-micro微服务Redis配置

    目录 一 go-redis介绍 二 go-redis安装 三 redis初始化连接 四 存储mail邮件 五 存储token 六 最后 一 go-redis介绍 Redis(Remote Dictio ...

  7. 一幅图像为f=[1 4 7;2 5 8;3 6 9],设kx=1.8,ky=1.3,试采用最邻近插值对其进行放大,写出新图像矩阵。

    一幅图像为f=[1 4 7;2 5 8;3 6 9],设kx=1.8,ky=1.3,试采用最邻近插值对其进行放大,写出新图像矩阵.(请写出解题步骤,并编写程序进行结果验证) 参考 matlab代码如下 ...

  8. TCP通信的客户端代码实现-TCP通信的服务器端代码实现

    TCP通信的客户端代码实现 两端通信时步骤:1.服务端程序,需要事先启动,等待客户端的连接.⒉.客户端主动连接服务器端,连接成功才能通信.服务端不可以主动连接客户端.在Java中,提供了两个类用于实现 ...

  9. 【随笔记】ATECC608 加密芯片调试记录

    芯片通信测试 根据芯片手册,ATECC608B 的 7bit 器件地址是:0x35 root@linux:/usr/bin# i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a ...

  10. 【开源】libserial_protocol:适用于单片机的串口通信协议基础库

    借助五一假期,写了一个串口通信协议基础库,虽然写着适用于单片机,但实际上并不限制具体的硬件平台. 特点如下: 不涉及到具体硬件,libserial_protocol 纯软件协议,与具体硬件分离. 内存 ...