用Algeb这个新轮子管理前端数据请求资源

广告位招租
扫码页面底部二维码联系

一个前端项目需要管理一堆前端数据请求,现【原创内容,转载请注明出处】【作者:唐霜】代前端应用,几乎没见过将数据请求直接写在【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。业务代码中,大部分时候,我们都会将这些请未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。求逻辑从业务代码中抽出来,集中管理。但随未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net着业务开发的反复进行,我们会逐渐发现一些【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net现象,我们对后端吐给我们的数据开始提出一【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】些具体细节上的要求,就我个人而言,我总结著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。出如下要求:

【未经授权禁止转载】【作者:唐霜】【版权所有,侵权必究】【作者:唐霜】
  • 如何避免同一个请求被多次发起?原创内容,盗版必究。
  • 【未经授权禁止转载】【作者:唐霜】【版权所有,侵权必究】未经授权,禁止复制转载。
  • 如何在某处发起请求,当数据回来后,另外一转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。处使用了该请求数据的组件自动更新?
  • 转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。【作者:唐霜】转载请注明出处:www.tangshuang.net
  • 如何在第一次渲染的时候就可以正常渲染?【关注微信公众号:wwwtangshuangnet】
  • 未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net【转载请注明来源】
  • 如何提供更优秀的编程体验和管理方式?【未经授权禁止转载】
  • 【本文首发于唐霜的博客】【版权所有,侵权必究】【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net

我在几年前写过一个库【版权所有】唐霜 www.tangshuang.netdatabaxe【关注微信公众号:wwwtangshuangnet】,提出一种新型的数据源理念,这种理念让我原创内容,盗版必究。转载请注明出处:www.tangshuang.net们可以写同步代码,把请求过程和数据进行分【关注微信公众号:wwwtangshuangnet】【本文受版权保护】离,对前端而言,请求本身是不可见的。前端本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。只需要从仓库中读取数据即可。但当时采用了未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】具名方式规定每一个数据源的名称,获取参数未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net对应关系比较复杂,需要监听,而且内置了a【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】xios作为数据请求器,对开发者而言是不原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net开放的。

【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。

为了继续实践这种写同步代码的方式,同时使本文版权归作者所有,未经授权不得转载。【本文受版权保护】数据请求本身更开放,我写了algeb这个未经授权,禁止复制转载。【原创不易,请尊重版权】

原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】【版权所有,侵权必究】

项目地址:著作权归作者所有,禁止商业用途转载。gitee.com/frustigor/本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。a…

【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】【原创不易,请尊重版权】

它的源码比databaxe少了n倍,使用【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net方法简单了n倍。让我们来看看,我是如何做【未经授权禁止转载】【未经授权禁止转载】到的。

【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】

数据源原创内容,盗版必究。

著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】著作权归作者所有,禁止商业用途转载。

我们大多情况下是通过请求后端API获取数【未经授权禁止转载】【转载请注明来源】据,但API并不是唯一的数据源,在前端编著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】程中,客户端持久化数据(例如存在inde【本文受版权保护】【原创不易,请尊重版权】xedDB中的数据),websocket【版权所有,侵权必究】原创内容,盗版必究。推送的数据,都是重要的数据来源。因此,我【转载请注明来源】本文版权归作者所有,未经授权不得转载。们要寻找一种编程方式,可以兼容不同形式的未经授权,禁止复制转载。【本文受版权保护】数据源,将不同形式来源的数据,通过一套方【本文首发于唐霜的博客】【本文受版权保护】式进行管理。

转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net【本文受版权保护】转载请注明出处:www.tangshuang.net【本文受版权保护】

Algeb的方式是,将数据源和数据使用进【版权所有,侵权必究】未经授权,禁止复制转载。行隔离,如何从数据源获取数据不在Alge【未经授权禁止转载】转载请注明出处:www.tangshuang.netb的管辖范围内,但是开发者需要将一个函数原创内容,盗版必究。【本文首发于唐霜的博客】托管给它,这个函数从数据源得到该数据源的本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。数据。也就是说,它不关心获取的过程,只关本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】心结果,也就是这个函数的返回值就是我需要本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】的最终数据。

本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。
import { source } from 'algeb'

const Some = source(function() {
  // ... 获取数据的函数,返回值即为被管辖的数据源数据
}, {
  name: '',
  age: 0,
})
复制代码

但是有一个非常常见的问题,我们管辖一个数原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net据源,却可能通过不同参数获得不同对象。例转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。如:

本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】
async function getBook(id) {
  return fetch(`/api/v2/books/${id}`).then(res => res.json()).then(body => body.data)
}
复制代码

这是我们常见的一个用于获取一本书详细信息原创内容,盗版必究。【版权所有,侵权必究】的函数。我们经常会传入id来决定获取哪一【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。本书的信息。而面对这种情况,我们怎么去用【原创不易,请尊重版权】【原创不易,请尊重版权】Algeb管理呢?难道要为每一本书建立一【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。个源?

【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】

当然不需要,Algeb所认为的数据源,并【未经授权禁止转载】【原创不易,请尊重版权】非指单一数据,而是获取形式相同数据的方法【作者:唐霜】未经授权,禁止复制转载。(也就是这个函数),并且以该函数的参数作【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。为标记记录该源所有被使用到的具体数据颗粒转载请注明出处:www.tangshuang.net【版权所有,侵权必究】。这个逻辑是内部实现的,开发者不需要关心【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net,只需要记住一点,数据源函数参数最好越简【版权所有,侵权必究】【作者:唐霜】单越好,这样有利于对参数进行计算,作为识【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】别具体数据的依据。

【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。【本文受版权保护】本文版权归作者所有,未经授权不得转载。
const Book = source(getBook, { 
  title: '',
  price: 0,
})
复制代码

source函数的第二个参数是该源的默认值,我所崇尚【原创不易,请尊重版权】【未经授权禁止转载】的同步代码书写方式要求代码在执行一开始就原创内容,盗版必究。【版权所有,侵权必究】是OK的,不报错的,所以,这个默认值非常本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】关键,同时,通过这个默认值,也可以告诉团著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】队其他成员了解一个数据源将获取到的数据的【本文受版权保护】未经授权,禁止复制转载。基本格式。

本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。

你可能会问,websockt推送的数据怎本文作者:唐霜,转载请注明出处。【未经授权禁止转载】么办呢?由于algeb只关心获取数据的结本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】果,所以开发者怎么从websockt获取【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】数据我们并不关心。我自己想到一种方式是,【转载请注明来源】【版权所有】唐霜 www.tangshuang.net用一个全局变量保管不同数据源来自webs【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】ockt的数据,然后在数据源函数中,读取本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net该全局变量上的属性返回。

本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】

组合【版权所有,侵权必究】

著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net

通常情况下,我们现有的数据源管理器只是简【原创内容,转载请注明出处】【转载请注明来源】单的读写逻辑,并没有规定数据缓存的逻辑。【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。我希望通过更抽象的方式,让开发者自己来规【转载请注明来源】未经授权,禁止复制转载。定数据再次请求的逻辑。通过Algeb的c【未经授权禁止转载】【版权所有,侵权必究】ompose方法,可以组合一个或多个数据【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。源,并附增特殊逻辑进去。

本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。
import { compose, query, affect } from 'algeb'

const Order = compose(function(bookId, photoId) {
  const [book, refetchBook] = query(Book, bookId)
  const [photo, refetchPhoto] = query(Photo, photoId)
  
  affect(function() {
    const timer = setInterval(() => {
      refetchBook()
      refetchPhoto()
    }, 5000)
    return () => clearInterval(timer)
  }, [book, photo])
  
  const total = book.price + photo.price
  
  return { book, photo, total }
})
复制代码

这是本文作者:唐霜,转载请注明出处。compose的一个例子。它通过组合book和phot【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】o两个对象,并附加算出这个订单的总价格,【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】作为一个新的数据源返回。从“数据源”的定转载请注明出处:www.tangshuang.net原创内容,盗版必究。义上,Book, Photo, Orde转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.netr都是数据源,本质相同,只是类型不同而已本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】

【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】转载请注明出处:www.tangshuang.net原创内容,盗版必究。

有一个约定,虽然compose的返回值可未经授权,禁止复制转载。未经授权,禁止复制转载。以是任意的,但是它一定是同步执行完后返回著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】,所以compose不接受async函数【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。

本文作者:唐霜,转载请注明出处。【作者:唐霜】【转载请注明来源】【未经授权禁止转载】

但凡是数据源,就可以在环境中(compo【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。se/setup)使用query读取,query函数接收第一个参数为一个转载请注明出处:www.tangshuang.net【未经授权禁止转载】数据源对象,后面的参数将作为数据源函数的【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。参数进行透传。它的返回值是一个两个元素的本文版权归作者所有,未经授权不得转载。【本文受版权保护】数组,第一个元素是数据源根据该参数返回的未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net值,第二个参数是刷新数据源数据的触发器(【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。非请求器)。

著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net【本文受版权保护】本文版权归作者所有,未经授权不得转载。

在环境中,还可以使用affect等hoo【本文首发于唐霜的博客】【未经授权禁止转载】ks函数,这些函数在环境中执行,例如上面【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】这段代码中,通过affect规定了Ord【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。er这个数据源一旦被查询,就会每隔5秒钟未经授权,禁止复制转载。【本文首发于唐霜的博客】再查一次。这样,我们通过compose,转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】实际上定义了一个不仅可以获取值的数据源,【原创内容,转载请注明出处】原创内容,盗版必究。还定义了该数据源刷新数据的方式。

【原创不易,请尊重版权】【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net

compose让我们可以在获取一个值的同时,还会触发其【未经授权禁止转载】转载请注明出处:www.tangshuang.net他源的更新。这在一些场景下极其好用。例如本文版权归作者所有,未经授权不得转载。【转载请注明来源】,我们有A、B两个源,当我们提交对A的更原创内容,盗版必究。【本文受版权保护】新后,需要同时重新拉取A、B的新值。我们【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net可以通过compose来处理。

本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】【作者:唐霜】【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。
const UpdateBook = compose(function(bookId, data, photoId) {
  const [book, refetchBook] = query(Book, bookId)
  const [_, refetchPhoto] = query(Photo, photoId)
  
  affect(function() {
    updateBook(bookId, data).then(() => {
      refetchBook() // 重新获取该书信息
      refetchPhoto() // 重新获取图像信息
    })
  })
})
复制代码

这个组合源只用于发送数据到服务端,发送成未经授权,禁止复制转载。【版权所有,侵权必究】功后会同时抓取两个数据源的新数据。一旦新【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。数据获取成功,所有依赖于对应数据颗粒(B【版权所有,侵权必究】【作者:唐霜】ook:bookId, Photo:ph原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。otoId)的环境,全部都会被更新。

未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。转载请注明出处:www.tangshuang.net

再算一次!【原创不易,请尊重版权】

原创内容,盗版必究。原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net

响应式应用框架的特征是自动将数值的变化反【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】应为界面的变化。但如果你仔细观察我上述描【原创内容,转载请注明出处】【本文受版权保护】述,就会发现,怎么实现响应式呢?这涉及到【原创内容,转载请注明出处】【版权所有,侵权必究】我们怎么去设计当数据源发生变化时,将这一【本文受版权保护】转载请注明出处:www.tangshuang.net变化产生的副作用即时反馈。

原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】原创内容,盗版必究。

和常见的“观察者模式”不同,我借鉴的是r【作者:唐霜】【原创不易,请尊重版权】eact hooks的响应式方案,即基于【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。代数效应的依赖响应。我们看react的f【转载请注明来源】本文作者:唐霜,转载请注明出处。unctional组件,你会发现,它的响【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】应式副作用,是“再算一次”!

【关注微信公众号:wwwtangshuangnet】【转载请注明来源】【未经授权禁止转载】【本文首发于唐霜的博客】

再算一次!也就是组件function再执本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net行一次,每次state被更新时,组件fu【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。nction被再次执行,得到新的组件树。【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。神奇的“再算一次”特效,理论上会消耗更多【转载请注明来源】未经授权,禁止复制转载。性能,却让我们可以像撰写同步代码一样,从本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。顶向底书写逻辑,并通过useEffect【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net来执行副作用。

【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。【本文受版权保护】本文版权归作者所有,未经授权不得转载。

在Algeb中,我也是基于这种思路,但由【原创内容,转载请注明出处】【转载请注明来源】于这是一个通用库,它不依赖框架,要去适应本文作者:唐霜,转载请注明出处。【作者:唐霜】不同框架的差异,因此,我提供了一个setup提供执行上下文。【版权所有,侵权必究】

未经授权,禁止复制转载。原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net
import { setup } from 'algeb'

setup(function() {
  const [some, refetchSome] = query(Some)
  
  affect(function() {
    console.log(some.price)
  }, [some.price])
  
  render(`<div>${some.price}</div>`)
})
复制代码

setup是所有algeb应用的入口,在setup【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。之外使用algeb定义的源没有意义,甚至【未经授权禁止转载】【本文受版权保护】会报错。它接收的函数被成为执行宿主,这个本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。宿主函数会被反复执行,它内部一定是会有副本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net作用的,例如,上面这段代码,副作用就是render。当被本文版权归作者所有,未经授权不得转载。query的数据颗粒获得新数据时,宿主函数会被再次【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net执行,这样,就会产生新的副作用,从而反馈【版权所有,侵权必究】原创内容,盗版必究。到界面上。

【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】

数据颗粒是指基于query参数的数据源状【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。态之一,比如前面的Book这个源,每一个原创内容,盗版必究。【未经授权禁止转载】bookId会对应一个数据颗粒,每个数据本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。颗粒保存着当前时刻该bookId的boo【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.netk的真实信息,一旦有任何一个地方触发了数转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。据更新,那么就会让源函数再次执行,去获得【版权所有】唐霜 www.tangshuang.net【作者:唐霜】新的数据,新数据回来之后,通过内部对比发【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net现数据发生了变化,宿主函数就会再次执行,转载请注明出处:www.tangshuang.net【本文受版权保护】从而副作用生效。

著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。

如此循环往复,就会给人一种响应式的编程的【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。感觉,而这种感觉,和传统的通过观察者模式本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。实现的响应式具有非常大的感官差异,而这个转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】差异,就是react践行的代数效应所带来【版权所有,侵权必究】未经授权,禁止复制转载。的。

本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】

为了适应不同框架中更好的结合使用,我在库原创内容,盗版必究。原创内容,盗版必究。中提供了不同框架的使用。

【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】

React中使用【版权所有,侵权必究】

【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】【作者:唐霜】原创内容,盗版必究。
import { useQuery } from 'algeb/react'

function MyComponent(props) {
  const { id } = props
  const [some, fetchSome] = useQuery(SomeSource, id)
  // ...
}
复制代码

Vue中使用【版权所有】唐霜 www.tangshuang.net

【未经授权禁止转载】【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。
import { useQuery } from 'algeb/vue'

export default {
  setup(props) {
    const { id } = props
    const [someRef, fetchSome] = useQuery(SomeSource, id)
    const some = someRef.value
    // ...
  }
}
复制代码

Angularjs中使用【版权所有】唐霜 www.tangshuang.net

本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net
const { useQuery } = require('algeb/vue')

module.exports = ['$scope', '$stateParams', function($scope, $stateParams) {
  const { id } = $stateParams
  const [someRef, fetchSome] = useQuery(SomeSource, id)($scope)
  $scope.some = someRef // { value }
  // ...
}]
复制代码

Angular中使用著作权归作者所有,禁止商业用途转载。

著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】【原创内容,转载请注明出处】
import { Algeb } from 'algeb/angular' // ts

@Component()
class MyComponent {
  @Input() id

  constructor(private algeb:Algeb) {
    const [someRef, fetchSome] = this.algeb.useQuery(SomeSource, this.id)
    this.some = someRef // { value }
  }
}
复制代码

结语【版权所有】唐霜 www.tangshuang.net

【作者:唐霜】【未经授权禁止转载】【转载请注明来源】【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net

在前端应用层和后端、持久化存储、webs【转载请注明来源】【关注微信公众号:wwwtangshuangnet】ockt等原始数据交互时,对于前端而言,【原创内容,转载请注明出处】【未经授权禁止转载】这种交互过程都是没有必要的,是和业务本身本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net无关的副作用。Algeb这个库,试图用代原创内容,盗版必究。【原创内容,转载请注明出处】数效应,参考react hooks的使用本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net方法,实现前后端中间服务层的抽象。通过对【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】数据源的定义和组合,以setup提供宿主【原创内容,转载请注明出处】【作者:唐霜】,实现另一种风格的响应式。如果你认为这种本文作者:唐霜,转载请注明出处。【转载请注明来源】抽象能激发起你一点点兴趣,不妨到仓库【本文首发于唐霜的博客】中一起讨论,写码。转载请注明出处:www.tangshuang.net

【作者:唐霜】原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】
已有4条评论
  1. ID_1188 2020-11-04 10:31

    偶尔会出现以下报错,应该是漏了forEach的参数i.

    index.js:89 Uncaught (in promise) ReferenceError: i is not defined
        at index.js:89
        at Array.forEach ()
        at index.js:86

    “`
            atom.hosts.forEach(host => {
              if (host.end) {
                // the host is destoryed
                atom.hosts.splice(i, 1);
              } else {
                host.next();
              }
            });
    “`

    • 否子戈 2020-11-04 11:09

      确实是个bug,我修下发个版本

  2. ID_1188 2020-11-03 16:01

    当props里的id 为undefined时, 请求也会发起.这种情况怎么处理比较好?

    • 否子戈 2020-11-03 16:58

      source函数里面拦截,返回undefined对应的值,能否请求是数据源函数的任务,与外部环境无关