提交 6d37a08e 编写于 作者: Q qiang

fix: 优化 storage 读写

上级 a2587994
const STORAGE_DATA_TYPE = '__TYPE'
const STORAGE_KEYS = 'uni-storage-keys'
export function setStorage ({ export function setStorage ({
key, key,
data data
} = {}) { } = {}) {
const value = { const type = typeof data
type: typeof data === 'object' ? 'object' : 'string', const value = type === 'string' ? data : JSON.stringify({
type,
data: data data: data
} })
localStorage.setItem(key, JSON.stringify(value)) try {
const keyList = localStorage.getItem('uni-storage-keys') localStorage.setItem(key, value)
if (!keyList) { } catch (error) {
localStorage.setItem('uni-storage-keys', JSON.stringify([key])) return {
} else { errMsg: `setStorage:fail ${error}`
const keys = JSON.parse(keyList)
if (keys.indexOf(key) < 0) {
keys.push(key)
localStorage.setItem('uni-storage-keys', JSON.stringify(keys))
} }
} }
return { return {
...@@ -32,13 +32,33 @@ export function setStorageSync (key, data) { ...@@ -32,13 +32,33 @@ export function setStorageSync (key, data) {
export function getStorage ({ export function getStorage ({
key key
} = {}) { } = {}) {
const data = localStorage.getItem(key) const value = localStorage && localStorage.getItem(key)
return data ? { if (typeof value !== 'string') {
data: JSON.parse(data).data, return {
data: '',
errMsg: 'getStorage:fail'
}
}
let data = value
try {
const object = JSON.parse(value)
// 兼容App端历史格式
const type = localStorage.getItem(key + STORAGE_DATA_TYPE)
if (!type) {
const keys = Object.keys(object)
if (keys.length === 2 && 'type' in object && 'data' in object) {
data = object.data
} else if (keys.length === 1 && 'type' in object) {
data = ''
}
} else if (type !== 'String') {
data = object
data = typeof data === 'string' ? JSON.parse(data) : data
}
} catch (error) { }
return {
data,
errMsg: 'getStorage:ok' errMsg: 'getStorage:ok'
} : {
data: '',
errMsg: 'getStorage:fail'
} }
} }
...@@ -52,14 +72,11 @@ export function getStorageSync (key) { ...@@ -52,14 +72,11 @@ export function getStorageSync (key) {
export function removeStorage ({ export function removeStorage ({
key key
} = {}) { } = {}) {
const keyList = localStorage.getItem('uni-storage-keys') if (localStorage) {
if (keyList) { // 兼容App端历史格式
const keys = JSON.parse(keyList) localStorage.removeItem(key + STORAGE_DATA_TYPE)
const index = keys.indexOf(key) localStorage.removeItem(key)
keys.splice(index, 1)
localStorage.setItem('uni-storage-keys', JSON.stringify(keys))
} }
localStorage.removeItem(key)
return { return {
errMsg: 'removeStorage:ok' errMsg: 'removeStorage:ok'
} }
...@@ -72,7 +89,7 @@ export function removeStorageSync (key) { ...@@ -72,7 +89,7 @@ export function removeStorageSync (key) {
} }
export function clearStorage () { export function clearStorage () {
localStorage.clear() localStorage && localStorage.clear()
return { return {
errMsg: 'clearStorage:ok' errMsg: 'clearStorage:ok'
} }
...@@ -82,18 +99,23 @@ export function clearStorageSync () { ...@@ -82,18 +99,23 @@ export function clearStorageSync () {
clearStorage() clearStorage()
} }
export function getStorageInfo () { // TODO 暂时先不做大小的转换 export function getStorageInfo () {
const keyList = localStorage.getItem('uni-storage-keys') const length = (localStorage && (localStorage.length || localStorage.getLength())) || 0
return keyList ? { const keys = []
keys: JSON.parse(keyList), let currentSize = 0
currentSize: 0, for (let index = 0; index < length; index++) {
limitSize: 0, const key = localStorage.key(index)
if (key !== STORAGE_KEYS && key.indexOf(STORAGE_DATA_TYPE) + STORAGE_DATA_TYPE.length !== key.length) {
const value = localStorage.getItem(key)
currentSize += key.length + value.length
keys.push(key)
}
}
return {
keys,
currentSize: Math.ceil(currentSize * 2 / 1024),
limitSize: Number.MAX_VALUE,
errMsg: 'getStorageInfo:ok' errMsg: 'getStorageInfo:ok'
} : {
keys: '',
currentSize: 0,
limitSize: 0,
errMsg: 'getStorageInfo:fail'
} }
} }
...@@ -101,4 +123,4 @@ export function getStorageInfoSync () { ...@@ -101,4 +123,4 @@ export function getStorageInfoSync () {
const res = getStorageInfo() const res = getStorageInfo()
delete res.errMsg delete res.errMsg
return res return res
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册