最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue3分頁組件與中文化詳解

 更新時間:2025年09月13日 09:42:12   作者:leijmdas  
這篇文章主要介紹了vue3分頁組件與中文化的使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

vue3分頁組件與中文化

這段代碼實現(xiàn)了一個基于Vue 3和Element Plus的分頁組件。

組件支持雙向綁定的當前頁碼(currentPage)和每頁條數(shù)(pageSize)屬性,包含總條數(shù)(total)顯示和可選每頁條數(shù)設置,支持頁碼切換和每頁條數(shù)變化時觸發(fā)change事件。

通過el-config-provider配置中文語言環(huán)境,組件樣式采用flex布局右對齊。

父組件通過v-model綁定分頁參數(shù),并在change事件中調(diào)用數(shù)據(jù)獲取方法。

import zhCn from "element-plus/es/locale/lang/zh-cn"
import {ref} from 'vue'
const locale = ref(zhCn)
<template>
  <div class="table-footer">
<el-config-provider :locale="locale">

    <el-pagination
      v-model:current-page="currentPage"
      v-model:page-size="pageSize"
      :total="total"
      :page-sizes="pageSizes"
      layout="total, sizes, prev, pager, next, jumper"
      @size-change="handleChange"
      @current-change="handleChange"
    />
</el-config-provider>

  </div>
</template>

<script>
export default {
  name: 'Pagination',
  props: {
    /* 當前頁,支持 v-model:page */
    currentPage: { type: Number, default: 1 },
    /* 每頁條數(shù),支持 v-model:limit */
    pageSize: { type: Number, default: 10 },
    /* 總條數(shù) */
    total: { type: Number, default: 0 },
    /* 可選每頁條數(shù) */
    pageSizes: {
      type: Array,
      default: () => [10, 20, 30, 40]
    }
  },
  emits: ['update:currentPage', 'update:pageSize', 'change'],
  computed: {
    currentPage: {
      get()  { return this.currentPage },
      set(v) { this.$emit('update:currentPage', v) }
    },
    pageSize: {
      get()  { return this.pageSize },
      set(v) { this.$emit('update:pageSize', v) }
    }
  },
  methods: {
    handleChange() {
      /* 對外暴露一個 change 事件,參數(shù):{ page, limit } */
      this.$emit('change', { currentPage: this.currentPage, pageSize: this.pageSize })
    }
  }
}
</script>

<style scoped>
.table-footer {
  margin-top: 20px;
  display: flex;
  justify-content: flex-end;
}


</style>
<script setup>

import Pagination from '@/components/Pagination.vue'

const currentPage = ref(1)
const pageSize = ref(10)
const total = ref(0)

// 統(tǒng)一獲取數(shù)據(jù)
function getData() {
  // 這里調(diào)用接口 list
  console.log('拉取第', currentPage.value, '頁', pageSize.value, '條')
}
</script>

<template>
<div>
   <Pagination
      v-model:currentPage="currentPage"
      v-model:pageSize="pageSize"
      :total="total"
      @change="getData"
    />
  </div>
</template>

這個代碼是一個 Vue 3 的組合式函數(shù) (Composable Function),它封裝了一些常用的全局方法和狀態(tài)管理邏輯。

我來分析并優(yōu)化這段代碼:

代碼分析

功能

  • 獲取全局屬性 ($message, $messageBox, $dict, $api)
  • 提供全局狀態(tài)管理 (Pinia store)
  • 封裝了常用方法 (確認對話框、日志等)
  • 提供了分頁和表格相關(guān)的響應式狀態(tài)

優(yōu)點

  • 使用組合式API封裝可復用邏輯
  • 集中管理常用工具方法
  • 提供了表格和分頁的通用狀態(tài)

可改進點

  • 類型安全(TypeScript)
  • 錯誤處理
  • 代碼組織
  • 響應式狀態(tài)初始化

優(yōu)化建議 (TypeScript 版本)

import { reactive, ref, getCurrentInstance, ComponentInternalInstance } from 'vue'
import { useGlobalStore } from "../store"
import type { MessageBox, Message, DictType, ApiType } from '../types' // 假設有這些類型定義

interface PageParams {
  currentPage: number
  pageSize: number
  total: number
}

interface TableData<T = any> {
  list: T[]
}

interface UserInfo {
  // 定義用戶信息結(jié)構(gòu)
  [key: string]: any
}

export default function useGlobalUtils() {
  const instance = getCurrentInstance()!
  const globalProp = instance.appContext.config.globalProperties
  const globalStore = useGlobalStore()
  
  // 類型化全局工具
  const getMessage = (): Message => globalProp.$message
  const getMessageBox = (): MessageBox => globalProp.$messageBox
  const getDict = (): DictType => globalProp.$dict
  const getApi = (): ApiType => globalProp.$api
  
  // 用戶信息(帶錯誤處理)
  const getUserInfo = (): UserInfo => {
    try {
      return JSON.parse(localStorage.userInfo || '{}')
    } catch (e) {
      console.error('解析用戶信息失敗:', e)
      return {}
    }
  }

  // 確認對話框
  const confirm = async (prompt = "確認提交此次編輯嗎?"): Promise<boolean> => {
    try {
      const isConfirm = await getMessageBox().confirm(prompt, "提示", {
        confirmButtonText: "確認",
        cancelButtonText: "取消",
        type: "warning",
      })
      if (isConfirm) {
        console.log("操作已確認")
      }
      return isConfirm
    } catch (error) {
      console.error('確認對話框錯誤:', error)
      return false
    }
  }

  // 分頁狀態(tài)
  const page = reactive<PageParams>({
    currentPage: 1,
    pageSize: 10,
    total: 0
  })

  // 表格狀態(tài)
  const tableState = reactive({
    data: {
      list: []
    } as TableData,
    loading: false,
    itemData: {} as any,
    dialogLoading: false
  })

  // 日志方法
  const log = (...args: any[]) => {
    if (process.env.NODE_ENV !== 'production') {
      console.log(...args)
    }
  }

  return {
    globalStore,
    getApi,
    getMessage,
    getMessageBox,
    getDict,
    confirm,
    log,
    userInfo: getUserInfo(),
    page,
    ...tableState,
    // 或者分開暴露
    // tableData: tableState.data,
    // tableLoading: tableState.loading,
    // itemData: tableState.itemData,
    // dialogLoading: tableState.dialogLoading
  }
}

主要改進點

類型安全

  • 添加了TypeScript類型定義
  • 為全局工具方法添加了返回類型

錯誤處理

  • 添加了JSON解析的錯誤處理
  • 確認對話框添加了try-catch

代碼組織

  • 將表格相關(guān)狀態(tài)合并到一個reactive對象中
  • 使用更清晰的命名

其他改進

  • 生產(chǎn)環(huán)境日志控制
  • 更合理的函數(shù)命名
  • 更好的代碼注釋

使用建議

在組件中使用:

<script setup lang="ts">
const {
  page,
  tableData,
  confirm,
  getApi
} = useGlobalUtils()

// 使用示例
const handleDelete = async () => {
  if (await confirm('確定刪除此項嗎?')) {
    // 執(zhí)行刪除操作
  }
}
</script>

建議將這些工具函數(shù)按功能拆分到不同的文件中,例如:

  • useGlobalTools.ts (全局工具)
  • useTableState.ts (表格狀態(tài))
  • usePagination.ts (分頁邏輯)

考慮將用戶信息也使用Pinia管理,而不是直接從localStorage讀取

這樣的優(yōu)化將使代碼更健壯、更易維護,并且在使用TypeScript時能獲得更好的類型提示和錯誤檢查。

JavaScript 版本的重寫

以下是使用純 JavaScript 重寫的代碼,保持了原有功能并進行了優(yōu)化:

import { reactive, ref, getCurrentInstance } from 'vue'
import { useGlobalStore } from "../store"

export default function useGlobalUtils() {
  const instance = getCurrentInstance()
  const globalProp = instance.appContext.config.globalProperties
  const globalStore = useGlobalStore()
  
  // 獲取全局工具方法
  const getMessage = () => globalProp.$message
  const getMessageBox = () => globalProp.$messageBox
  const getDict = () => globalProp.$dict
  const getApi = () => globalProp.$api
  
  // 安全獲取用戶信息
  const getUserInfo = () => {
    try {
      return JSON.parse(localStorage.userInfo || '{}')
    } catch (e) {
      console.error('解析用戶信息失敗:', e)
      return {}
    }
  }

  // 確認對話框封裝
  const confirm = async (prompt = "確認提交此次編輯嗎?") => {
    try {
      const isConfirm = await getMessageBox().confirm(prompt, "提示", {
        confirmButtonText: "確認",
        cancelButtonText: "取消",
        type: "warning",
      })
      if (isConfirm) {
        console.log("操作已確認")
      }
      return isConfirm
    } catch (error) {
      console.error('確認對話框錯誤:', error)
      return false
    }
  }

  // 分頁狀態(tài)
  const page = reactive({
    currentPage: 1,
    pageSize: 10,
    total: 0
  })

  // 表格相關(guān)狀態(tài)
  const tableState = reactive({
    data: { list: [] },
    loading: false,
    itemData: {},
    dialogLoading: false
  })

  // 開發(fā)環(huán)境日志
  const log = (...args) => {
    if (process.env.NODE_ENV !== 'production') {
      console.log(...args)
    }
  }

  return {
    // 全局工具
    globalStore,
    getApi,
    getMessage,
    getMessageBox,
    getDict,
    
    // 方法
    confirm,
    log,
    
    // 狀態(tài)
    userInfo: getUserInfo(),
    page,
    
    // 表格狀態(tài) (可展開或直接暴露)
    tableData: tableState.data,
    tableLoading: tableState.loading,
    itemData: tableState.itemData,
    dialogLoading: tableState.dialogLoading,
    
    // 也可以這樣暴露
    // ...tableState
  }
}

使用示例

// 在組件中使用
import useGlobalUtils from './useGlobalUtils'

export default {
  setup() {
    const {
      page,
      tableData,
      confirm,
      getApi,
      log
    } = useGlobalUtils()

    // 獲取數(shù)據(jù)示例
    const fetchData = async () => {
      try {
        tableData.loading = true
        const response = await getApi().get('/data', {
          params: {
            page: page.currentPage,
            size: page.pageSize
          }
        })
        tableData.list = response.data.list
        page.total = response.data.total
      } catch (error) {
        log('獲取數(shù)據(jù)失敗:', error)
        getMessage().error('獲取數(shù)據(jù)失敗')
      } finally {
        tableData.loading = false
      }
    }

    // 刪除確認示例
    const handleDelete = async (id) => {
      if (await confirm('確定刪除此項嗎?')) {
        try {
          await getApi().delete(`/data/${id}`)
          getMessage().success('刪除成功')
          fetchData() // 刷新數(shù)據(jù)
        } catch (error) {
          log('刪除失敗:', error)
          getMessage().error('刪除失敗')
        }
      }
    }

    return {
      page,
      tableData,
      handleDelete,
      fetchData
    }
  }
}

主要特點

  1. 純 JavaScript 實現(xiàn):完全使用 ES6+ 語法
  2. 錯誤處理增強:添加了關(guān)鍵操作的錯誤捕獲

狀態(tài)管理優(yōu)化

  • 使用 reactiveref 管理響應式狀態(tài)
  • 將相關(guān)狀態(tài)組合在一起

開發(fā)友好

  • 生產(chǎn)環(huán)境自動禁用日志
  • 清晰的函數(shù)命名

靈活性

  • 可以展開或單獨暴露表格狀態(tài)
  • 易于在不同組件中復用

這個版本保留了所有原始功能,同時提高了代碼的健壯性和可維護性。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 如何設置Vue全局公共方法

    如何設置Vue全局公共方法

    這篇文章主要介紹了如何設置Vue全局公共方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 詳解vue-cli 接口代理配置

    詳解vue-cli 接口代理配置

    本篇主要介紹了vue-cli 接口代理配置,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • 聊聊vue集成sweetalert2提示組件的問題

    聊聊vue集成sweetalert2提示組件的問題

    這篇文章主要介紹了vue 集成 sweetalert2 提示組件的問題,本文通過項目案例實例代碼相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-11-11
  • JS 函數(shù)的 call、apply 及 bind 超詳細方法

    JS 函數(shù)的 call、apply 及 bind 超詳細方法

    這篇文章主要描述JS 函數(shù)的 call、apply 及 bind 方法的超詳細解說,感興趣的朋友可以參考下文,希望能幫助到您
    2021-08-08
  • Vue3對比Vue2的優(yōu)點總結(jié)

    Vue3對比Vue2的優(yōu)點總結(jié)

    vue3解決了vue2的一些缺陷與弊端,學習新的技術(shù)是很有必要的,本文總結(jié)了一些vue3的優(yōu)點,希望各位能盡快轉(zhuǎn)入vue3的使用中
    2021-06-06
  • 淺談vue中改elementUI默認樣式引發(fā)的static與assets的區(qū)別

    淺談vue中改elementUI默認樣式引發(fā)的static與assets的區(qū)別

    下面小編就為大家分享一篇淺談vue中改elementUI默認樣式引發(fā)的static 與assets的區(qū)別,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • Vue.js自定義指令的用法與實例解析

    Vue.js自定義指令的用法與實例解析

    自定義指令是用來操作DOM的。自定義指令就是一種有效的補充和擴展,不僅可用于定義任何的DOM操作,并且是可復用的。這篇文章主要介紹了Vue.js自定義指令的用法與實例解析,一起看看吧
    2017-01-01
  • vue中設置滾動條方式

    vue中設置滾動條方式

    這篇文章主要介紹了在vue中設置滾動條的方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • vue點擊按鈕實現(xiàn)讓頁面的某一個元素全屏展示

    vue點擊按鈕實現(xiàn)讓頁面的某一個元素全屏展示

    這篇文章主要介紹了vue點擊按鈕實現(xiàn)讓頁面的某一個元素全屏展示,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • vue.js路由跳轉(zhuǎn)詳解

    vue.js路由跳轉(zhuǎn)詳解

    這篇文章主要為大家詳細介紹了vue.js路由跳轉(zhuǎn)的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08

最新評論

南部县| 衡水市| 江油市| 汤阴县| 绥芬河市| 习水县| 吴桥县| 图片| 沙洋县| 承德市| 福鼎市| 鸡西市| 门源| 富裕县| 葵青区| 西吉县| 航空| 读书| 县级市| 永宁县| 临潭县| 台东县| 读书| 齐河县| 六安市| 呼伦贝尔市| 蒲江县| 绩溪县| 溆浦县| 孙吴县| 南岸区| 吉木乃县| 延津县| 平湖市| 隆回县| 库尔勒市| 庆云县| 沅陵县| 启东市| 青铜峡市| 聂荣县|