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

el-table在彈窗中的使用示例詳解

 更新時間:2024年12月03日 09:22:38   作者:道香居  
本文總結(jié)了在Vue2項(xiàng)目中使用element-ui的el-table組件在彈窗中展示數(shù)據(jù),并實(shí)現(xiàn)基礎(chǔ)的勾選功能,內(nèi)容包括如何設(shè)置row-key、使用reserve-selection屬性、修改數(shù)據(jù)獲取函數(shù)以支持跨頁勾選以及如何在關(guān)閉彈窗時清理selection,感興趣的朋友跟隨小編一起看看吧

el-table在彈窗中的使用

概要

在實(shí)際的業(yè)務(wù)場景中,需要在彈窗內(nèi)增加表格的展示,勾選.本文以我實(shí)際的開發(fā)過程中,碰到的"坑",來總結(jié)一下el-table 如何設(shè)置

使用Vue2版本來開發(fā) element-ui

如何展示基本的圖表數(shù)據(jù),并支持基礎(chǔ)的勾選

數(shù)據(jù)的展示包含多個頁面
參考官方的代碼

<template>
  <div class="main">
  <!-- 授權(quán)設(shè)備 -->
  <el-dialog title="選擇設(shè)備" :visible.sync="deviceOpen" width="500px">
  <el-table
    ref="multipleTable"
    :data="iotDeviceList"
    tooltip-effect="dark"
    style="width: 100%"
    @selection-change="handleSelectionChange">
    <el-table-column
      type="selection"
      width="55">
    </el-table-column>
    <el-table-column
      label="日期"
      width="120">
      <template slot-scope="scope">{{ scope.row.date }}</template>
    </el-table-column>
    <el-table-column
      prop="name"
      label="姓名"
      width="120">
    </el-table-column>
    <el-table-column
      prop="address"
      label="地址"
      show-overflow-tooltip>
    </el-table-column>
  </el-table>
  <pagination
      v-show="devicesTotal>0"
      :total="devicesTotal"
      :page.sync="deviceQueryParams.pageIndex"
      :limit.sync="deviceQueryParams.pageSize"
      @pagination="getDevicesList"
  />
  <div slot="footer" class="dialog-footer">
      <el-button type="primary" @click="submitDevicesForm">確 定</el-button>
      <el-button @click="cancelDevicesSet">取 消</el-button>
  </div>
  </el-dialog>
  </div>
</template>
<script>
  export default {
    data() {
      return {
        // 設(shè)備設(shè)置界面打開
        deviceOpen: false,
        devicesTotal: 0,
        deviceQueryParams: {
          pageIndex: 1,
          pageSize: 10
          deviceType: undefined
        },
        iotDeviceList: [{
          date: '2016-05-03',
          name: '王小虎',
          address: '上海市普陀區(qū)金沙江路 1518 弄'
        }, {
          date: '2016-05-08',
          name: '王小虎',
          address: '上海市普陀區(qū)金沙江路 1518 弄'
        }],
        multipleSelection: []
      }
    },
    methods: {
      // 提交設(shè)備設(shè)置
      submitDevicesForm(){
        var form = {...}
        updateIoDevice(form).then(response => {
          if(response.code === 200){
            // 上方會顯示成功的消息通知
            this.msgSuccess(response.msg)
            this.deviceOpen = false
            this.deviceLoading = false
            // 此處相當(dāng)于彈窗取消之后,重新刷新頁面數(shù)據(jù)
            this.getList()
          }else {
            this.msgError(response.msg)
          }
        })
      },
      // 取消設(shè)備設(shè)置
      cancelDevicesSet(){
        this.deviceLoading = false
        this.deviceOpen = false
      },
      // 勾選改變時觸發(fā)的事件
      handleSelectionChange(selection) {
        // 每次觸發(fā)打印selection信息,總是發(fā)現(xiàn)出現(xiàn)數(shù)組中包含多個toggle數(shù)據(jù),所以便再此設(shè)置了過濾,如果有同學(xué)知道為什么,可以評論區(qū)留言
        this.multipleSelection = selection.filter((item) => Array.isArray(item) === false).map(obj => obj.id);
        this.single = selection.length !== 1
        this.multiple = !selection.length
      },
      // 分頁查詢請求
      getDevicesList(){
        this.deviceLoading = true
        listIotDevice(this.deviceQueryParams).then(response => {
            this.iotDeviceList = response.data.lise
            this.deviceTotal = response.data.count
        })
      }
    }
  }
</script>

以上代碼只實(shí)現(xiàn)了基本的單頁面勾選功能,未實(shí)現(xiàn)真正意義上的多頁面勾選,頁面切換。想要實(shí)現(xiàn),請看一下介紹

如何支持跨頁依然能保留記錄的功能

  • el-table 添加row-key
  • <el-table v-loading="deviceLoading" ref="multipleTable" :row-key="getRowKeys"
  • el-table-column 添加reserve-selection
  • <el-table-column type="selection" :reserve-selection="true" width="55" align="center"/>
  • 修改getDevicesList函數(shù),保證在切換Page的時候,自動勾選之前的選項(xiàng)
...
this.iotDeviceList = response.data.list
this.devicesTotal = response.data.count
// 執(zhí)行回顯操作
this.$nextTick(() => {
    let selectItem = []
    this.iotDeviceList.forEach(item =>{
        if (this.devicesIds){
            this.devicesIds.forEach(id => {
                if (item.id === id){
                    selectItem.push(item)
                }
            })
        }
    })
    // 觸發(fā)勾選項(xiàng)
    this.$refs.multipleTable.toggleRowSelection(selectItem)
})

增加getRowKeys,保證每一個行的數(shù)據(jù)是唯一

methods: {
   getRowKeys(row){
       return row.id
   }
}

注意,在關(guān)閉dialog之后,點(diǎn)擊確定,點(diǎn)擊取消的時候,需要清理一下selection
如果不清理,目前觀察toggle數(shù)據(jù)會不斷增長
this.$refs.multipleTable.clearSelection()

如何實(shí)現(xiàn)從后端記錄的勾選在前端顯示

基本思路是這樣: 從后端獲取之前勾選的device ID之后, 在每次頁面獲取數(shù)據(jù)后,觸發(fā)勾選,但是如果勾選成功后,記錄要刪除,否則用戶點(diǎn)擊取消以前的數(shù)據(jù),則是無效的

this.$nextTick(() => {
  ....
})
// 承接上面的代碼,下面是實(shí)際讀取后端數(shù)據(jù)觸發(fā)toggle的操作
this.$nextTick(() => {
      // let selectItem = []
      let remove_ids = []
      this.iotDeviceList.forEach(item =>{
          // 記錄從數(shù)據(jù)庫獲取的數(shù)據(jù), beforeDevicesIds是之前勾選的設(shè)備id列表
          if (this.beforeDevicesIds){
              this.beforeDevicesIds.forEach(id => {
              if (item.id === id){
                      remove_ids.push(id)
                      this.$refs.multipleTable.toggleRowSelection(item)
                  }
              })
          }
      })
      if (remove_ids.length === 0){
      }else{
          // 過濾已經(jīng)處理devices ID
          this.beforeDevicesIds = this.beforeDevicesIds.filter(id =>!remove_ids.includes(id))
      }
  }) // 因?yàn)轫撁驿秩镜漠惒?,所以加一個延遲刷新數(shù)據(jù)
  this.deviceLoading = false

知識點(diǎn)

Vue有個異步更新策略,就是如果數(shù)據(jù)變化,vue不會立刻更新DOM,而是開啟一個隊(duì)列,把組件更新函數(shù)保存到隊(duì)列中,在同一事件循環(huán)中發(fā)生的所有數(shù)據(jù)變更會異步的批量更新。如果想獲取更新后的DOM狀態(tài),需要使用nextTick

使用場景:

  • 等待DOM更新完成
  • 避免布局抖動,比如多次數(shù)據(jù)更新
  • 獲取更新后的DOM

到此這篇關(guān)于el-table在彈窗中的使用的文章就介紹到這了,更多相關(guān)el-table彈窗使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Vant框架list組件遇到的坑及解決

    使用Vant框架list組件遇到的坑及解決

    這篇文章主要介紹了使用Vant框架list組件遇到的坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • Vue中虛擬列表的原理與實(shí)現(xiàn)詳解

    Vue中虛擬列表的原理與實(shí)現(xiàn)詳解

    虛擬列表是一種技術(shù),它只渲染用戶當(dāng)前可見的列表項(xiàng),而不是渲染整個列表,這篇文章主要來和大家聊聊虛擬列表的原理與實(shí)現(xiàn),希望對大家有所幫助
    2023-05-05
  • vue中的render函數(shù)、h()函數(shù)、函數(shù)式組件詳解

    vue中的render函數(shù)、h()函數(shù)、函數(shù)式組件詳解

    在vue中我們使用模板HTML語法來組建頁面的,使用render函數(shù)我們可以用js語言來構(gòu)建DOM,這篇文章主要介紹了vue中的render函數(shù)、h()函數(shù)、函數(shù)式組件,需要的朋友可以參考下
    2023-02-02
  • vue封裝組件之上傳圖片組件

    vue封裝組件之上傳圖片組件

    這篇文章主要為大家詳細(xì)介紹了vue封裝組件之上傳圖片組件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • VueJs監(jiān)聽window.resize方法示例

    VueJs監(jiān)聽window.resize方法示例

    本篇文章主要介紹了VueJs監(jiān)聽window.resize方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • 深入理解vue Render函數(shù)

    深入理解vue Render函數(shù)

    本篇文章主要介紹了深入理解vue Render函數(shù),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • vue-video-player?播放m3u8視頻流的實(shí)現(xiàn)

    vue-video-player?播放m3u8視頻流的實(shí)現(xiàn)

    本文主要介紹了vue-video-player?播放m3u8視頻流的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • 使用vant?自定義彈框全過程

    使用vant?自定義彈框全過程

    這篇文章主要介紹了使用vant?自定義彈框全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 解決vue v-for src 圖片路徑問題 404

    解決vue v-for src 圖片路徑問題 404

    今天小編就為大家分享一篇解決vue v-for src 圖片路徑問題 404,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • 詳解vuex 漸進(jìn)式教程實(shí)例代碼

    詳解vuex 漸進(jìn)式教程實(shí)例代碼

    Vuex 是一個專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式。通過本文給大家分享vuex 漸進(jìn)式教程實(shí)例代碼,從入門級帶你慢慢深入使用vuex,感興趣的朋友一起看看吧
    2018-11-11

最新評論

炉霍县| 吉安市| 福州市| 海伦市| 六枝特区| 富源县| 桑植县| 安庆市| 东城区| 阳城县| 革吉县| 侯马市| 柘城县| 柯坪县| 湘西| 响水县| 图木舒克市| 安徽省| 菏泽市| 舟山市| 修水县| 江源县| 师宗县| 巴塘县| 黎平县| 朝阳县| 邯郸市| 吕梁市| 同仁县| 西昌市| 陇西县| 南丹县| 鲁甸县| 萨迦县| 衡阳县| 孙吴县| 都昌县| 神池县| 永德县| 泰顺县| 澄江县|