1. 程式人生 > >vue元件系列4、Table封裝下

vue元件系列4、Table封裝下

開發十年,就只剩下這套架構體系了! >>>   

知道了slot 怎麼用,才可以理解table這樣封裝的原因

table外掛部分

<template>
  <div>
    <!-- 關鍵字部分 -->
    <div class="pre_search" v-show="show_key">
      <label>關鍵字:</label>
      <input type="text" placeholder="請輸入關鍵字" v-model="key_word" />
    </div>
    <!-- table部分 -->
    <div class="pre_tab">
      <table class="pre_dataintable">
        <thead>
          <slot name="tab_title"></slot>
        </thead>
        <tbody>
          <slot
            name="tab_tr"
            v-for="data_tr in data_tab"
            :item="data_tr"
          ></slot>
        </tbody>
        <tbody>
          <slot v-if="show_add" name="tab_add"></slot>
          <slot v-if="show_upd" name="tab_upd"></slot>
        </tbody>
      </table>
    </div>
    <!-- 分頁部分 -->
    <div class="pre_page" v-show="show_page">
      <ul style="text-align: right; margin-right: 20px;">
        <li>
          當前頁:<label>{{ nowpage }}</label
          >&nbsp; 合計頁:<label>{{ maxpage }}</label
          >&nbsp;&nbsp; <a href="#" @click="firstpage">首頁</a>|
          <a href="#" @click="beforepage">上一頁</a>|
          <a href="#" @click="nextpage">下一頁</a>|
          <a href="#" @click="lastpage">尾頁</a>
          <input type="text" v-model="jumppage" value="" /><a
            href="#"
            @click="gopage"
            class="go"
            >Go</a
          >
        </li>
      </ul>
    </div>
    <!-- 元件引入部分 彈窗元件和等待元件 -->
    <div>
      <per-message ref="msg_back" :message_data="msg_obj" />
      <pre-loading :pre_show_loading="fullloading" />
    </div>
  </div>
</template>
<script >
/*
名稱:Table元件
日期:2019-03-21
作者:hj
目標:1、傳入一組資料,自動構建標題和內容=>兩個陣列  1個數組是標題  1個數組是內容  方便構造 
     2、所有的增、刪、改、查、均在元件內容完成。
     3、還可以分頁

分析:1、增、刪、改、查 呼叫api主動配置。=>容易
     2、標題主動配置。=>容易
     3、每一列的校驗方式 =>配置  
     4、資料繫結?通過 solo 佔位符實現

*/

export default {  
  name: "pre_select_one",
  components: {    
    'per-message':()=>import("./pre_message.vue"),
    'pre-loading':()=>import("./pre_loading.vue")
  },  
  data() {
    return {
      data_tab: [],
      show_key:true,
      key_word:'',
      show_page:true,
      maxpage:'',
      nowpage:'',
      jumppage:'',
      msg_obj:{},
      fullloading:false,
      show_add:false,
      show_upd:false
    };
  },
  props: {
    api_url:String,
    pre_post:String,
    pre_post_add:{ type:String,default:'' },
    pre_post_del:{ type:String,default:'' },
    pre_post_upd:{ type:String,default:'' },
  },
  created:function(){
      this.nowpage=1;
  },
  watch:{
    pre_post(val){
      this.loaddata();
    },
    pre_post_add(val){
      if(String(val)!='')
        this.data_add();
    },
    pre_post_del(val){
      if(String(val)!='')
        this.data_del();
    },
    pre_post_upd(val){
      if(String(val)!='')
        this.data_upd();
    }
  },
  mounted() {
    this.initTable();
    this.loaddata();
  },
  methods: {
    initTable:function(){
      if(Number(this.maxpage)==0){
        this.show_page=false;
      }else{
        this.show_page=true;
      }
    },
    firstpage:function(){
        if(Number(this.nowpage)>1){
            this.nowpage=1;
            this.refresh_data();
        }else{
            this.msg_obj={'showtype':'warning','note':'已經是第一頁'};
        }
    },
    beforepage:function(){
        if(Number(this.nowpage)>1){
            this.nowpage--;
            this.refresh_data();
        }else{
            this.msg_obj={'showtype':'warning','note':'已經是第一頁'};
        }
    },
    nextpage:function(){
        if(Number(this.nowpage)<Number(this.maxpage)){
            this.nowpage++;
            this.refresh_data();
        }else{            
            this.msg_obj={'showtype':'warning','note':'已經是最後一頁'};
        }
    },
    lastpage:function(){
        if(Number(this.nowpage)<Number(this.maxpage)){
            this.nowpage=this.maxpage;
            this.refresh_data();
        }else{
            this.msg_obj={'showtype':'warning','note':'已經是最後一頁'};
        }
    },
    gopage:function(){
        console.log('跳轉到='+this.jumppage);
        if(Number(this.jumppage)>0 && Number(this.jumppage)<=Number(this.maxpage)){
            this.nowpage=this.jumppage;
            this.refresh_data();
        }else{
            this.msg_obj={'showtype':'warning','note':'跳轉頁數不在規定範圍內,請檢查'+this.jumppage};
        }
    },
    loaddata:function() {
      // console.log(this.api_url);
      // console.log(this.pre_post);      
      this.fullloading=true;
      this.$post(
        this.api_url,
        this.pre_post,
      ).then(res => {
        this.fullloading=false;
        this.show_add=false;
        this.show_upd=false;

        try {         
          res=JSON.parse(res); 
          // console.log(res.data);         
          if (res.data.status == 1) {
            this.maxpage=res.data.allpage;
            this.data_tab=res.data.data;
          } else {
            this.msg_obj={'showtype':'warning','note':res.msg};
          }
          this.initTable();
        } catch (ex) {
          this.msg_obj={'showtype':'warning','note':"查詢失敗"+ex};
        }
      });
    },
    data_add:function(){
      // 只是 Postjson 和 提示結果不一樣 其他一樣。沒有必要重新定義方法,所以只控制展示
      this.show_add=true;
      this.show_upd=false;
    },
    data_upd:function(){
      this.show_add=false;
      this.show_upd=true;
    },
    refresh_data() {
      console.log('重新整理');
      this.$emit("tab-event", this.nowpage,this.key_word);
    }
  }
};
</script>
 
<style scoped >
/* pre_search */
.pre_search {
  text-align: left;
}
.pre_search > label {
  position: relative;
  left: 2%;
}
.pre_search > input {
  position: relative;
  left: 2%;
}
.pre_search > input :focus {
  border: 1px solid #024aee;
  background-color: #aaa;
}

/* table 整體樣式 */
.pre_dataintable {
  margin-top: 15px;
  border-collapse: collapse;
  border: 1px solid #aaa;
  width: 95%;
  /* padding 沒有作用 */
  /* padding: 0px 5px 10px 5px; */
  position: relative;
  left: 2%;
}
.pre_dataintable th {
  vertical-align: baseline;
  padding: 5px 15px 5px 6px;
  background-color: #c1ffc1;
  border: 1px solid #3f3f3f;
  text-align: center;
  color: #000000;
  font-size: 16px;
  font-weight: bolder;
}
.pre_dataintable td {
  /* vertical-align: text-top; */
  padding: 5px 8px 5px 8px;
  border: 1px solid #aaa;
  text-align: left;
}
/* 表格內按鈕 */
.pre_dataintable td button {
  width: 80px;
  padding: 6px 6px 6px 6px;
  border: 1px solid #aaa;
  text-align: center;
  display: inline-block;
}
/* 表格內輸入框 */
.pre_dataintable td input {
  width: 100%;
  height: 100%;
  border: 0px;
  text-align: left;
  padding: 2px 2px 2px 2px;
  /* font-size: 16px; */
}

.pre_dataintable tr {
  cursor: pointer;
}
.pre_dataintable tr:nth-child(odd) {
  background-color: #f5f5f5;
}
.pre_dataintable tr:nth-child(even) {
  background-color: #fff;
}
.pre_dataintable tr:hover {
  background-color: #e2fde2;
}

.tab_add {
  width: 95%;
  display: flex;
  margin-top: 5px;
  margin-left: 2%;
  background-color: rgba(103, 233, 77, 0.644);
}
.tab_upd {
  width: 95%;
  display: flex;
  margin-left: 2%;
  background-color: rgba(209, 212, 36, 0.644);
}

/* 翻頁樣式 */
.pre_page {
  width: 100%;
  margin-top: 5px;
  margin-bottom: 5px;
}
.pre_page > ul {
  text-align: right;
  list-style: none;
}
.pre_page > ul > li > a {
  text-decoration: none;
}
.pre_page > ul > li > .go {
  display: inline-block;
  width: 40px;
  height: 20px;
  border: 1px solid #cccccc;
  background: #024aee;
  color: #fff;
  border-radius: 4px;
  text-align: center;
  margin-left: 5px;
}
.pre_page > ul > li > a:hover {
  color: #394656;
}
</style>

呼叫部分

<template>
  <div class="mydiv">
    <h2>Table外掛測試</h2>
    <pre-table ref="file_table" @tab-event="refresh_data" :api_url="load_url" :pre_post="load_json">
      <!-- 設定標題  -->
      <template slot="tab_title">
        <tr>
          <th style="display:none;">ID</th>
          <th>上傳使用者</th>
          <th>檔名稱</th>
          <th>檔案型別</th>
          <th>檔案大小</th>
          <th>上傳時間</th>
          <th>操作</th>
        </tr>
      </template>
      <!-- user 相當於一個wrapper,容器,是自己定義的 -->
      <!-- user.item 對應 子元件的  :item="data_tr" 這裡 item -->
      <!-- table可以封裝到 表格,資料載入,重新整理,分頁 只需要傳入URL就可以了 具體的增刪改業務 單獨完成 -->
      <template slot="tab_tr" slot-scope="user">
        <tr>
          <td style="display:none;">{{ user.item.id }}</td>
          <td class="td_name">{{ user.item.username }}</td>
          <td>{{ user.item.upfile_name }}</td>
          <td class="td_type">{{ user.item.upfile_type }}</td>
          <td>{{ user.item.upfile_size }}</td>
          <td>{{ user.item.sys_date }}</td>
          <td style="text-align: center;">
            <button @click="fun_add()">增加</button>&nbsp;
            <button @click="fun_del(user.item.id)">刪除</button>&nbsp;
            <button @click="fun_upd(user.item.id)">修改</button>
          </td>
        </tr>
      </template>
      <!-- 構建新增模板 -->
      <template slot="tab_add">
        <!-- <h2>名稱:</h2>
        <input type="text" v-model="upd_upfile_name" />
        <button @click="fun_save('add')">儲存新增</button>-->
        <tr>
          <td style="display:none;"></td>
          <td>
            <input type="text" v-model="t_username">
          </td>
          <td>
            <input type="text" v-model="t_name">
          </td>
          <td>
            <input type="text" v-model="t_type">
          </td>
          <td>
            <input type="text" v-model="t_size">
          </td>
          <td></td>
          <td style="text-align: center">
            <button @click="fun_save('add')">儲存新增</button>
          </td>
        </tr>
      </template>
      <!-- 構建修改模板 -->
      <template slot="tab_upd">
        <tr>
          <td style="display:none;"></td>
          <td>
            <input type="text" v-model="t_username">
          </td>
          <td>
            <input type="text" v-model="t_name">
          </td>
          <td>
            <input type="text" v-model="t_type">
          </td>
          <td>
            <input type="text" v-model="t_size">
          </td>
          <td></td>
          <td style="text-align: center">
            <button @click="fun_save('upd')">儲存修改</button>
          </td>
        </tr>
      </template>
    </pre-table>
  </div>
</template>

<script>
import { GetShort, BackSpecial } from "@/utils/localstore.js";
// 這個是把postjson資料過程封裝起來
import { tab_file_select } from "@/utils/loadhttpdata.js";

export default {
  components: {
    "pre-table": () => import("./personmode/pre_table.vue")
  },
  data() {
    return {
      load_url: "",
      load_json: "",
      upd_upfile_name: "",
      t_username: "",
      t_name: "",
      t_type: "",
      t_size: ""
    };
  },
  created: function() {
    this.loaddata();
  },
  methods: {
    loaddata: function() {
      this.load_url = "/Data_Back";
      this.load_json = tab_file_select("", "1");
    },
    refresh_data: function(page, keyword) {
      console.log("重新整理結果page=" + page + " keyword=" + keyword);
      this.load_url = "/Data_Back";
      this.load_json = tab_file_select(keyword, page);
    },
    fun_add: function() {
      // 展示新增位置
      this.$refs.file_table.data_add();
    },
    fun_del: function(id) {
      console.log("刪除 id=" + id);
    },
    fun_upd: function(id) {
      // 展示修改位置
      this.$refs.file_table.data_upd();
    },
    fun_save: function(type) {
      console.log("操作:" + type + " 內容" + this.upd_upfile_name);
    }
  }
};
</script>
<style scoped>
.td_type {
  width: 200px;
  height: 20px;
  /* white-space: nowrap;
  word-break: break-all;
  word-wrap: break-word; */
  overflow: hidden;
  text-overflow: ellipsis;
}
</style>

執行結果

相關推薦

vue元件系列4Table封裝

開發十年,就只剩下這套架構體系了! >>>   

vue元件系列4Table封裝

開發十年,就只剩下這套架構體系了! >>>   

VUE元件系列7:Table封裝3

前面寫的Table封裝,只是省了一部分事情,還是需要通過slot配置表結構,沒有達到一開始的想法: 只配置一個載入url和一個增

vue元件系列2拖放上傳

開發十年,就只剩下這套架構體系了! >>>   

vue元件系列6雙向繫結方法

開發十年,就只剩下這套架構體系了! >>>   

PADS學習2(封裝元件型別PART 邏輯封裝庫CAE)

altium designer中封裝的型別很簡單:包括元器件封裝(原理圖)、PCB封裝(PCB圖)。在元器件封裝中可以直接選用所需的PCB封裝。 PADS中,使用元件型別PART表示一個完整器件。PART中可以選擇所需的PCB封裝與CAE封裝。用慣了altium designer的人,剛

Vue元件化(全域性區域性)props傳參

目錄 全域性元件化 區域性元件化 全域性元件化 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Do

JS元件系列——在ABP中封裝BootstrapTable

 前言:關於ABP框架,博主關注差不多有兩年了吧,一直遲遲沒有嘗試。一方面博主覺得像這種複雜的開發框架肯定有它的過人之處,系統的穩定性和健壯性比一般的開源框架肯定強很多,可是另一方面每每想到它繁瑣的封裝和複雜的開發流程就望而卻步,就這樣遲遲沒有行動。最近在專案裡面用到了ABP框架,沒辦法,只有硬著頭皮上了。經

TQ2440 學習筆記—— 4安裝 Ubuntu 的開發工具

使用的板子是TQ2440,但學習的視訊是韋東山老師的視訊,所以虛擬機器裡面用的Linux是韋東山老師介紹的Ubuntu 9.10 下面是在Ubuntu9.10裡面安裝開發工具 由於第一次使用Ubuntu,對命令的使用不是特別熟悉,所以記錄下。 先將光盤裡Linux目錄下

vue-上拉載入拉重新整理元件

vue在移動端開發過程中,上拉載入、下拉重新整理是頁面的基本需求,現在給大家介紹一種基於touch事件封裝的重新整理元件。 元件支援傳參、傳遞事件、請求成功非同步回撥、上拉與觸底觸發載入或重新整理。 父子元件間的通訊 這裡我們有兩個頁面,父元件note.vue與重新整理元件baseScroll.vue。

Vue.js元件封裝——拉列表

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible"content="IE=edge"&g

VUE 餓了麼元件 1.4 table 屬性之一

<el-table :data="Data.list" style="width: 100%" tooltip-effect="light"> 程式碼中有二點介紹 :data 繫結的資料是 VUE 的 data.list 模板樣式風格是淺色系的。 tooltip

封裝Vue Element的可編輯table表格元件

前一段時間,有博友在我那篇封裝Vue Element的table表格元件的博文下邊留言說有沒有那種“表格行內編輯”的封裝元件,我當時說我沒有封裝過這樣的元件,因為一直以來在實際開發中也沒有遇到過這樣的需求,但我當時給他提供了一個思路。 時間過去了這麼久,公司的各種需求也不停地往外冒,什麼地圖圖表、表格行內編

5.1 vim介紹 5.2 vim顏色顯示和移動光標 5.3 vim一般模式移動光標 5.4 vim一般模式復制剪切和粘貼

介紹 vim 顏色顯示 5.1 vim介紹5.2 vim顏色顯示和移動光標5.3 vim一般模式下移動光標5.4 vim一般模式下復制、剪切和粘貼5.1 vim介紹vim 是 vi的一個升級版本vim 是帶有顏色顯示的再試下vim 命令[[email protected]/* */ ~

四周第二次課(1月3日) 5.1 vim介紹 5.2 vim顏色顯示和移動光標 5.3 vim一般模式移動光標 5.4 vim一般模式復制剪切和粘貼

技術 完成 1.0 正在 tin carp 3.4 style ransac 四周第二次課(1月3日)5.1 vim介紹5.2 vim顏色顯示和移動光標5.3 vim一般模式下移動光標5.4 vim一般模式下復制、剪切和粘貼 [root@localhost ~]# [r

4計算機的存儲之內存 - 計算機硬件學習系列文章

強制 好的 tun 全部 命中 ddr area 出廠 兼容性 內存是計算機中重要的部件之一,它是與CPU進行溝通的橋梁。計算機中所有程序的運行都是在內存中進行的,因此內存的性能對計算機的影響非常大。內存(Memory)也被稱為內存儲器,其作用是用於暫時存放CPU中的運算數

vue學習之路 - 4.基本操作(

align 過去 開始 就會 binding 效果 不可 exp 功能 vue學習之路 - 4.基本操作(下) 簡述:本章節主要介紹 vue 的一些其他常用指令。 Vue 指令   這裏將 vue 的指令分為系統內部指令(vue 自帶指令)和用戶自定義指令兩種。 系統內部指

vue元件開發之導航選單元件封裝

執行結果: 呼叫程式碼部分: <template> <div id="app"> <menu-bar :list="list" @click="menuClick"></menu-bar> <!--fir

4對各頁面元素及方法進行封裝

所謂的POM(Page Object Model)設計模式其實就是把一個頁面當作一個物件,將一個頁面中的所有元素及方法封裝在一個java類中。 下面封裝了3個頁面的元素: 依次開啟看看吧。 1、home_baidu.py # -*- coding:utf-8 -*- from fra

4採用POM模型封裝各頁面元素及方法

這裡簡單封裝了4個頁面的元素及方法: 下面將依次貼出程式碼: 1、baidu_home_page.java程式碼: package pageobjects;import org.openqa.selenium.WebDriver;import org.openqa.selenium.W