快取資料
每個微信小程式都可以有自己的本地快取,可以通過 wx.setStorage(wx.setStorageSync)、wx.getStorage(wx.getStorageSync)、wx.clearStorage(wx.clearStorageSync)可以對本地快取進行設定、獲取和清理。同一個微信使用者,同一個小程式 storage 上限為 10MB
。localStorage 以使用者維度隔離,同一臺裝置上,A 使用者無法讀取到 B 使用者的資料。
資料常用於哪裡?
對於資料需求較小的歷史記錄、購物車事件等都可以使用storage
進行快取,Storage
將資料儲存在本地快取中指定的 key
中,如果重複會覆蓋掉原來該 key
對應的內容
可以參照微信小程式開發手冊中的Storage
如何使用非同步介面進行資料快取?
將資料儲存在本地快取中指定的 key 中,會覆蓋掉原來該 key 對應的內容,這是一個非同步介面。
複製程式碼
OBJECT引數說明:
引數 | 型別 | 必填 | 說明 |
---|---|---|---|
key | String | 是 | 本地快取中的指定的 |
data | Object/String | 是 | 需要儲存的內容 |
success | Function | 否 | 介面呼叫成功的回撥函式 |
fail | Function | 否 | 介面呼叫失敗的回撥函式 |
complete | Function | 否 | 介面呼叫結束的回撥函式(呼叫成功、失敗都會執行) |
示例程式碼
wx.setStorage({
key:"key",
data:"value"
})
複製程式碼
當setStorage
之後可以去到開發者工具裡面檢視
這是沒有儲存值的情況
可以看到是沒有key
值的
那麼當我們去進行輸入搜尋
最後再去storage
中檢視
獲取到了一個key
為history
的Array
陣列
那麼再去進行搜尋
再看看storage
得到了一個陣列而且沒有被覆蓋,那麼怎麼實現的呢?
先來看看程式碼
search.wxml
<view class="search-top-input">
<input type="text" placeholder="搜尋公司/職位" auto-focus="true" value="{{inputsearch}}"
bindconfirm="search"
bindinput="inputSearchTap"
data-index="{{index}}"/>
</view>
<view class="search-history" wx:if="{{status}}">
<view class="search-history-title">
<text>歷史搜尋</text>
<image src="../../images/delete.png" bindtap="deleteHistory"></image>
</view>
<view class="search-history-detail" >
<view class="history-detail" wx:for="{{history}}" wx:key="{{item}}" bindtap="historySearch" data-index="{{index}}">
<text class="detail" >{{item}}</text>
</view>
</view>
</view>
search.js
設定data
data: {
status:false,
inputsearch:``,
job:[],
history:[],
},
首先去獲取storage中的值
onLoad: function (options) {
var that =this;
wx.getStorage({
key: `history`,
success: function(res){
that.setData({
history:res.data,
})
if(that.data.history.length==0){
that.setData({
status:false
});
}else{
that.setData({
status:true
})
}
},
fail: function(res) {
console.log(res+`aaaaa`)
}
});
},
進行搜尋和快取資料到storage中
search:function(e){
var that =this;
var sear =this.data.inputsearch;
var jobs=this.data.job;
var input = new RegExp(sear);
var temp = [];
if(sear == ``){
wx.showToast({
title: `請輸入要搜尋資訊`,
icon:"none",
duration: 1000
});
return false;
}else{
this.data.history.unshift(sear);
wx.setStorage({
key: `history`,
data: that.data.history,
success: function(res){
that.setData({
history:that.data.history,
status:true
})
console.log(res.data);
},
})
for(let i =0;i<jobs.length;i++){
if(input.test(jobs[i].job) || input.test(jobs[i].company) || input.test(jobs[i].address)){
temp.push(jobs[i]);
var detail=temp;
app.globalData.details=detail;
}
}
if(temp ==``){
wx.showToast({
title: `暫無此資訊`,
icon:"none",
duration: 1000
});
this.setData({
inputsearch:``
})
}else if(temp){
wx.navigateTo({
url:`../about/about`
})
this.setData({
inputsearch:``
})
}
}
},
複製程式碼
將storage
中的key
值設為hisotry
wx.setStorage({
key: `history`,
data: that.data.history,
)}
複製程式碼
定義一個陣列history
空陣列去獲取storage
中的值,首先是去查詢有沒有該key
值,如果沒有則fail
,那麼history
依然為空陣列
wx.setStorage({
key: `history`,
data: that.data.history,
success: function(res){
that.setData({
history:that.data.history,
status:true
})
},
})
複製程式碼
返回得到history
之後再去將inputsearch
的值新增到history
中,
這裡有個誤區
可能你會將輸入的值inputsearch push到一個新的空陣列,然後再將這個新陣列push到history陣列中,但這個方法
顯然不可行,你新增之後新陣列將會存放在history陣列的第一個下標的陣列下,
對於history陣列也就只有兩個值
複製程式碼
好了,回到我要說的,那麼如何將inputsearch
新增到history
中呢,可以使用unshift
方法或者push
方法,這裡應該使用unshift
應該將每個新增值存放在history
的第一個位置,這是其實就是一個使用者體驗問題了
var that =this;
var sear =this.data.inputsearch;
this.data.history.unshift(sear);
wx.setStorage({
key: `history`,
data: that.data.history,
success: function(res){
that.setData({
history:that.data.history,
status:true
})
console.log(res.data);
},
})
複製程式碼
好了,這樣就不會出現“覆蓋掉”原來的key
值的問題了,是不是美滋滋
當然還有setStorageSync
同步介面的問題
詳情點選這裡
這裡是專案地址
檢視點選這裡
如果你覺得對你有所幫助
那麼給我的github
專案一個Star吧
訪問點選這裡