博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
完全基于rxjs的组件开发探索
阅读量:6408 次
发布时间:2019-06-23

本文共 1833 字,大约阅读时间需要 6 分钟。

// 给予rxjs设计的组件模型import {  Input,  OnChanges,  SimpleChanges,  ChangeDetectorRef,  OnInit,  OnDestroy} from '@angular/core';import { Observable, merge } from 'rxjs';import { first, filter, takeWhile } from 'rxjs/operators';export class BaseComponent implements OnChanges, OnInit, OnDestroy {  @Input() props: Observable
= new Observable(); // 需要注销开关 needDestory: boolean = false; constructor() {} ngOnChanges(changes: SimpleChanges) { if ('props' in changes) { if (!changes['props'].isFirstChange) { this.__propsHandler(); } } } /** * 注销 */ ngOnDestroy() { this.needDestory = true; } ngOnInit() { this.__propsHandler(); } // 用户暴露给外部设置props的接口 setProps(props: Observable
) { this.props = merge(this.props, props); this.__propsHandler(); } private __propsHandler() { this.props = merge( // 添加默认值,解决默认值为null问题 this.props.pipe(first((val, idx) => idx === 0, {})), this.props ).pipe( // 去除{} filter(val => Object.keys(val).length > 0), // 自动注销 takeWhile(val => !this.needDestory) ); }}复制代码

建立一个测试组件

import {  Component,  ChangeDetectionStrategy,  ChangeDetectorRef,  OnInit} from '@angular/core';import { BaseComponent } from '../base-component';@Component({  selector: 'base-test',  templateUrl: './base-test.component.html',  styleUrls: ['./base-test.component.scss'],  changeDetection: ChangeDetectionStrategy.OnPush})export class BaseTestComponent extends BaseComponent implements OnInit {  constructor() {    super();  }}复制代码
  • {
    {(props | async)?.a}}
  • {
    {(props | async)?.b}}
  • {
    {(props | async)?.c}}
  • {

    {props | async | json}}

    复制代码
    • 使用测试组件
    复制代码
    let i = 0;setInterval(() => {  this.sub2.next({    a: i++,    b: i++,    c: i++  });}, 1000);复制代码

    总结

    这样完全绕过angular的changes,完全基于rxjs的核心去做,可能可以去掉ngZone

    转载地址:http://ikhea.baihongyu.com/

    你可能感兴趣的文章
    Revit二次开发示例:DesignOptions
    查看>>
    Entity Framework 系统约定配置
    查看>>
    优秀设计:纹理在网页设计中的20个应用示例
    查看>>
    C++ 关键字 explicit, export, mutable
    查看>>
    生成指定范围的一组随机数并求平均值
    查看>>
    android语音识别方法
    查看>>
    File Operations in Android NDK(转)
    查看>>
    如何将kux格式的视频转换成我们常用的MP4格式
    查看>>
    [sublime系列文章] sublime text 3插件配置说明
    查看>>
    学习 PixiJS — 碰撞检测
    查看>>
    Vue 基础篇
    查看>>
    JavaScript:函数防抖与函数节流
    查看>>
    关于区间贪心的补全
    查看>>
    架构设计步骤
    查看>>
    自定义元素探秘及构建可复用组件最佳实践
    查看>>
    区块链是一个公共数据库,要放在一个块内
    查看>>
    Jenkins 用户文档(目录)
    查看>>
    系统常见指标
    查看>>
    使用crond构建linux定时任务及日志查看
    查看>>
    地图绘制初探——基于maptalks的2.5D地图绘制
    查看>>