store-->index.js
//引入vue和vuex
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({ //全局变量定义
state: {
forcedLogin: false, //是否需要强制登录
hasLogin: false,
userInfo: {}
},
mutations: {
login(state, user) {
state.hasLogin = true;
state.userInfo.token = user.token;
uni.setStorage({
key: 'userInfo',
data: user
});
},
logout(state) {
state.hasLogin = false;
state.userInfo = {};
uni.removeStorage({
key: 'userInfo'
});
}
}
})
export default store
main.js
import App from './App'
// #ifndef VUE3
import Vue from 'vue'
Vue.config.productionTip = false
App.mpType = 'app'
import store from './store' //引入
Vue.prototype.$store = store //挂载在Vue实例上
const app = new Vue({
...App,
store //store 对象
})
app.$mount()
// #endif
// #ifdef VUE3
import {
createSSRApp
} from 'vue'
export function createApp() {
const app = createSSRApp(App)
return {
app
}
}
// #endif
提示登录
warmLogin() {
if (!this.hasLogin) {
uni.showModal({
title: '未登录',
content: '登录享受更多',
showCancel: !this.forcedLogin,
success: (res) => {
if (res.confirm) {
/**
* 需要强制登录,用reLaunch
*/
if (this.forcedLogin) {
uni.reLaunch({
url: '../login/login'
});
} else {
uni.navigateTo({
url: '../login/login'
});
}
}
}
});
}
}
登录
<script>
import {
mapState,
mapMutations
} from 'vuex'
export default {
data() {
return {
loading: false,
userInfo: {}
}
},
computed: mapState(['forcedLogin', 'hasLogin']),
methods: {
...mapMutations(['login']),
Login() {
this.loading = true;
if (this.loading) {
uni.login({
provider: 'weixin',
success: (res) => {
this.userInfo.code = res.code;
}
});
uni.getUserProfile({
desc: '获取用户个人信息',
success: (res) => {
this.userInfo.token = res.iv;
this.userInfo.userInfo = res.userInfo;
this.toStore(this.userInfo)
},
fail: (err) => {
this.loading = false;
}
});
}
},
toStore(user) {
this.login(user);
//强制登录reLaunch跳转,返回也使用reLaunch
if (this.forcedLogin) {
uni.reLaunch({
url: '../index/index'
});
} else {
uni.navigateBack();
}
}
}
}
</script>