123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- <template>
- <div class="list-page">
- <el-tabs v-model="tabsValue" type="card" class="demo-tabs" @tab-change="changeTab" v-if="tabList && tabList.length > 0">
- <el-tab-pane v-for="item in tabList" :key="item.name" :label="item.title" :name="item.name"></el-tab-pane>
- </el-tabs>
- <div class="search-div">
- <Search :column="searchColumn" @submit="searchSubmit" @reset="resetForm" :searchBtns="searchBtns" :tabsValue="tabsValue"/>
- </div>
- <div class="table-div">
- <Table :isScope="isScope" :tableKey="tableKey" ref="tableRef" :column="tableColumn" :data="tableData.list" :loading="loading" :scopeBtns="scopeBtns" :isSelect="isSelect" />
- </div>
- <div class="pagination-div">
- <slot name="footerLeft"></slot>
- <pagination v-show="tableData.total > 0" :total="tableData.total" v-model:page="queryParams.pageNum"
- v-model:limit="queryParams.pageSize" @pagination="getList" />
- </div>
- </div>
- </template>
- <script setup>
- import { computed, onMounted, reactive, watch } from 'vue';
- import Search from './Search.vue';
- import Table from './Table.vue';
- import { ElMessage } from 'element-plus'
- import { ref } from 'vue';
- const props = defineProps({
- column: {
- type: Object,
- default: [],
- required: true
- },
- scopeBtns: {
- type: Array,
- default: [],
- },
- tableApi: {
- type: Function,
- default: () => { },
- required: true
- },
- searchBtns: {
- type: Array,
- default: [],
- },
- tableKey:{
- type: String,
- default: 'id',
- },
- tabList:{
- type: Array,
- default:[]
- },
- tabsearchKey:{
- type: String,
- default: ''
- },
- isSelect:{
- type: Boolean,
- default: true
- },
- defaultTab:{
- type: String,
- default: '2'
- },
- isScope:{
- type: Boolean,
- default: true
- },
- })
- const tabsValue = ref('2')
- const queryParams = reactive({
- pageNum: 1,
- pageSize: 10
- })
- const tableData = ref({
- total: 0,
- list: []
- })
- const loading = ref(false)
- const tableRef = ref(null)
- const searchColumn = computed(() => {
- return props.column.filter(item => item.isSearch);
- })
- const tableColumn = computed(() => {
- return props.column
- })
- //表单提交
- const searchSubmit = (parmas) => {
- getList(parmas)
- }
- //表单重置
- const resetForm = () => {
- Object.assign(queryParams, {
- pageNum: 1,
- pageSize: 10
- })
- //清除选中的row
- tableRef.value.resetIds();
- getList({})
- }
- const changeTab = (tab) => {
- console.log('tab', tab);
- resetForm();
- }
- watch(() =>tabsValue.value,()=>{
- sessionStorage.setItem('tabsValue',tabsValue.value)
- } )
- const getList = async (parmas) => {
- try {
- loading.value = true;
- const searchData = {...queryParams, ...parmas}
- if(props.tabsearchKey){
- searchData[props.tabsearchKey] = tabsValue.value;
- }
- console.log('查询条件',queryParams,parmas);
- const response = await props.tableApi(searchData);
- tableData.value = {
- total: response.total,
- list: response.rows
- }
- } catch (error) {
- console.error('error', error);
- } finally {
- loading.value = false;
- }
- }
- const ids = computed(() =>{
- const _d = tableRef.value.ids;
- if(_d && _d.length <= 0){
- ElMessage({
- message: '请选择需要操作的数据!',
- type: 'warning',
- })
- return []
- }
- return tableRef.value.ids
- })
- const handleExist = (value) => {
- const f = props.tabList.filter(item => item.name === value);
- return f && f.length > 0
- }
- onMounted(() => {
- const tabs = sessionStorage.getItem('tabsValue');
- if(tabs && handleExist(tabs)){
- tabsValue.value = tabs;
- }else{
- tabsValue.value = props.defaultTab;
- }
- getList();
- })
- defineExpose({
- ids,
- resetForm,
- tabsValue
- })
- </script>
- <style lang='scss' scoped>
- .list-page {
- padding: 20px;
- }
- </style>
|