当前位置: 首页 > news >正文

自己在家可以做网站吗南安seo

自己在家可以做网站吗,南安seo,网络营销的名词解释是什么,中国菲律宾南海开战这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 在切换详情页中有这么一个场景,点击上一条,会显示上一条的详情页,同理,点击下一条,会显示下一条的详情页。 伪代码如下所示: 我们…

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

在切换详情页中有这么一个场景,点击上一条,会显示上一条的详情页,同理,点击下一条,会显示下一条的详情页。

伪代码如下所示:

我们定义了一个 switcher 模版, 用户点击上一条、下一条时调用 goToPreOrNext 方法。该页面通过 loadingDone 状态判断是否展示加载效果。

// html
<thy-loading [thyDone]="loadingDone"></thy-loading>
<ng-container *ngIf="loadingDone"><styx-pivot-detail>...<thy-arrow-switcher...(thyPrevious)="goToPreOrNext($event)"(thyNext)="goToPreOrNext($event)"></thy-arrow-switcher>...</styx-pivot-detail>
</ng-container>

在 goToPreOrNext 方法中,当调用该方法时,通过 goToPreOrNextResolve 接口返回下一条的详情 id,通过该 id 请求详情数据。

// 请求下一条 id
fetchPreOrNext(event: ThyArrowSwitcherEvent) {...this.goToPreOrNextResolve(event.index, topicId).subscribe((id: string) => {this.getDetail(id);}...)
}// 请求详情数据
getDetail(postId: string) {this.loadingDone = false;this.store.fetchPost(postId).pipe(finalize(() => {this.loadingDone = true;})).subscribe();
}

这看起来好像没有什么问题,应该一般都是这么干的,我们运行看看。

🌠 如何切换时候不闪?

与最上面的相比,有没有发现每次切换时,都会闪一下,用户体验很不好,有没有办法可以解决它?

这个问题就是 loadingDone 的状态切换导致的,我们把 loadingDone 干掉是不是就可以了?

如下代码所示:

// 请求详情数据
getDetail(postId: string) {// 注释掉这一行// this.loadingDone = false;this.store.fetchPost(postId).pipe(finalize(() => {this.loadingDone = true;})).subscribe();
}

好像方案可行?

但是把网络调成低速 3G 后,会发现,我们的加载效果没了,页面像卡住了一样,这当然不行。

有没有更好的方案?

⏰ setTimeout 方案

把先前 loadingDone 状态不放到 getDetail 方法中,而是单独拿出来紧跟 this.getDetail(id) 后面。

代码如下:

// 定义一个 timer
**private timer = null;**// 请求下一条 id
fetchPreOrNext(event: ThyArrowSwitcherEvent) {...this.goToPreOrNextResolve(event.index, topicId).subscribe((id: string) => {this.getDetail(id);**this.timer = setTimeout(() => {this.loadingDone = false;}, 500);**}...)
}// 请求详情数据
getDetail(postId: string) {// 删除掉该行loadingDone 代码**// this.loadingDone = false;**this.store.fetchPost(postId).pipe(finalize(() => {this.loadingDone = true;// 记得清除**clearTimeout(this.timer);**})).subscribe();
}

这么做的含义就是,我们给到 loadingDone 500ms 的缓冲时间,如果 500ms 内返回数据了,则没有 loading 的效果,如果没有加载回来,在会显示加载中。

一般情况如下所示:

 低速网络下的效果:

这确实是一种方案,但是总感觉哪里怪怪的。

这里是个定时任务并且 500ms 后触发。试想一种结果,当我快速点击下一条并且在 300ms 获取到了数据并把 loadingDone 状态置为 true, 但 500ms时,loadingDone 状态置为 false,造成假死的情况,显然这不是我们想要的。

那这该如何解决?

💎 RxJS 大法

抛去使用 setTimeout 的方案,我们对 getDetail 代码改成如下的形式。

大致的思路是,将请求的 loading 状态与数据获取的状态分离,并定义了两个流 result$showLoadingIndicator$

result$ 流请求到数据之后,之后之后的一些操作, showLoadingIndicator$ 流则负责 loading 状态的推送。

来看看怎么一步一步实现的:

首先我们定义一个请求的流。

const fetchPost$ = () => this.store.fetchPost(postId);

然后分别定义了两个流 result$ 和 showLoadingIndicator$。这里的 share() 函数是因为会有两个订阅它的地方。

 const result$ = fetchPost$().pipe(share());const showLoadingIndicator$;

然后我们来处理 showLoadingIndicator$ 流。

我们期望在 500ms 内请求到的数据,则不应该展示 loading,否则,应该展示 loading 状态。

const showLoadingIndicator$ = timer(500).pipe(mapTo(true), takeUntil(result$))

如果在 500ms 后很快请求到了数据,为了避免闪屏,我们需要让 loading 至少显示 1s。然后使用 merge() 合并这两种结果。

const showLoadingIndicator$ = merge(timer(500).pipe(mapTo(true), takeUntil(result$)),combineLatest(result$, timer(1000)).pipe(mapTo(false))).pipe(startWith(false), distinctUntilChanged());

最后订阅它们。

result$.subscribe(result => {// 请求到结果后的操作},error => {// TODO});showLoadingIndicator$.subscribe(isLoading => {// 更新 loadingDone 状态this.loadingDone = !isLoading;});

完整的代码如下:

// 请求下一条 id
fetchPreOrNext(event: ThyArrowSwitcherEvent) {...this.goToPreOrNextResolve(event.index, topicId).subscribe((id: string) => {this.getDetail(id);}...)
}// 请求详情数据
getDetail(postId: string) {const fetchPost$ = () => this.store.fetchPost(postId);const result$ = fetchPost$().pipe(share());const showLoadingIndicator$ = merge(timer(500).pipe(mapTo(true), takeUntil(result$)),combineLatest(result$, timer(1000)).pipe(mapTo(false))).pipe(startWith(false), distinctUntilChanged());result$.subscribe(result => {// TODO},error => {// TODO});showLoadingIndicator$.subscribe(isLoading => {this.loadingDone = !isLoading;});
}

如果想更细致知道如何实现的,参考下面这篇文档:

Loading indication with a delay and anti-flickering in RxJS

本文转载于:

https://juejin.cn/post/7176943529057321017

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

http://www.zhtcad.com/news/252.html

相关文章:

  • 新沂网站建设百度推广登录手机版
  • 开源门户网站cms今日新闻快讯10条
  • 没有照片怎么做网站百度快照收录
  • 网站制作报价大约墨子学院seo
  • 广州市网站建设公司外贸网站优化公司
  • 凡科网建站入门教程关键词指数
  • 做企业网站一般用什么服务器温州seo品牌优化软件
  • 手机网站模板天眼查企业查询
  • 徐汇做网站关键词查找的方法有以下几种
  • 毕业设计代做的网站好随州今日头条新闻
  • 百度网站托管seo这个行业怎么样
  • 网站建设收费标准服务推广平台都有哪些
  • 网站建设的基本流程包括哪些栾城seo整站排名
  • 做我女朋友恶搞网站太原网络营销公司
  • 创意互动网站天津百度推广代理商
  • wordpress getthememod结构优化
  • 创可贴网站怎么做图片大全搜索引擎推广
  • 行政机关网站建设佛山网站搜索排名
  • 西宁网站建设电话百度广告代运营
  • 产品网络营销方案网站推广和网站优化
  • 国内做的好的电商网站有哪些怎么样免费做网站
  • 装修网站线怎样做打广告的免费软件
  • 怎么替换ecshop网站的站标替换了怎么不显示数字营销策划
  • 做变性手术视频网站今日新闻国内大事件
  • 云南网站建设公司前十名西安网红
  • 在线建站软件社区建站网站系统
  • 如何做文献ppt模板下载网站百度一下你就知道了百度
  • 阿里云做网站预装环境关键词优化步骤简短
  • 专业苏州网站建设公司博客推广工具
  • 网站开发建产品关键词怎么找