记录一些前端数据存储的方法!
JS文件
把一些常用数据(json对象、字符串等)保存在js文件中,通过script标签引入使用。
创建
创建js文件
引入
script引入js文件。./ 代表当前目录,../ 代表上级目录。
使用
使用js文件中的数据、变量、函数、类等。
扩展
vue-cli开发的项目中,想在.vue文件中导入js文件。笔记见:VUE导入js文件
Storage API
Web Storage 包含如下两种机制:
sessionStorage 为每一个给定的源(given origin)维持一个独立的存储区域,该存储区域在页面会话期间可用(即只要浏览器处于打开状态,包括页面重新加载和恢复)。localStorage 同样的功能,但是在浏览器关闭,然后重新打开后数据仍然存在(大小限制通常在 2.5-10M之间)。
案例
localStorage案例,给localStorage设置过期时间。
封装Storage类
封装Storage类,可以保存在单独的js文件中,通过script标签引入使用。
class Storage {
constructor(key) {
this.key = 'storage';
}
setItem(params) {
let obj = {
key: '',
value: '',
expires: "",
startTime: new Date().getTime()
}
let options = {};
Object.assign(options, obj, params);
if (options.expires) {
localStorage.setItem(options.key, JSON.stringify(options));
} else {
let type = Object.prototype.toString.call(options.value);
if (Object.prototype.toString.call(options.value) == '[object Object]') {
options.value = JSON.stringify(options.value);
}
if (Object.prototype.toString.call(options.value) == '[object Array]') {
options.value = JSON.stringify(options.value);
}
localStorage.setItem(options.key, options.value);
}
}
getItem(key) {
let item = localStorage.getItem(key);
if (item != null) {
try {
item = JSON.parse(item);
} catch (error) {
item = item;
}
if (item.startTime != null) {
let date = new Date().getTime();
if (date - item.startTime > item.expires) {
localStorage.removeItem(key);
return false;
} else {
return item.value;
}
} else {
return item;
}
} else {
return null;
}
}
removeItem(key) {
localStorage.removeItem(key);
}
clear() {
localStorage.clear();
}
}
使用
保存:
保存:参数可以设置三个,name-作为键key,value-作为值value,expires-过期时间(毫秒)
let storage = new Storage();
storage.setItem({
key:"name",
value:"小黑"
})
获取:
let value = storage.getItem('name');
console.log('大家好,我是',value);
扩展
localStorage有大小的限制(通常在 2.5-10M之间),有大数据量存储需求可以使用插件localForage。
localForage使得离线数据存储在任何浏览器都是一项容易的任务。若浏览器不支持 IndexedDB 或 WebSQL,则使用 localStorage。localForage 的使用方法与localStorage相似很容易上手,可以查看官方文档了解。
默认情况下,localForage 按照以下顺序选择数据仓库的后端驱动:
- IndexedDB
- WebSQL
- localStorage
注意:vue-cli开发的项目中使用,可以查看这篇文档。
应用场景:移动APP开发,数据保存在本地,无大小限制。(表数据也可以使用json格式保存)
前端数据库
前端数据库——WebSQL和IndexedDB
IndexedDB API是强大的,但对于简单的情况可能看起来太复杂。如果你更喜欢一个简单的API,请尝试 localForage、dexie.js、PouchDB、idb、idb-keyval、JsStore 或者 lovefield 之类的库,这些库使 IndexedDB 对开发者来说更加友好。
注意:Web SQL兼容性不好,一般使用基于IndexedDB API的第三方库来简化数据存储操作。
案例
WebSQL案例,了解学习即可,Web SQL的兼容性并不是特别理想,仅chrome ,safari,opera 10.5+等浏览器支持。
封装DaoTools工具
封装DaoTools工具(一个json对象),可以保存在单独的js文件中,通过script标签引入使用。
根据需要创建数据库,编写相应的crud函数,也可以直接调用transaction函数使用sql语句进行crud操作。
DaoTools = {
db: null,
init: function() {
if (typeof openDatabase == 'undefined') {
alert('当前浏览器不支持Web SQL,建议使用Chrome浏览器!');
return;
}
this.db = openDatabase('myDB', '1.0', '前端数据库,Web SQL', 1024 * 1024 * 10);
this.db.transaction(function(tx) {
tx.executeSql(
'CREATE TABLE IF NOT EXISTS userinfo(username TEXT,password TEXT, email TEXT)', []);
tx.executeSql('CREATE TABLE IF NOT EXISTS sysparam(key TEXT,value TEXT)', []);
DaoTools.addUser({
username: 'admin',
password: '12345',
email: '1135637451@qq.com'
});
});
},
transaction: function(backCall) {
DaoTools.db.transaction(backCall);
},
update: function(sql, params, hdcall) {
DaoTools.db.transaction(function(tx) {
tx.executeSql(sql, params,
function(tx, rs) {
console.log('sql执行成功!');
if (hdcall) hdcall();
},
function(tx, error) {
console.error('sql执行失败!\r\n' + error.source + "::" + error.message);
}
);
});
},
getUserinfo: function(username, backCall) {
DaoTools.db.transaction(function(tx) {
tx.executeSql('SELECT * FROM userinfo WHERE username = ?', [username],
function(tx, rs) {
var json = {};
if (rs.rows.length > 0) {
json = rs.rows.item(0);
}
backCall(json);
},
function(tx, error) {
console.error(error.source + "::" + error.message);
}
);
});
},
addUser: function(userData, backCall) {
var errMsg = '';
if (!userData || !userData.username || !userData.password) {
errMsg = '请完善用户信息!';
if (backCall) backCall(errMsg);
return;
}
DaoTools.getUserinfo(userData.username, data => {
if (Object.keys(data).length > 0) {
errMsg = '存在同名用户!';
if (backCall) backCall(errMsg);
return;
}
DaoTools.db.transaction(function(tx) {
tx.executeSql(
'INSERT INTO userinfo(username,password,email) VALUES(?,?,?)',
[userData.username, userData.password, userData.email ? userData.email :
''
],
function(tx, rs) {
console.log(`新增用户${userData.username}成功`);
if (backCall) backCall();
},
function(tx, error) {
console.error(error.source + "::" + error.message);
}
);
});
});
},
getParam: function(key, backCall) {
DaoTools.db.transaction(function(tx) {
tx.executeSql('SELECT * FROM sysparam WHERE key = ?', [key],
function(tx, rs) {
var v = '';
if (rs.rows.length > 0) {
v = rs.rows.item(0).value;
}
backCall(v);
},
function(tx, error) {
console.error(error.source + "::" + error.message);
}
);
});
},
setParam: function(key, value, backCall) {
DaoTools.db.transaction(function(tx) {
tx.executeSql('DELETE FROM sysparam WHERE key = ?', [key]);
tx.executeSql('INSERT INTO sysparam(value, key) VALUES(?, ?)', [value, key],
function(tx, rs) {
if (backCall) backCall();
console.log(key + "::" + value)
},
function(tx, error) {
console.error(error.source + "::" + error.message);
}
);
});
},
queryAll: function(tableName, backCall) {
DaoTools.db.transaction(function(tx) {
tx.executeSql(`select * from ${tableName}`, [],
function(tx, rs) {
var json = [];
for (var i = 0; i < rs.rows.length; i++) {
json[i] = rs.rows.item(i);
}
backCall(json);
},
function(tx, error) {
console.error(error.source + "::" + error.message);
}
);
});
},
query: function(sql, params, backCall, pageSize, pageIndex) {
DaoTools.db.transaction(function(tx) {
if (pageSize && pageIndex) {
sql = sql + ' limit ' + pageSize + ' offset ' + pageSize * (pageIndex - 1);
pageIndex = pageIndex - 1;
}
console.log(`sql = ${sql}`);
if (!params) params = [];
tx.executeSql(sql, params,
function(tx, rs) {
var json = [];
for (var i = 0; i < rs.rows.length; i++) {
json[i] = rs.rows.item(i);
}
backCall(json);
},
function(tx, error) {
console.error(error.source + "::" + error.message);
}
);
});
},
clear: function() {
var me = this,
cnt = 0;
var cb = function() {
cnt++;
if (cnt == 2) {
me.init();
alert('初始化成功!');
}
};
this.db.transaction(function(tx) {
tx.executeSql('DROP TABLE userinfo', [], cb);
tx.executeSql('DROP TABLE sysparam', [], cb);
});
},
};
(function() {
DaoTools.init();
})();
使用
DaoTools是一个json对象,直接DaoTools.queryAll 方式调用其中封装的函数即可。
DaoTools.queryAll('userinfo',data=>{
console.log(`userinfo表的数据 = \r\n ${JSON.stringify(data)}`);
})
DaoTools.getUserinfo('admin',data=>{
console.log(`用户admin的信息 = \r\n ${JSON.stringify(data)}`);
})
扩展
Web SQL的兼容性并不是特别理想,归咎其原因,主要是因为 Web SQL Database API 实际上并不包含在 HTML5 规范之中。它是一个独立的规范,它引入了一套使用 SQL 操作客户端数据库的 API。其规范已经被停止更新了,所以大多数浏览器并不支持。 Web SQL相对于 sessionStorage ,locationStorage最大的**优势 :**能方便的进行对象存储、能进行大量的数据的处理。
总结
- 主要用于PC端的web 应用,想使用sql语句进行数据crud操作,可以使用Web SQL
- 页面传递参数、状态记录等小数据量场景,可以考虑Storage API
- 不是上边的应用场景,建议使用插件localForage
原文链接:前端数据存储
|