1. 程式人生 > >ReactNative進階之react-native-storage的使用及封裝

ReactNative進階之react-native-storage的使用及封裝

本篇部落格將帶大家展開reactnative中關於資料持久化儲存的學習。其中涉及到了nodejs的語法的相關知識,也稍做介紹。好了,廢話不多說。在androind中資料的持久化儲存用的比較多的就是shareperferce,通過shareperferce會在手機建立一個xml檔案,其中資料就是已key-value的鍵值對儲存的。reactnative方式也是相似的,不過他的儲存資料結構是json串。下面看一下官網的截圖。

這裡寫圖片描述

關於AsyncStorage的介紹大體瀏覽一遍就可以了。重點看紅字部分。推薦有使用react-native-storage模組。 有人問,為什麼使用這個模組? 人家不是說了嗎?提供了更多便利的功能。本文也是主要講解react-native-storage模組的使用和封裝。

react-native-storage的使用也很簡單,按照步驟來就可以了。

第二步:執行命令,下載module。npm install react-native-storage –save

第三步:可以愉快的玩耍了,參照文件整合到專案中。

第四步:根據自己需求進行封裝。方便以後使用。

其中我認為比較重要的就是第二步和第四步了,至於第三步完全就是複製貼上。 接下來我就將react-native-storage的簡單封裝給大家介紹下。
react-native-storage的核心類是Storage,增刪查都是通過Storage物件完成的,在使用的時候要先全域性配置儲存的基本屬性,例如儲存時間等。接下來就是儲存,刪除,查詢的那些操作了。

import React, { Component } from 'react';
import Storage from 'react-native-storage';

import {
  AppRegistry,
   View,AsyncStorage 
} from 'react-native';

import SYNC from './sync';

var storage;
var defaultExpires = 1000*3600*24;
var size = 1000;

 export default class MySorage extends Component{


  static _getStorage(){

      if
(storage==undefined){ storage = new Storage({ // 最大容量,預設值1000條資料迴圈儲存 size: size, // 儲存引擎:對於RN使用AsyncStorage,對於web使用window.localStorage // 如果不指定則資料只會儲存在記憶體中,重啟後即丟失 storageBackend: AsyncStorage, // 資料過期時間,預設一整天(1000 * 3600 * 24 毫秒),設為null則永不過期 defaultExpires: defaultExpires, // 讀寫時在記憶體中快取資料。預設啟用。 enableCache: true, // 如果storage中沒有相應資料,或資料已過期, // 則會呼叫相應的sync方法,無縫返回最新資料。 // sync方法的具體說明會在後文提到 // 你可以在建構函式這裡就寫好sync的方法 // 或是寫到另一個檔案裡,這裡require引入 // 或是在任何時候,直接對storage.sync進行賦值修改 sync: SYNC // 這個sync檔案是要你自己寫的 }); } return storage; } /** key:儲存的key值 object:儲存的value expires:有效時間, */ static _sava3(key,object,expires){ this.isInit(); storage.save({ key: key, // 注意:請不要在key中使用_下劃線符號! data: object, // 如果不指定過期時間,則會使用defaultExpires引數 // 如果設為null,則永不過期 expires: expires }); } static _sava(key,object){ this._sava3(key,object,defaultExpires); } static _remove(key){ this.isInit(); // 刪除單個數據 storage.remove({ key: key, }); } static _removeAll(){ this.isInit(); // 移除所有"key-id"資料(但會保留只有key的資料) storage.clearMap(); } static _clearDataByKey(key){ this.isInit(); // !! 清除某個key下的所有資料 storage.clearMapForKey(key); } /** 查詢資料 */ static _load(key,callBack){ this._load3(key,null,null,callBack); } static _load3(key,params,someFlag,callBack){ this.isInit(); storage.load({ key: key, // autoSync(預設為true)意味著在沒有找到資料或資料過期時自動呼叫相應的sync方法 autoSync: true, // syncInBackground(預設為true)意味著如果資料過期, // 在呼叫sync方法的同時先返回已經過期的資料。 // 設定為false的話,則始終強制返回sync方法提供的最新資料(當然會需要更多等待時間)。 syncInBackground: true, // 你還可以給sync方法傳遞額外的引數 syncParams:{ params, someFlag: someFlag, }, }).then(ret => { callBack(ret); return ret; }).catch(err => { //如果沒有找到資料且沒有sync方法, //或者有其他異常,則在catch中返回 console.warn(err.message); switch (err.name) { case 'NotFoundError': // TODO; break; case 'ExpiredError': // TODO break; } }); } static isInit(){ if(storage==undefined){ throw "請先呼叫_getStorage()進行初始化"; } } }

全域性配置只需配置一次即可,這個配置引數介紹的很詳細,我就不羅嗦了。重點看_getStorage()中sync這個欄位。這裡接受的是一個物件。在本地查詢不到結果的時候,會根據查詢key的值載入物件中的方法(方法名就是key)。而SYNC 就是我們匯出的js檔案,這裡就涉及到nodejs中的模組這個概念`,模組是用來隔離和實現不同功能的片段,javaScrip中並沒有分模組,這也是js中的一大缺陷。而模組的使用就用到了export這個關鍵字。

let  SYNC = {};
SYNC.user3 =(params)=>{

    if(params == null) return;
    // sync方法的名字必須和所存資料的key完全相同
    // 方法接受的引數為一整個object,所有引數從object中解構取出
    // 這裡可以使用promise。或是使用普通回撥函式,但需要呼叫resolve或reject。
      let { id, resolve, reject, syncParams: { extraFetchOptions, someFlag } } = params;
      fetch('user/', {
        method: 'GET',
        body: 'id=' + id,
        ...extraFetchOptions,
      }).then(response => {
        return response.json();
      }).then(json => {
        //console.log(json);
        if(json && json.user){
          storage.save({
            key: 'user',
            id,
            data: json.user
          });

          if (someFlag) {
            // 根據syncParams中的額外引數做對應處理
          }

          // 成功則呼叫resolve
          resolve && resolve(json.user);
        }
        else{
          // 失敗則呼叫reject
          reject && reject(new Error('data parse error'));
        }
      }).catch(err => {
        console.warn(err);
        reject && reject(err);
      });
    }

export default SYNC

匯出方式就是這樣,方法名稱是根據你儲存的key的值而定的。
在load方法中我們進行了回撥,傳遞一個函式作為引數,將結果通過函式回撥,方便我們的呼叫。
使用:
初始化:MySorage._getStorage();
global.storage = storage;

存值:
var user = new Object();
user.from = “我來自中國”;
user.userid = “我的id是”;
user.token = “我的token”;
MySorage._sava(“user3”,user);

取值:
MySorage._load(“user3”,function(data){
console.log(“—–data—–”,data);
});
通過簡單的封裝,是不是用起來也簡單多了,但是還是有很多地方需要改進,我只是根據demo簡單寫了下,歡迎交流!!

相關推薦

ReactNativereact-native-storage的使用封裝

本篇部落格將帶大家展開reactnative中關於資料持久化儲存的學習。其中涉及到了nodejs的語法的相關知識,也稍做介紹。好了,廢話不多說。在androind中資料的持久化儲存用的比較多的就是shareperferce,通過shareperferce會在手機

JavaFutureTask的用法解析

1 FutureTask概念 FutureTask一個可取消的非同步計算,FutureTask 實現了Future的基本方法,提空 start cancel 操作,可以查詢計算是否已經完成,並且可以獲取計算的結果。結果只可以在計算完成之後獲取,get方法會阻塞

AsyncStorage 和 react-native-storage 簡單封裝

AsyncStorage是一個簡單的、非同步的、持久化的Key-Value儲存系統,它對於App來說是全域性性的,具體詳細api可檢視連結,點選檢視詳細內容,本文主要是基於AsyncStorage 和 github(react-native-storage),做了一層簡單的封

Django查詢優化、extra註入SQL批量創建

所有 定義 支持 primary spl 獲取 upd 數據庫操作 ephone Django查詢優化   Django的查詢優化用到兩個函數——select_related()和prefetch_related()。   select_related()用的是連表join

React路——React基礎

    JSX是一種用於描述UI的JavaScript擴充套件語法,React使用這種語法描述元件的UI。 1.基本語法 JSX的基本語法和XML語法相同,都是使用成對的標籤構成一個樹狀結構的資料。 const element = (     &

HadoopMR中MapTask並行度決定機制切片機制

前言 maptask的並行度決定map階段的任務處理併發度,進而影響到整個job的處理速度 那麼,mapTask並行例項是否越多越好呢?其並行度又是如何決定呢? 1 mapTask並行度的決定機制 一個job的mapTask並行度由客戶端在

Android路(一) -- AS 3.0NDK環境搭建hello world

通過一段找實習的經歷,以及快應用、小程式、web app等移動開發模式的衝擊,深深為安卓原生開發的未來感到擔憂,希望接入人工智慧API和物聯網井噴能給安卓開發帶來新的生機吧。當然,作為小白我是不用擔心這麼多的,做自己喜歡的事就好了,於是拋開雜念,繼續學習安卓。NDK開發環境的

Pandas使用DataFrame進行資料分析比賽路(二):日期資料處理:按日期篩選、顯示統計資料

首先,表格的資料格式如下: 1、獲取某年某月資料 data_train = pd.read_csv('data/train.csv') # 將資料型別轉換為日期型別 data_train[

ReactNativereact-native-image-crop-picker儲存圖片到應用內部

在使用react-native-image-crop-picker(版本0.20.0)元件選擇圖片的時候,我希望將選取的圖片儲存到應用內部。但是在ios端,選取的圖片被儲存在臨時目錄中,大約3天左右會被自動刪除。在android端,選取的圖片沒有往App內部儲存,還是在原來的

Java碼農路~構造方法&靜態與成員變數方法

一 構造方法當你在這個類中沒有提供無參的構造方法的時候,系統會在你建立物件的時候,也會呼叫無參的構造,而這個無參方法,系統會幫你提供一個.如果你只是提供了有參的構造方法,那麼系統將不再給你提供 無參構造方法了建議:寫類的時候 ,無參,有參的構造方法都寫上以保證不會出錯.二 靜

程式設計師路(C、C++、Java、Python經典書籍學習順序)

程式設計師進階之路 初級: 《計算機程式的構造和解釋》 C語言: 1.《C語言程式設計:現代方法:第2版》 2.《C Primer Plus 第五版》 3.《C程式設計語言(第2版·新版)》 4.《C和指標》 5.《C專家程式設計》 6.《C 陷阱與缺陷》 7.《資料結構C

我的Android旅------>【強力推薦】Android開源圖表庫XCL-Charts版本釋出展示頁

         因為要做圖表相關的應用,後來百度發現了一個很好的Android開源圖表庫(XCL-Charts is a free charting library for Android plat

React 路(一)

在開始 React 學習之前我們先進入官網 https://react.docschina.org/ 看看官方對 React 的解釋:React 是用於構建使用者介面的JavaScript 庫。我們只需要知道這點就夠了,對於其他的解釋當我們深入學習之後就會自然而然地懂了。 本文將按照官網

React 路(二)

在之前的文章中我們介紹了 React 開發的環境搭建及目錄介紹和整理,本篇文章將介紹 React 建立元件、JSX 語法、繫結資料和繫結物件。 之前我們已經將專案運行了起來,我們再來看一下目錄結構: 其中 App.js 檔案為我們的根元件,裡面的程式碼: 其中 import 為我們需要引入的檔案

React 路(三)

之前的文章我們介紹了 React 建立元件、JSX 語法、繫結資料和繫結物件。接下來我們將介紹 React 繫結屬性( 繫結class  繫結style)、引入圖片  迴圈陣列渲染資料。 上一篇中我們在 components 目錄中建立了 Home.js 元件並將其掛在到了 A

React 路(四)

之前的文章我們介紹了  React 繫結屬性( 繫結class  繫結style)、引入圖片  迴圈陣列渲染資料。接下來我們將介紹 React 事件,方法, React定義方法的幾種方式 獲取資料 改變資料 執行方法傳值。 1 import React, {Co

React 路(五)

之前的文章我們介紹了  React 事件,方法, React定義方法的幾種方式 獲取資料 改變資料 執行方法傳值。接下來我們將介紹 React 表單事件 鍵盤事件 事件物件以及 React中 的 ref 獲取 dom 節點 、雙向資料繫結,約束性和非約束性元件。 1 im

React 路(六)

之前的文章我們介紹了 React 表單事件 鍵盤事件 事件物件以及 React中 的 ref 獲取 dom 節點 、雙向資料繫結。接下來我們將介紹 React 表單詳解 約束性和非約束性元件 input text checkbox radio  select 

React 從入門到路(七)

之前的文章我們介紹了 React 表單詳解 約束性和非約束性元件 input text checkbox radio  select  textarea  以及獲取表單的內容。接下來我們將介紹 React中的元件、父子元件、React props父元件給子元件傳值、子元

React 從入門到路(八)

之前的文章我們介紹了 React中的元件、父子元件、React props父元件給子元件傳值、子元件給父元件傳值、父元件中通過refs獲取子元件屬性和方法。接下來我們將介紹 React propTypes  defaultProps。   之前我們已經根據