【转】3个容易混淆的前端框架概念

大家好,我卡颂。

有3个容易混淆的前端框架概念:

  1. 响应式更新
  2. 单向数据流
  3. 双向数据绑定

在继续阅读本文前,读者可以思考下是否明确知道三者的含义。

这三者之所以容易混淆,是因为他们虽然同属前端框架范畴内的概念,但又不是同一抽象层级的概念,不好直接比较。

本文会从3个抽象层级入手讲解这三者的区别。

欢迎加入人类高质量前端交流群,带飞

响应式更新

响应式更新也叫细粒度更新。同时,最近前端圈比较火的Signal这一概念描述的也是响应式更新

笼统的讲,响应式更新描述的是状态与UI之间的关系,即状态变化如何映射到UI变化

考虑如下例子(例子来自what are signals一文):

function TodoApp() {
    const [todos, setTodos] = useState(
      [{ text: 'sleep', completed: false }]
    )

    const [showCompleted, setShowCompleted] = useState(false)

    const filteredTodos = useMemo(() => {
        return todos.filter((todo) => !todo.completed || showCompleted)
    }, [todos, showCompleted])

    return (
        <TodoList todos={filteredTodos} />
    )
}

TodoApp组件中,定义了两个状态:

  • 待办事项todos
  • 是否展示完成的事项showCompleted

以及根据上述状态派生出的状态filteredTodos。最终,返回<TodoList/>组件。

如果todos状态变化,UI该如何变化?即我们该如何知道状态变化的影响范围?这时,有两个思路:

  • 推(push
  • 拉(pull

推的原理

我们可以从变化的状态(例子中为todos)出发,根据状态的派生关系,一路推下去。

在例子中:

  1. todos变化
  2. filteredTodostodos派生而来,变化传导到他这里
  3. <TodoList/>组件依赖了filteredTodos,变化传导到他这里
  4. 确定了todos变化的最终影响范围后,更新对应UI

这就建立了状态与UI之间的关系

除了之外,还有一种被称为的方式。

拉的原理

同样的例子,我们也能建立状态与可能的UI变化的关系,再反过来推导UI变化的范围。

在例子中:

  1. todos变化
  2. 可能有UI变化(因为建立了状态与可能的UI变化的关系
  3. UI<TodoList/>组件相关,判断他是否变化
  4. <TodoList/>组件依赖filteredTodosfilteredTodostodos派生而来,所以filteredTodos是变化的
  5. 既然filteredTodos变化了,那么<TodoList/>组件可能变化
  6. 计算变化的影响范围,更新UI

在主流框架中,React的更新以为主,VuePreactSolid.js等更多框架使用的方式。

本文聊的响应式更新就是这种方式的一种实现。

单向数据流

我们可以发现,不管是还是,他们都需要计算变化的影响范围,即一个状态变化后,究竟有多少组件会受影响

那么,从框架作者的角度出发,是希望增加一些约束,来减少计算影响范围这一过程的复杂度。

同样,从框架使用者的角度出发,也希望增加一些约束,当计算影响范围bug后,更容易排查问题。

这就有了单向数据流

单向数据流是一条约定,他规定了当状态变化后,变化产生的影响只会从上往下传递

考虑如下例子:

function Parent() {
  const [num] = useState(0);
  return <Child data={num}/>;
}

function Child({data}) {
  const isEven = data % 2 === 0;
  return <GrandChild data={isEven}/>;
}

function GrandChild({data}) {
  return <p>{data}</p>;
}

<Parent/>组件的状态num作为props传给<Child/>组件,再作为props传给<GrandChild/>组件,整个过程只能自上而下。

单向数据流并不是实现前端框架必须遵循的原则,他的存在主要是为了减少开发者的心智负担,让状态变化后,计算影响范围这一过程更可控。

双向数据绑定

当本文开篇聊响应式更新时,讨论的是状态与UI的关系,这是将框架作为一个整体来讨论,抽象层级比较高。

当我们继续聊到单向数据流时,讨论的是状态变化的影响范围在组件间单向扩散,这是组件与组件之间的关系,抽象层级下降了一级。

接下来我们要讨论的双向数据绑定,讨论的是单个组件内发生的事。

双向数据绑定状态+改变状态后触发的回调相结合的语法糖。

这里不讨论框架语境下「语法糖」一词是否完全准确

比较知名的双向数据绑定实现,比如Vue中的v-model语法:

<input v-model=‘data’/>

相当于如下状态+事件回调的组合:

<input @input='onInput' :value=‘data’ />

实际上早期React中也有类似实现,名叫LinkedStateMixin,只是早已被废弃

总结

我们可以用一张图概括本文介绍的3个概念之间的关系:

概括起来主要是两点:

  • 他们都是前端框架范畴内的概念
  • 他们属于不同抽象层级的概念

其中:

  • 双向数据绑定描述的是组件内逻辑与视图的关系
  • 单向数据流描述的是组件之间的关系
  • 响应式更新描述的是状态与UI之间的关系

原文:https://segmentfault.com/a/1190000043512498

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,753评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,668评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,090评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,010评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,054评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,806评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,484评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,380评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,873评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,021评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,158评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,838评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,499评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,044评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,159评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,449评论 3 374
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,136评论 2 356

推荐阅读更多精彩内容