zoukankan      html  css  js  c++  java
  • react native 增加react-native-storage

    现时需要使用react-native-storage本地存储

    第一步:配置storage主文件

    mystorage.js

    import { AsyncStorage } from 'react-native';
    import Storage from 'react-native-storage';
    
    import sync from './sync';
    
    let storage = new Storage({
        // 最大容量,默认值1000条数据循环存储
        size: 1000,
    
        // 存储引擎:对于RN使用AsyncStorage,对于web使用window.localStorage
        // 如果不指定则数据只会保存在内存中,重启后即丢失
        storageBackend: AsyncStorage,
    
        // 数据过期时间,默认一整天(1000 * 3600 * 24 毫秒),设为null则永不过期
        defaultExpires: 1000 * 3600 * 1,//一个小时
    
        // 读写时在内存中缓存数据。默认启用。
        enableCache: true,
    
        // 如果storage中没有相应数据,或数据已过期,
        // 则会调用相应的sync方法,无缝返回最新数据。
        // sync方法的具体说明会在后文提到
        // 你可以在构造函数这里就写好sync的方法
        // 或是写到另一个文件里,这里require引入
        // 或是在任何时候,直接对storage.sync进行赋值修改
        // sync: require('./sync')
    })
    
    storage.sync = sync;
    
    // 全局变量
    global.storage = storage;

    第二步:配置storage的sync方法

    sync.js

    import { default_API_url } from '../config/index';
    
    const sync = {
        // sync方法的名字必须和所存数据的key完全相同
        // 方法接受的参数为一整个object,所有参数从object中解构取出
        // 这里可以使用promise。或是使用普通回调函数,但需要调用resolve或reject。
        issue(params) {
            let { id, resolve, reject, syncParams: { extraFetchOptions, someFlag } } = params;
    
            fetch(default_API_url + '/issue/', {
                method: 'GET',
                headers: {
                    'Accept': 'application/json',
                    'Content-Type': 'application/json',
                    'Authorization': extraFetchOptions.token
                },
                // body: 'id=' + id,
                ...extraFetchOptions,
            }).then(response => {
                return response.json();
            }).then(json => {
                console.log(json);
                if (json && json.results) {
                    storage.save({
                        key: 'issue',
                        id,
                        data: json.results
                    });
    
                    if (someFlag) {
                        // 根据syncParams中的额外参数做对应处理
                    }
    
                    // 成功则调用resolve
                    resolve && resolve(json.results);
                }
                else {
                    // 失败则调用reject
                    reject && reject(new Error('data parse error'));
                }
            }).catch(err => {
                console.warn(err);
                reject && reject(err);
            });
        }
    }
    
    export default sync;

    第三步:App.js调用storage主文件

    //storage
    import storage from './src/util/myStorage';

    第四步:应用中调用

    homeComponent.js

    storage.load({
        key: 'issue',
    
        // autoSync(默认为true)意味着在没有找到数据或数据过期时自动调用相应的sync方法
        autoSync: true,
    
        // syncInBackground(默认为true)意味着如果数据过期,
        // 在调用sync方法的同时先返回已经过期的数据。
        // 设置为false的话,则等待sync方法提供的最新数据(当然会需要更多时间)。
        syncInBackground: true,
    
        // 你还可以给sync方法传递额外的参数
        syncParams: {
            extraFetchOptions: {
                // 各种参数
                token: this.props.userEntity.token
            },
            someFlag: true,
        },
    }).then(ret => {
        // 如果找到数据,则在then方法中返回
        // 注意:这是异步返回的结果(不了解异步请自行搜索学习)
        // 你只能在then这个方法内继续处理ret数据
        // 而不能在then以外处理
        // 也没有办法“变成”同步返回
        // 你也可以使用“看似”同步的async/await语法
    
        console.log(ret);
        this.setState({ issueData: ret });
    }).catch(err => {
        //如果没有找到数据且没有sync方法,
        //或者有其他异常,则在catch中返回
        console.warn(err.message);
        switch (err.name) {
            case 'NotFoundError':
                // TODO;
                break;
            case 'ExpiredError':
                // TODO
                break;
        }
    })

  • 相关阅读:
    友盟上报 IOS
    UTF8编码
    Hill加密算法
    Base64编码
    Logistic Regression 算法向量化实现及心得
    152. Maximum Product Subarray(中等, 神奇的 swap)
    216. Combination Sum III(medium, backtrack, 本类问题做的最快的一次)
    77. Combinations(medium, backtrack, 重要, 弄了1小时)
    47. Permutations II(medium, backtrack, 重要, 条件较难思考)
    3.5 find() 判断是否存在某元素
  • 原文地址:https://www.cnblogs.com/weschen/p/8600928.html
Copyright © 2011-2022 走看看