Vue3
从Hcms 0.8 开始,管理后台的页面采用vue3的UI框架 Element Plus,所以每个页面的初始化vue对象需要改成vue3 的出初始化方式。
vue 初始化
因为在layout 中封装了 vue 初始化,所以在每个页面中,仅需要定义好 App这个变量就可以。
$(function () {
let app = Vue.createApp(App)
app.use(ElementPlus, {
locale: ElementPlusLocaleZhCn,
})
app.mixin(window.__vueCommon)
app.mixin(window.__vueList)
//加载页面中引入的组件
component_list.forEach(item => {
app.component(item.key, item.c)
})
app.mount('.page-container', {})
})
App 定义
new Vue({
el:".page-container"
})
const App = {
data(){
return {}
}
}
组件 component_list
会在组件渲染定义的时候push加入到component_list
中,然后在vue初始化的时候 通过app.component
进行定义。只要页面通过 include 引用组件,就可以使用该组件。
<!-- 模板定义 -->
<script type="text/x-template" id="select-doc">
<div>hello components</div>
</script>
<script>
$(function() {
component_list.push({
key: 'select-doc',
c: {
template: `#select-doc`,
data() {
return {}
},
computed: {},
methods: {}
}
})
})
</script>
公共封装方法
打开新标签窗口
在某些使用场景下,业务需要的页面跳转需要打开新的标签窗口显示。需要调用公共的封装发放 openNewFrame
this.openNewFrame('新窗口Demo', "{:url('demo/demo/edit')}")
获取URL参数
this.getUrlQuery() //获取全部的参数
this.getUrlQuery('goods_id',0) //获取参数goods_id值,默认是0
解析URL
this.parserUrl(url)
// {{protocol: string, hostname: string, search: ({}|{}), host: string, hash: string, pathname: string}}
接口请求
请求方法 httpGet
、httpPost
调用方式都一致,分别对应get、post请求方法。
- loading 是否显示加载框,默认是显示
- loadingTarget 默认加载指定元素是
.loading
,对于一些弹窗数据,可以直接在弹窗类加载。httpGet
httpGet: function (url, data, loading = true, loadingTarget = '.loading')
�httpPost
httpPost: function (url, data, loading = true, loadingTarget = '.loading')
列表页面
因为layout初始化vue的时候已经默认引入vue-list
mixin 了,所以通过定义GetList
和 is_init_list
�=true 页面加载初始化会加载const App = { data() { return { is_init_list: true, //表示该页面是列表页面 where: {}, } }, methods: { GetList() { this.handRes({ current_page: 1, last_page: 2, total: 25, data: [{ date: '2016-05-02', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄' }, { date: '2016-05-04', name: '王小虎', address: '上海市普陀区金沙江路 1517 弄' }, { date: '2016-05-01', name: '王小虎', address: '上海市普陀区金沙江路 1519 弄' }, { date: '2016-05-03', name: '王小虎', address: '上海市普陀区金沙江路 1516 弄' }] }) // this.httpGet('{:url("admin/access/index/lists")}', { // page: this.current_page, // ...this.where // }).then(res => { // let {lists = {}} = res.data // this.handRes(lists) // }) } } }
分页
```javascript window.__vueList = { data() {<div class="pagination-container"> <el-pagination background layout="prev, pager, next" :total="total_num" :current-page="current_page" :page-size="per_page" @current-change="currentChangeEvent" > </el-pagination> </div>
}, mounted() {return { total_num: 0, data_list: [], per_page: 20, last_page: 0, current_page: 1, is_init_list: false }
}, methods: {if (this.is_init_list) { this.GetList() }
} };//重置数组,一般搜索、更换状态等筛选会调用 refreshList() { this.current_page = 1 this.GetList() }, //切换页码 currentChangeEvent(e) { this.current_page = e this.GetList() }, //处理分页数据 handRes({data, current_page = 1, last_page = 0, per_page = 20, total = 0}) { this.data_list = data this.per_page = per_page; this.last_page = last_page this.current_page = current_page this.total_num = total },
```