更全、更好的 React-Native Toast组件

在React-Native如果用到提示(网络请求失败等短暂的显示提示用户)的话大多数在项目可能用的react-native-root-toast、react-native-easy-toast,如果用到加载,可能就得自己写Modal加载,在开发了几个React-Native项目时,发现一些提示缺陷,所以就写了一个组件react-native-smart-tip。react-native-smart-tip现有提示框的一些问题Toast提示重叠之前在项目使用发现,单击登录提示登录中,登录成功后提示登录成功。由于速度过快,出现重影问题,两个提示Toast都集中在中心位置,让人看着很不舒服。没有动画现在的一些版本安卓手机自带的进场是有一个从下到上的动画的,但React-Native现有的Toast组件暂时都没有,所以当时开发项目时对着react-native-root-toast改了一下,当时也就没再看了。有Modal提示框时Toast被遮盖在显示了Modal框时Toast将会被遮盖,这个是由于视图层优先级的关系,之前的解决办法是在Modal上加一些提示。组件优点解决了Toast提示重复问题。提示新增动画。提示新增文字模式和文字加图片模式。新增安卓SnackBar提示功能。新增Modal提示,可以实现加载提示和Modal状态下提示。静态效果演示GIF演示组件地址

March 18, 2019 · 1 min · jiezi

初探Subject and Subscribe (Ionic4 Angular6)

类似的东西很多,但是不得不说大部分资料中的例子不是难以理解就是形而上学,所以我想分享一点自己的代码来帮助更多初学者。起源:我打算做一个弹出登录,里面包含一个注册按钮,点击注册则切换到弹出注册,当然在注册时也能切换回登录。在实现的过程中一路踩过以下的坑:如果将一个component/page应用到modal中,那么这个component/page必须在不低于弹出modal的层级的module.ts文件中的@NgModule的entryComponents部分声明出来,不然会得到一个错误。一个component/page只能在一个module.ts文件中声明调用弹出方法的ts文件必须引用使用到的component/page如果两个ts文件中都同时引用了对方(a.ts import b, b.ts impot a)那么会得到一个循环依赖的警告,这不影响运行,但是看着闹心。所以我要再次修改一下,避免这个警告,最后选择了subject的方案。不要尝试直接复制运行,因为我去掉了和本文无关的部分,比如import { Component } from ‘@angular/core’;这样的语句。首先在某个单例模式的service中加入如下代码:import { Subject, Subscription } from ‘rxjs’;//公有属性switchModel,这是一个可供订阅的主题@Injectable({ providedIn: ‘root’})export class SiteService { public switchModel: Subject<Object> = new Subject<Object>();}为了解决问题4,所以弹出的行为将仅在app.component上发生import { ModalController } from ‘@ionic/angular’;import { SiteService } from ‘../services/site/site.service’; //自行替换为声明了subject的serviceimport { LoginComponent } from ‘../login/login.component’; //自行替换为你要弹出的内容1import { SignupComponent } from ‘../signup/signup.component’; //自行替换为你要弹出的内容2/如果有的话你可以添加更多的内容注意确认它们被正确的声明在entryComponents部分对于app.component.ts,其对应的module必然是app.module.ts/export class AppComponent { constructor( private modalController: ModalController, private siteService: SiteService ){ this.siteService.switchModel.subscribe(option => { this._switchModel(option); }); } private _switchModel(option) { let component = null; switch(option.componentName) { case ‘LoginComponent’: component = LoginComponent; break; case ‘SignupComponent’: component = SignupComponent; break; case ‘’: //如果没有指定component那就是直接关闭咯,这是为了在component内部能省掉引用ModalController和关闭modal的代码 break; default: return; //这件事和我无关,跳过。防止对其它subscriber负责的component重复处理 } this.modalController.dismiss().then(() => { this.modalController.create({ component: component, componentProps: option.params || null }).then(modal => modal.present()); }); }}然后在LoginComponent为注册按钮添加一个事件,SignupComponent做类似的处理import { SiteService } from ‘../services/site/site.service’;export class LoginComponent implements OnInit { doSwitch() { this.siteService.switchModel.next({ componentName: ‘SignupComponent’ }); } cancel() { this.siteService.switchModel.next({ componentName: ’’ }); }}逻辑描述:LoginComponent调用Subject的next方法同时传递数据,这样Subject就会将该数据通知到订阅者(AppComponent订阅了这个subject),AppComponent在得到Subject更新的消息时会根据最新的消息做出适当的处理。理论上来说,我们可以创建一个全局的主题,每个订阅者都可以通过消息的数据类型或其它特征决定自己如何处理,但是个人还是喜欢定制主题从而减少订阅。刚接触Angular6不久,不管是我这个想法本身有错误还是解决的方式有问题都请拍砖不要客气,只求大侠的砖头上绘制一下示例代码,不胜感激。 ...

November 7, 2018 · 1 min · jiezi