import Vue from 'vue'
import Vuex from 'vuex'
import VueRouter from 'vue-router'
import FastClick from 'fastclick'
import {WechatPlugin, AjaxPlugin, LoadingPlugin, ToastPlugin, AlertPlugin} from 'vux'
import App from './app.vue'
Vue.
use
(Vuex)
Vue.
use
(VueRouter)
Vue.
use
(WechatPlugin)
Vue.
use
(AjaxPlugin)
Vue.
use
(LoadingPlugin)
Vue.
use
(ToastPlugin)
Vue.
use
(AlertPlugin)
const
domainName = 'localhost:8010'
const
serverName = 'localhost:3000'
const
apiPrefix = serverName + '/api/outer'
const
loginTimeOutErrorCode = 'login_timeout_error'
const
store =
new
Vuex.Store({})
store.registerModule('vux', {
state: {
loading: false,
showBack: true,
title: ''
},
mutations: {
updateLoading (state, loading) {
state.loading = loading
},
updateShowBack (state, showBack) {
state.showBack = showBack
},
updateTitle (state, title) {
state.title = title
}
}
})
const
routes = [
{
path: '/',
component:
function
(resolve) {
require
(['./components/init.vue'], resolve)
}
},
{
path: '/index',
component:
function
(resolve) {
require
(['./components/index.vue'], resolve)
},
children: [
{
path: 'test',
component:
function
(resolve) {
require
(['./components/tests/page.vue'], resolve)
}
}
]
},
{
path: '/bind',
component:
function
(resolve) {
require
(['./components/bind.vue'], resolve)
}
}
]
const
router =
new
VueRouter({
routes
})
router.beforeEach(
function
(to, from, next) {
store.commit('updateLoading', true)
store.commit('updateShowBack', true)
next()
})
router.afterEach(
function
(to) {
store.commit('updateLoading', false)
})
FastClick.attach(document.body)
Vue.config.productionTip = true
Vue.prototype.domainName = domainName
Vue.prototype.serverName = serverName
Vue.prototype.apiPrefix = apiPrefix
Vue.prototype.http =
function
(opts) {
let vue = this
vue.
$vux
.loading.show({
text: 'Loading'
})
vue.
$http
({
method: opts.method,
url: apiPrefix + opts.url,
headers: opts.headers || {},
params: opts.params || {},
data: opts.data || {}
}).then(
function
(response) {
vue.
$vux
.loading.hide()
opts.success(response.data.data)
}).
catch
(
function
(error) {
vue.
$vux
.loading.hide()
if
(!opts.error) {
let response = error.response
let errorMessage = '请求失败'
if
(response && response.data) {
if
(response.data.code === loginTimeOutErrorCode) {
window.location.href = '/'
}
errorMessage = response.data.message
}
vue.
$vux
.alert.show({
title: '提示',
content: errorMessage
})
}
else
{
opts.error(error.response.data.data)
}
})
}
Vue.prototype.get =
function
(opts) {
opts.method = 'get'
this.http(opts)
}
Vue.prototype.post =
function
(opts) {
opts.method = 'post'
this.http(opts)
}
Vue.prototype.put =
function
(opts) {
opts.method = 'put'
this.http(opts)
}
Vue.prototype.
delete
=
function
(opts) {
opts.method = '
delete
'
this.http(opts)
}
Vue.prototype.valid =
function
(opts) {
let vue = this
let valid = true
if
(opts.ref && !opts.ref.valid) {
valid = false
}
if
(opts.ignoreRefs) {
let newRefs = []
for
(let i in opts.refs) {
let ref = opts.refs[i]
for
(let j in opts.ignoreRefs) {
let ignoreRef = opts.ignoreRefs[j]
if
(ref !== ignoreRef) {
newRefs.push(ref)
}
}
}
opts.refs = newRefs
}
for
(let i in opts.refs) {
if
(!opts.refs[i].valid) {
valid = false
break
}
}
if
(valid) {
opts.success()
}
else
if
(opts.error) {
opts.error()
}
else
{
vue.
$vux
.toast.show({
text: '请检查输入'
})
}
}
Vue.prototype.closeShowBack =
function
() {
this.
$store
.commit('updateShowBack', false)
}
Vue.prototype.updateTitle =
function
(value) {
this.
$store
.commit('updateTitle', value)
}
new
Vue({
store,
router,
render: h => h(App)
}).
$mount
('#app-box')
app.vue
<template>
<p id=
"app"
>
<loading v-model=
"isLoading"
></loading>
<transition>
<router-view></router-view>
</transition>
</p>
</template>
<script>
import {Loading} from 'vux'
import {mapState} from 'vuex'
export
default
{
name: 'app',
components: {
Loading
},
computed: {
...mapState({
isLoading: state => state.vux.isLoading
})
}
}
</script>
<style lang=
"less"
>
@import '~vux/src/styles/reset.less';
body {
background-color: #fbf9fe;
}
</style>
components/index.vue
<template>
<p style=
"height:100%;"
>
<top style=
"margin-bottom:46px"
></top>
<transition>
<router-view></router-view>
</transition>
<bottom></bottom>
</p>
</template>
<script>
import Top from './layouts/top.vue'
import Bottom from './layouts/bottom.vue'
export
default
{
components: {
Top,
Bottom
}
}
</script>
<style>
html, body {
height: 100%;
width: 100%;
overflow-x: hidden;
}
</style>
components/tests/page.vue
<template>
<p>
<page @loadMore=
"loadMore"
@refresh=
"refresh"
>
<p>
<p v-
for
=
"i in n"
>placeholder {{i}}</p>
</p>
</page>
</p>
</template>
<script>
import Page from '../kits/page.vue'
import {cookie} from 'vux'
export
default
{
components: {
Page
},
created () {
let vue = this
vue.closeShowBack()
vue.updateTitle('测试页面'),
console.log(0)
vue.get({
url: '/test/constants',
headers: {
'token': cookie.get('token')
},
success:
function
(data) {
cookie.set('constants',JSON.stringify(data),{
expires: 1
})
}
})
},
data () {
return
{
n: 10,
}
},
methods: {
loadMore () {
this.n += 10
},
refresh () {
this.n = 10
},
}
}
</script>