You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

145 lines
3.7 KiB

1 year ago
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
let lifeData = {};
try{
// 尝试获取本地是否存在lifeData变量第一次启动APP时是不存在的
lifeData = uni.getStorageSync('lifeData');
1 year ago
} catch(e) {
1 year ago
}
// 需要永久存储且下次APP启动需要取出的在state中的变量名
1 year ago
let saveStateKeys = ['vuex_token', 'vuex_user'];
1 year ago
// 保存变量到本地存储中
const saveLifeData = function(key, value){
// 判断变量名是否在需要存储的数组中
if(saveStateKeys.indexOf(key) != -1) {
// 获取本地存储的lifeData对象将变量添加到对象中
let tmp = uni.getStorageSync('lifeData');
// 第一次打开APP不存在lifeData变量故放一个{}空对象
tmp = tmp ? tmp : {};
tmp[key] = value;
// 执行这一步后所有需要存储的变量都挂载在本地的lifeData对象中
uni.setStorageSync('lifeData', tmp);
}
}
const store = new Vuex.Store({
// 下面这些值仅为示例,使用过程中请删除
state: {
// 如果上面从本地获取的lifeData对象下有对应的属性就赋值给state中对应的变量
// 加上vuex_前缀是防止变量名冲突也让人一目了然
// 如果vuex_version无需保存到本地永久存储无需lifeData.vuex_version方式
vuex_version: '1.0.0',
1 year ago
vuex_default_icon: '/static/logo-mini.png',
1 year ago
vuex_token: '',
vuex_user: {},
1 year ago
1 year ago
vuex_site: {
name: '',
id: ''
},
1 year ago
vuex_location: {
latitude: '',
longitude: '',
city: '',
1 year ago
cityCode: '',
status: 0, // 0失败 1成功 2手动选择
1 year ago
},
vuex_order_status: [
{
name: "全部",
value: "",
},
{
name: "待支付",
value: 0,
},
{
name: "已支付",
value: 1,
},
{
1 year ago
name: "已退款",
1 year ago
value: 2,
1 year ago
}
1 year ago
// {
// name: '已取消'
// }
]
1 year ago
},
mutations: {
$uStore(state, payload) {
// 判断是否多层级调用state中为对象存在的情况诸如user.info.score = 1
let nameArr = payload.name.split('.');
let saveKey = '';
let len = nameArr.length;
if(nameArr.length >= 2) {
let obj = state[nameArr[0]];
for(let i = 1; i < len - 1; i ++) {
obj = obj[nameArr[i]];
}
obj[nameArr[len - 1]] = payload.value;
saveKey = nameArr[0];
} else {
// 单层级变量在state就是一个普通变量的情况
state[payload.name] = payload.value;
saveKey = payload.name;
}
// 保存变量到本地,见顶部函数定义
saveLifeData(saveKey, state[saveKey])
1 year ago
},
SET_CITY(state, { cityName, cityCode }) {
state.vuex_location.city = cityName
state.vuex_location.cityCode = cityCode
1 year ago
state.vuex_location.status = 2
1 year ago
}
},
actions: {
async getLocation({ state }) {
try {
const [err, res] = await uni.getLocation({
type: 'gcj02'
})
if (err) {
await Promise.reject(err)
}
console.log(state, res)
state.vuex_location.latitude = res.latitude;
state.vuex_location.longitude = res.longitude;
const address = await new Promise((resolve, reject) => {
Vue.prototype.$qqmapsdk.reverseGeocoder({
location: {
latitude: res.latitude,
longitude: res.longitude
},
success: address => resolve(address),
fail: error => reject(error)
})
})
console.log('address', address)
if (!!address.status) {
await Promise.reject(address.message)
}
state.vuex_location.city = address?.result?.ad_info.city
state.vuex_location.cityCode = address?.result?.ad_info?.city_code
1 year ago
state.vuex_location.status = 1
1 year ago
} catch (err) {
console.error(err)
1 year ago
state.vuex_location.status = 0
1 year ago
uni.showToast({
title: '获取定位失败',
icon: 'none',
duration: 2000
})
}
1 year ago
}
}
})
export default store