vue elementUi邮箱列表选择(全选,已读,未读,删除)功能
基于vue + elementUI写的邮箱列表,包括全选,已读,未读,上次一次点击记录以及删除的操作列表组件如下:<template><div style="height: 100vh; background-color: #f6f8fb; min-width: 1440px;"><ai-header></ai-header>...
·
基于vue + elementUI写的邮箱列表,包括全选,已读,未读,上次一次点击记录以及删除的操作
列表组件如下:
<template>
<div style="height: 100vh; background-color: #f6f8fb; min-width: 1440px;">
<ai-header></ai-header>
<div style="padding: 24px">
<div class="notice">
<div class="notice-top">
<div class="notice-top-title"><i class="el-icon-arrow-left"></i><span>通知列表</span></div>
<div class="notice-top-type">
<div>
<el-checkbox v-model="isAll" @change="checkAll()" style="width: 100%;">全部消息</el-checkbox>
</div>
<div>
<el-checkbox v-model="isRead" @change="checkRead()" style="width: 100%;">已读</el-checkbox>
</div>
<div>
<el-checkbox v-model="isUnread" @change="checkUnread()" style="width: 100%;">未读</el-checkbox>
</div>
<el-button type="primary" :disabled="!tableIds.length>0" size="small" @click="handleRemove">删除</el-button>
</div>
</div>
<div class="notice-content">
<p class="tips">
<span>您有{{tipsNumber}}封未读消息</span>
</p>
<el-table
ref="multipleTable"
:data="tableData"
@row-click="rowLink"
tooltip-effect="dark"
:show-header="showHeader"
style="width: 100%"
class="notice-table"
>
<el-table-column
prop="historyIcon"
label="historyIcon"
width="30"
>
<template slot-scope="scope">
<img v-show="scope.row.tableId === lastclickNum" :src="historyIcon" alt="" style="width:8px;height:10px;">
</template>
</el-table-column>
<el-table-column
type="selection"
align="center"
width="50"
>
</el-table-column>
<el-table-column
prop="mailbox"
label="mailbox"
width="40">
<template slot-scope="scope">
<img v-show="!scope.row.read" :src="mailbox" alt="" style="width:14px;height:8px;">
</template>
</el-table-column>
<el-table-column
prop="remind"
label="remind"
show-overflow-tooltip>
</el-table-column>
<el-table-column
prop="time"
label="time"
align="right"
show-overflow-tooltip>
</el-table-column>
</el-table>
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:page-size="100"
layout="prev, pager, next, jumper"
:total="1000"
class="notice-pagination">
</el-pagination>
</div>
</div>
</div>
</div>
</template>
<script>
import Header from '@/layouts/components/Header'
export default {
name: 'notice',
components: {
'ai-header': Header
},
data () {
return {
isAll: false, // 全选
isRead: false, // 已读
isUnread: false, // 未读
showHeader: false,
tipsNumber: '', // 未读消息数量
tipsArr: [],
removeArr: [],
tableIds: [], // 记录选中的项
mailbox: 'http://192.168.1.3:3002/images/notice_mail.png', // 邮箱图片
historyIcon: 'http://192.168.1.3:3002/images/notice_active.png', // 上一次浏览记录
lastclickNum: null,
tableData: [
{
tableId: 1,
remind: '您的dxg服务器即将到期,请及时续费',
time: '11月27日',
read: false
}, {
tableId: 2,
remind: '您的dxg服务器即将到期,请及时续费',
time: '11月27日',
read: true
}, {
tableId: 3,
remind: '您的dxg服务器即将到期,请及时续费',
time: '11月27日',
read: false
}, {
tableId: 4,
remind: '您的dxg服务器即将到期,请及时续费',
time: '11月27日',
read: true
}, {
tableId: 5,
remind: '您的dxg服务器即将到期,请及时续费',
time: '11月27日',
read: false
}, {
tableId: 6,
remind: '您的dxg服务器即将到期,请及时续费',
time: '11月27日',
read: false
}]
}
},
mounted () {
// 显示未读数量
this.initializationNoRead()
// 获取上一次点击记录
this.lastclickNum = JSON.parse(localStorage.getItem('arr'))
console.log(this.lastclickNum)
},
methods: {
// 全选
checkAll () {
this.isRead = false // 隐藏已读按钮显示
this.isUnread = false //隐藏未读按钮显示
this.tableIds = [] //点击全选时设置默认选中的项为空 确保下面为其赋值
this.$refs.multipleTable.clearSelection() // element table自带的清空选中方法
if (this.isAll) { //当全选时
this.$refs.multipleTable.toggleAllSelection() // 选中当前项,element table自带的选中方法
this.tableData.map(row => {
this.tableIds.push(row.tableId) // 将遍历的id放入记录选中项的数组中
console.log(this.tableIds)
})
}
},
// 已读
checkRead () {
this.isAll = false // 隐藏全选按钮显示
this.isUnread = false // 隐藏未读按钮显示
this.tableIds = [] //点击已读时设置默认选中的项为空 确保下面为其赋值
this.$refs.multipleTable.clearSelection() // element table自带的清空选中方法
if (this.isRead) { // 当已读时
this.tableData.map(row => {
if (row.read) { // 遍历tableData当属性read为true的时候
this.$refs.multipleTable.toggleRowSelection(row) // 选中当前项,element table自带的选中方法
this.tableIds.push(row.tableId) // 将遍历的id放入记录选中项的数组中
console.log(this.tableIds)
}
})
}
},
// 未读
checkUnread () {
this.isAll = false // 隐藏全选按钮显示
this.isRead = false // 隐藏已读按钮显示
this.tableIds = [] // 点击未读时设置默认选中的项为空 确保下面为其赋值
this.$refs.multipleTable.clearSelection() // element table自带的清空选中方法
if (this.isUnread) { // 当未读时
this.tableData.map(row => {
if (!row.read) { // 遍历tableData当属性read为false的时候
this.$refs.multipleTable.toggleRowSelection(row) // 选中当前项,element table自带的选中方法
this.tableIds.push(row.tableId) // 将遍历的id放入记录选中项的数组中
console.log(this.tableIds)
}
})
}
},
// 未读邮箱数量
initializationNoRead () {
for (let i = 0; i < this.tableData.length; i++) {
if (!this.tableData[i].read) {
this.tipsArr.push(i)
console.log(this.tipsArr.length)
this.tipsNumber = this.tipsArr.length
}
}
},
// 删除选中邮箱
handleRemove () {
var newDate = [] // 定义新数组存放保留的数值
this.tableData.forEach((val, index) => {
if (!(this.tableIds.indexOf(val.tableId) > -1)) {
newDate.push(val) //筛选出tableIds里面存在的项 并将其进行取反 将符合条件的值加到newDate中(也就是需要保留的值)
console.log(newDate)
}
})
var result = confirm('确定删除?')
if (result === true) {
// 将当前新数组赋值给原数组,数据改变 =》界面改变
this.tableData = newDate // 将需要保留的项赋值给tableData
console.log(this.tableData)
this.tableIds = [] // 配合视图显示按钮不可点击状态
return true
} else {
return false
}
},
rowLink (row, event, column) { // 表格行点击
this.$router.push({ //向详情页传值
name: 'notice-detail',
params: {
id: row.tableId
}
})
}
}
}
</script>
<style scoped>
.notice{
background-color: #fff;
padding: 32px;
-webkit-box-shadow: 0 1px 4px 0 rgba(0, 21, 41, 0.12);
box-shadow: 0 1px 4px 0 rgba(0, 21, 41, 0.12);
}
.notice-top-title span{
margin-left:10px;font-size:16px;
cursor: pointer;
}
.notice-top-type{
margin-top: 24px;
display: flex;
}
.notice-top-type div{
width:94px;
height:32px;
background:rgba(250,250,250,1);
border:1px solid rgba(216,216,216,1);
text-align: center;
line-height: 28px;
margin-right: 16px
}
.notice-content{
margin-top: 12px
}
.tips{
width:100%;
height:54px;
border-bottom: 1px solid #eeeeee;
line-height: 54px;
}
.tips span{
margin-left: 14px;
font-size:12px;
color: #1C91FC
}
.notice-pagination{
margin-top: 30px;
text-align: right
}
</style>
对应详情页组件如下:(包含保存上一次点击记录)
<template>
<div style="height: 100vh; background-color: #f6f8fb; min-width: 1440px;">
<ai-header></ai-header>
<div style="padding: 24px">
<div class="noticeDetails">
<div class="noticeDetails-top">
<div class="noticeDetails-top-title" @click="handleBack"><i class="el-icon-arrow-left"></i><span>通知详情</span></div>
</div>
<div class="noticeDetails-content-all">
<div class="noticeDetails-content">
<p>您的dxg服务器即将到期 请及时续费</p>
<p>您的dxg服务器即将到期,请及时续费您的dxg服务器即将到期,请及时续费您的dxg服务器即将到期,请及时续费您的dxg服务器即将到期,请及时续费您的dxg服务器即将到期,请及时续费,请及时续费您的dxg服务器即将到期,请及时续费您的dxg服务器即将到期,请及时续费</p>
<p>11月29号</p>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
// @ is an alias to /src
import Header from '@/layouts/components/Header'
export default {
name: 'noticeDetails',
components: {
'ai-header': Header
},
data () {
return {
noticeDalId: ''
}
},
mounted () {
this.noticeDalId = this.$route.params.id
let listArr = this.noticeDalId
listArr = JSON.stringify(listArr)
localStorage.setItem('arr', listArr) // 存储点击记录
console.log(listArr)
},
methods: {
handleBack () { // 返回上一级
this.$router.back(-1)
}
}
}
</script>
<style scoped>
.noticeDetails{
background-color: #fff;
padding: 32px;
-webkit-box-shadow: 0 1px 4px 0 rgba(0, 21, 41, 0.12);
box-shadow: 0 1px 4px 0 rgba(0, 21, 41, 0.12);
}
.noticeDetails-top-title span{
margin-left:10px;font-size:16px;
cursor: pointer;
}
.noticeDetails-content-all{
width:100%;
height:auto;
background:rgba(255,255,255,1);
border:1px solid rgba(216,216,216,1);
display: flex;
justify-content: center;
margin-top: 24px
}
.noticeDetails-content{
padding: 40px
}
.noticeDetails-content p:nth-child(1){
font-size:24px;
color:rgba(0,0,0,0.65);
text-align: center
}
.noticeDetails-content p:nth-child(2){
font-size:14px;
color:rgba(0,0,0,0.65);
margin-top: 24px;
line-height: 27px
}
.noticeDetails-content p:nth-child(3){
font-size:14px;
color:#999999;
margin-top: 100px;
text-align: right
}
</style>
更多推荐
已为社区贡献1条内容
所有评论(0)