需求: 在项目中,有时候可能在不同画面需要完成同一功能,比如示例文件列表查看功能,系统上传文件,需要查看文件列表,以及文件历史记录

话不多说,上图

这个查看文件的Dialog需要在系统中的很多地方调用,开发过程中不可能在每个地方都定义一遍,那么,我们可能使用自定义控件形式,代码如下

<template>
<el-dialog title="查看文件" :visible.sync="innerVisible" class="form-dialog" center @closed="onClosed">
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="文件列表" name="fileList">
<el-table
v-loading="listLoading"
size="small"
:data="list"
style="width: 100%"
element-loading-text="Loading"
border
stripe
fit
highlight-current-row
>
<el-table-column label="序号" align="center">
<template slot-scope="scope">
{{ scope.$index + 1 }}
</template>
</el-table-column>
<el-table-column label="文件名" align="center">
<template slot-scope="scope">
{{ scope.row.name }}
</template>
</el-table-column>
<el-table-column label="文件大小(KB)" align="center">
<template slot-scope="scope">
<span>{{ scope.row.size }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-button size="mini" @click="downLoadFile(scope.row)">下载</el-button>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane label="历史版本" name="history">
<el-table
v-loading="historyListLoading"
size="small"
:data="historyList"
style="width: 100%"
element-loading-text="Loading"
border
stripe
fit
highlight-current-row
>
<el-table-column label="序号" align="center">
<template slot-scope="scope">
{{ scope.$index + 1 }}
</template>
</el-table-column>
<el-table-column label="时间" align="center">
<template slot-scope="scope">
{{ scope.row.Date | parseTime('{y}-{m}-{d} {h}:{i}') }}
</template>
</el-table-column>
<el-table-column label="备注" align="center">
<template slot-scope="scope">
<span>{{ scope.row.Remark }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-button size="mini" @click="downLoadVersionFile(scope.row)">下载</el-button>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
</el-tabs>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="innerVisible = false">确定</el-button>
</div>
</el-dialog>
</template> <script>
import { fileDownload, getFileList, getFileHistoryList, versionFileDownload } from '@/api/common/common'
import { getToken } from '@/utils/auth'
import { parseTime, downloadFile } from '@/utils'
export default {
name: 'FileListDialog',
filters: {
parseTime(time, cFormat) {
return parseTime(time, cFormat)
}
},
components: {
},
props: {
visible: {
type: Boolean,
default: false
},
url: {
type: String,
default: ''
}
},
data() {
return {
token: getToken(),
list: null,
historyList: null,
listLoading: true,
historyListLoading: true,
innerVisible: this.visible,
sURL: '',
activeName: 'fileList'
}
},
watch: {
visible(val, oldVal) {
if (val === oldVal) {
return
}
this.innerVisible = val
},
innerVisible(val, oldVal) {
if (val === oldVal) {
return
}
this.$emit('update:visible', val)
},
sURL(val, oldVal) {
if (val === oldVal) {
return
}
this.activeName = 'fileList'
// 获取数据
this.getList()
}
},
mounted() {},
updated() {
this.sURL = this.url
this.dVisible = this.dialogFormVisible
},
methods: {
handleClick(tab, event) {
switch (tab.name) {
case 'fileList':
this.getList()
break
case 'history':
this.getHistory()
break
}
},
getList() {
this.listLoading = true
var param = {
url: this.sURL,
token: getToken()
}
getFileList(param).then(response => {
this.list = response.data
this.listLoading = false
})
},
getHistory() {
this.historyListLoading = true
var param = {
url: this.sURL,
token: getToken()
}
getFileHistoryList(param).then(response => {
this.historyList = response.data
this.historyListLoading = false
})
},
onClosed() {
this.sId = ''
},
downLoadFile(row) {
var param = {
token: getToken(),
url: row.url
}
fileDownload(param).then(res => {
if (res.code === 20000) {
downloadFile(res.data.name, res.data.dataStr)
}
})
},
downLoadVersionFile(row) {
var param = {
token: getToken(),
url: row.URL,
versionNo: row.VersionNo
}
versionFileDownload(param).then(res => {
if (res.code === 20000) {
downloadFile(res.data.name, res.data.dataStr)
}
})
}
}
}
</script> <style></style>

 其中,Dialog控制显隐的关键部分是watch函数部分

    visible(val, oldVal) {
if (val === oldVal) {
return
}
this.innerVisible = val
},
innerVisible(val, oldVal) {
if (val === oldVal) {
return
}
this.$emit('update:visible', val)
}

 visible和innerVisible分别对应控件的属性以及Data,防止多次修改属性问题。

sURL(val, oldVal) {
if (val === oldVal) {
return
}
this.activeName = 'fileList'
// 获取数据
this.getList()
}

 该部分是控制Dialog显示数据用

父画面调用:

<template>
<div class="app-container">
<div class="filter-container">
<el-button v-waves size="small" class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter">搜索</el-button>
</div>
<el-table
v-loading="listLoading"
size="small"
:data="list"
style="width: 100%"
element-loading-text="Loading"
border
stripe
fit
highlight-current-row
>
<el-table-column label="技术协议" align="center">
<template slot-scope="scope">
<el-button size="mini" @click="viewFile(scope.row)">查看</el-button>
</template>
</el-table-column>
</el-table>
<Pagination v-show="total > 0" size="small" :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit" @pagination="getList" /> <FileListDialog :url="fileURL" :visible.sync="fileListDialogVisible" />
</div>
</template> <script>
import FileListDialog from './dialog/fileListDialog.vue' export default {
components: {
FileListDialog
},
data() {
return {
fileURL: '',
fileListDialogVisible: false
}
},
methods: {
viewFile(row, type) {
if (stringIsNullOrEmpty(row.Path)) return
this.fileListDialogVisible = true
this.fileURL = row.Path // URL地址
}
}
}
</script>

  

一,View中引用自定义Dialog组件的更多相关文章

  1. Android中制作自定义dialog对话框的实例

    http://www.jb51.net/article/83319.htm   这篇文章主要介绍了Android中制作自定义dialog对话框的实例分享,安卓自带的Dialog显然不够用,因而我们要继 ...

  2. [asp.net mvc 奇淫巧技] 01 - 封装上下文 - 在View中获取自定义的上下文

    我们在asp.net 开发中已经封装了最强大的HttpContext,我们可以在HttpContext中可以获取到几乎任何想获取的东西,也可以在HttpContext写入需要返回客户端的信息.但是这些 ...

  3. C程序中引用自定义的C函数模块

    原文:C程序中引用自定义的C函数模块 我们知道,刚开始接触C语言编程,一般都是在一个.c或者.cpp(以下只说.c)的文件中编写代码,其中一定会有一个入口函数, 也就是main()函数,你可以将程序代 ...

  4. (vue.js)vue中引用了别的组件 ,如何使this指向Vue对象

    Vue中引用了别的组件 ,如何使this指向Vue对象 今天学习Vue组件传值, 通过创建Vue实例, 广播和监听实现传值, 但是传值之后无法直接将得到的值应用到Vue对象, 因为这相当于引用改了别的 ...

  5. Android XML中引用自定义内部类view的四个why

    今天碰到了在XML中应用以内部类形式定义的自定义view,结果遇到了一些坑.虽然通过看了一些前辈写的文章解决了这个问题,但是我看到的几篇都没有完整说清楚why,于是决定做这个总结. 使用自定义内部类v ...

  6. 在ASP.NET中引用自定义提示框

    在html网页中自定义提示框 正文: 在一般的B/S架构中项目,与用户的交互信息是非常重要的.在一般的情况下,设计人员都在把用户信息呈现在html中,用div和span去弹出相关信息.对于一般的情况而 ...

  7. YII中引用自定义类

    如果通过actions方法引用其他自定义类时 <?php class LoginController extends Controller { public function actionInd ...

  8. 检索COM 类工厂中CLSID 为{00024500-0000-0000-C000-000000000046}组件时失败

    检索 COM 类工厂中 CLSID 为{00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005 当在ASP.NET应用程序中引 ...

  9. vue中引用vux

    官网看不懂,网上搜了下,以备不时之需 这是官网说明文档,看不懂的啊. Vux使用教程: 1,在项目里安装vux cnpm install vux --save 2,在项目里安装vux-loader(这 ...

随机推荐

  1. 狄慧201771010104《面向对象程序设计(java)》第十六周学习总结

    实验十六  线程技术 实验时间 2017-12-8 一.知识点总结: 1.程序与进程的概念 ‐程序是一段静态的代码,它是应用程序执行的蓝本. ‐进程是程序的一次动态执行,它对应了从代码加载.执行至执行 ...

  2. double运算的坑

    某个结果运算后,得出的数据:a = 15.599999999 而不是15.6,导致条件判断 a < 15.6 为true,使程序出现bug 解决办法,对运算后的浮点数,进行格式化(以保留一位小数 ...

  3. requests抓取数据示例

    1:获取豆瓣电影名称及评分 # 抓取豆瓣电影名称及评分 url="https://movie.douban.com/j/search_subjects" start=input(& ...

  4. Android JetPack组件-CameraX初探

    CameraX 又是一个 Google 推出的 JetPack 组件 ,是一个新鲜玩意儿,故给大家分享下我在项目中的使用过程心得.. CameraX 是什么? Google 开发者文档 对 Camer ...

  5. F - Power Network POJ - 1459

    题目链接:https://vjudge.net/contest/299467#problem/F 这个是一个很简单的题目,但是读入很有意思,通过这个题目,我学会了一种新的读入方式. 一个旧的是(%d, ...

  6. python学习笔记-零碎知识点

    1. 绝对值 abs(-4) 结果: 4 2.

  7. Linux时间的相关的操作

    时间(修改时区,修改时间,同步网络时间) 查看当前系统时间 date 修改时区 cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 修改当前系统时间 ...

  8. python学习之如何一次性输出多个变量的值

    如果要输出多个结果 ,中间使用逗号隔开,且引用变量为%(变量1,变量2,变量3)例如

  9. [hdu4627 The Unsolvable Problem]数论

    题意:给一个数n,找一个正整数x<n,使得x和n-x的最小公倍数最大. 思路:显然x和n-x越接近越好,gcd必须为1(贪心).从大到小考虑x,如果n为奇数,则答案就是x=n/2,如果n为偶数, ...

  10. pthon-安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示“This application failed to start because no Qt platform plugin could be initialized.Reinstalling the application the application may fix this program”

    最近学习python,安装网上教程一步一步的安装,网上很多帖子都写的非常详细,不由深深感慨多谢各位不辞辛苦的记录,指导着来自新入门的同学. 但是实际安装中,最理想莫过于一次性安装成功,但自己安装就出现 ...