美文网首页Ios@IONICIonic FrameworkWeb前端之路
来扯点ionic3[7] LocalStorage的使用—以登录

来扯点ionic3[7] LocalStorage的使用—以登录

作者: 忠叔 | 来源:发表于2017-11-23 13:56 被阅读702次

    本系列文集:来扯点ionic3

    一般意义上,一个互联网 APP 中的数据主自与服务器的交互,但是对于有些数据,我们希望获取到它们以后能保存,并在全局环境使用,比如用户数据——我们不希望在每个页面都从服务器拉取一遍。这时我们就可以利用 HTML5 的 localStorage API —— 一个比 cookie 更稳定和高效,且跨浏览的一种存储机制。我们可以尝试模拟登录的流程来体验这一 API 的使用。

    创建登录页面

    在 pages 文件夹创建登录页面目录 login,包括 login.ts 和 login.html ,别忘了在 app.module.ts 注册页面。

    一个简单的登录表单

    定义数据模型

    在 login.ts 定义表单的数据模型,把用户名和密码封装在一个对象中,将来发送 post 请求时可以直接调用。

    export class LoginPage {
    
        userData:any{
            username:'',
            password:''
        }
    
        ...
    

    制作模板并完成数据绑定

    在 login.html 编写表单模板,并使用 [(ngModel)] 将每个项目绑定在数据模型上。

    需要先做一些小改造

    很多APP是需要强制登录的,用户进入这类 APP 时,就会直接进入登录页面,只有登录成功后才会跳转到首页。
    如果你用 tabs 模板创建了 ionic 项目,那么APP是默认进入到 Tabs 页的,我们要做一些改造让它默认进入到登录页面。

    修改 app.component.ts

    app.component.ts 定义了整个 APP 的根页面,我们需要把根页面替换位登录页面。

    1. 引入LoginPage

    import { LoginPage } from '../pages/login/login';

    1. 将 rootPage 改为 LoginPage

    rootPage:any = LoginPage;

    运行 server 后,可以看到应用直接进入到了登录界面


    利用 LocalStorage 存储登录状态

    创建 login 方法

    在 LoginPage 类中创建 login 方法,模拟登录的过程:

    login(){
            //模拟验证登录
            if(this.userData.username==='test' && this.userData.password==='123456'){
                //将用户名储存到 localStorage 中
                window.localStorage.setItem('username',this.userData.username);
                this.navCtrl.setRoot(TabsPage);
            }
        }
    

    假设用户名为 test,密码为 123456,当两者匹配时,将用户名存储到 Storage 中,并跳转到 Tabs 页面。

    注意:

    1. 引入 TabsPage

    import { TabsPage } from '../tabs/tabs';

    1. 把 NavController 注入到类中:

    constructor(private navCtrl:NavController){}

    绑定click事件

    将组件中的 click 方法绑定到模板按钮的事件中:

    <button ion-button block (click)="login()">登录</button>

    Angular中 (事件名) 用于将模板上的元素和绑定组件中的方法相绑定,即将事件流从模板传到组件,因为组件里的方法对外不可见,所以不要使用 onclick 来操作。

    动图:模拟登录操作

    为什么用 setRoot 而不是 push

    来扯点ionic3[2] 页面一线牵 珍惜这段缘中我们讲到使用 NavController 的 push 方法跳转页面,为何这里使用的却是另一个方法 setRoot 呢?因为这两种方法的原理不同,push是将新页面推送到页面栈中,新页面可以 pop 回旧页面;而 setRoot 是将原有的根页面替换成新页面,相当于换了一个新的页面栈,原有的页面已经被回收掉了,这时候新页面是无法 pop 回旧页面的。

    在界面表现上,如果是通过 push 进 Tabs 页面,可以通过 Android 设备上的返回按钮回到登录页面,这显然不符合我们的操作逻辑。

    在首页提取 Storage 的数据

    登录成功后,我们要在其它页面上使用用户的数据,方法很简单,使用 getItem 将其提取出来就行。

    export class HomePage {
    
        username:string="";
    
      constructor(public navCtrl: NavController) {}
    
      ionViewWillEnter(){
        this.username=window.localStorage.getItem('username');
      }
    
    }
    

    将用户名输出到模板中:

    <ion-content padding>
      <p>欢迎你:{{username}}</p>
    </ion-content>
    
    首页上输出了用户名

    利用登录状态进行页面跳转

    在测试过程中,你会发现,浏览器的每次刷新都要重新登录。这时,就需要修改在此修改 app.component.ts 添加一个钩子:判断 Storage 中存在 username 与否,定义不同的 rootPage :

    export class MyApp {
      rootPage:any;
    
      constructor(platform: Platform, statusBar: StatusBar, splashScreen: SplashScreen) {
    
        if(window.localStorage.getItem('username'))
          this.rootPage=TabsPage;
        else
          this.rootPage=LoginPage;
    
       platform.ready().then(() => {
         ...
    

    再刷新页面可以发现,APP 直接进入首页了。

    清除 Storage 中的用户信息

    在首页添加注销按钮,清除 Storage 中的 username,并跳转回登录页面。
    home.ts

    logout(){
        window.localStorage.removeItem('username');
        this.navCtrl.setRoot(LoginPage);
      }
    

    home.html

    <ion-content padding>
      <p>欢迎你:{{username}}</p>
      <button ion-button round (click)="logout()">注销</button>
    </ion-content>
    
    动图:注销操作

    其它

    1. LocalStorage 的数据是没有过期时间的,只要它没有被删除,就会永久地储存在 Storage 中。如果你希望数据在一定时间内失效,可以使用 SessionStorage 来替代。

    2. LocalStorage 和 SessionStorage 的存储空间只有 5MB,请不要存储大量的数据。

    3. 在新版 iOS 中,LocalStorage 可能会在系统清理内存时被清除,在 Android 中也可能发生 LocalStorage 被清除的情况。如果你需要更好地存储方案,可以考虑使用 SQLlite 来替代。

    提供参考的文档

    1. Window.localStorage | MDN
    2. NavController API | ionic官方文档
    3. Angular 事件绑定 | Angular 中文官方文档

    下一章:来扯点ionic3[8] 模态框 Alerts 和 Toast

    相关文章

      网友评论

      • 69af9685a256:logout点击返回登录页面,在安卓系统中会有底部tab栏,应该如何改进呢
        69af9685a256:@穿鞋的面条你写的这些是不是有angular的基础的呢,要用好ionic是不是要全面系统的学angular
        69af9685a256:@穿鞋的面条 没懂。。有具体代码么。还比较新手
        穿鞋的面条:@zpone123123 在构造函数中注入App,用他的getRootNav方法,然后再setRoot
      • 8d509ac600e8:能把每次实验的代码,放出来,看看不
      • 8d509ac600e8:期待继续更新
      • dml1874:请教一个问题,window.sessionStorage的有效是多久?
      • 863724af9e61:目前看到最通俗易懂的教程,希望继续更新
      • 90624f2fc802:不错,学到了setRoot
      • 2d6182223e59:膜拜~~~~
      • ceido:感谢分享!😄

      本文标题:来扯点ionic3[7] LocalStorage的使用—以登录

      本文链接:https://www.haomeiwen.com/subject/tsugmxtx.html