# 快速上手
# 安装
yarn add vue-mixin-store
or
npm i vue-mixin-store
# 引入
# 引入 store 模块
// store.js
import Vue from 'vue'
import Vuex from 'vuex'
import MixinStore from 'vue-mixin-store'
import * as api from '~/api'
Vue.use(Vuex)
export default new Vuex.Store({
modules: {
flow: MixinStore.FlowStore(api, { debug: false, max: 0 }) // <-- 这里的 key 必须叫 flow
}
})
# 引入数据加载组件
// components.js
import Vue from 'vue'
import MixinStore from 'vue-mixin-store'
Vue.component(MixinStore.FlowLoader.name, MixinStore.FlowLoader)
# API 层
TIP
在引入 store 的时候要传入 API 层,因为这一层总是 custom 的。API 层应该这样定义:
// api.js
export const getListByPage = ({ page, count }) => {
return new Promise((resolve, reject) => {
// 这层 promise 可以使用 axios 或 fetch 等
})
}
export const getListBySinceId = ({ since_id, is_up, count }) => {
return new Promise((resolve, reject) => {
// 这层 promise 可以使用 axios 或 fetch 等
})
}
export const getListByLastId = ({ last_id, count }) => {
return new Promise((resolve, reject) => {
// 这层 promise 可以使用 axios 或 fetch 等
})
}
export const getListBySeenIds = ({ seen_ids, count }) => {
return new Promise((resolve, reject) => {
// 这层 promise 可以使用 axios 或 fetch 等
})
}
# 简单用例
<FlowLoader
func="getListByPage"
type="page"
:query="{ count: 10 }"
>
<ul slot-scope="{ flow }">
<li v-for="(item, index) in flow" :key="item.id">
count:{{ index + 1 }},id:{{ item.id }}
</li>
</ul>
</FlowLoader>
- FlowLoader 组件即为 vue-mixin-store 提供的数据加载组件
- 参数
func
和type
是必填的,分别代表:请求的API函数名
和分页方式
query
是自定义参数,它会被透传到 API 层slot-scope="{ flow }"
即为获取到的数据列表,你可以在其内部通过v-for
渲染列表组件
TIP
也就是说,只要使用 vue-mixin-store,每当要新添加一个列表
你只需要:
- 在 API 层添加一个接口函数
- 调用 FlowLoader,代理接口请求
- 为每个列表的 item 写一个组件就可以了
你不需要:
- 重复的定义 store
- 维护 loading、error...这些状态
# 完全用例
<template>
<FlowLoader
func="requestFuncName"
type="page"
:query="{}"
:auto="-1"
:display-no-more="false"
:use-first-error="false"
:use-first-loading="false"
:retry-on-error="true"
:preload="50"
:callback="callbackFn"
:cache-timeout="0"
>
<template #header="{ source }">
<header> ... </header>
</template>
<template #default="{ flow, total, count, extra }">
<ul>
<ItemComponent v-for="item in flow" :item="item" />
</ul>
</template>
<template #footer="{ source }">
<footer> ... </footer>
</template>
<template #loading>
<LoadingComponent/>
</template>
<template #nothing>
<NothingComponent/>
</template>
<template #error="{ error }">
<ErrorComponent/>
</template>
<template #first-error="{ error }">
<FirstErrorComponent/>
</template>
<template #first-loading>
<FirstLoadingComponent/>
</template>
</FlowLoader>
</template>
<script>
export default {
asyncData({ store }) {
return store.dispatch('flow/initData', {
func: 'requestFuncName',
type: 'page',
query: {}
})
}
}
</script>