小程序如何开发_vue完成前台列表数据过滤查找、

阅读  ·  发布日期 2021-01-07 13:28  ·  admin
vue实现前台列表数据过滤搜索、分页效果       这篇文章主要为大家详细介绍了vue实现前台列表数据过滤搜索、分页效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了vue实现列表数据过滤搜索、分页效果的具体代码,供大家参考,具体内容如下

job.vue页面

 style lang="scss" 
.job-wrapper {
 padding-top: 50px;
.job-left {
 float: left;
 margin-right: 20px;
 padding: 20px;
 width: 310px;
 background: #fff;
.job-serach-title {
 margin: 8px 0 10px 0;
 color: rgb(51, 51, 51);
 font-size: 16px;
.job-search-input {
 display: flex;
.job-keywords {
 width: 400px;
.job-search-btn {
 display: flex;
 align-items: center;
 justify-content: center;
 margin-left: 10px;
 width: 50px;
 height: 40px;
 border-radius: 4px;
 background-color: rgb(254, 62, 98);
.line {
 margin: 25px 0 0 0;
 width: 100%;
 height: 1px;
 background: #dfdfdf;
.halogg {
 margin-top: 30px;
 color: rgb(102, 102, 102);
 font-weight: 300;
 font-size: 14px;
.job-right {
 float: right;
 width: 870px;
 background: #fff;
 /style 
 style lang="scss" 
// 重置样式
#job-select-1,
#job-select-2 {
 margin-top: 20px;
 select {
 width: 100%;
 /style 
 template 
 article 
 div 
 div 
 div 
 div 搜索更多职位 /div 
 div 
 input v-model.trim="formData.keywords" @change="searchData" placeholder="搜索更多职位" / 
 div @click="searchData" 
 /div 
 /div 
 div /div 
 div id="job-select-1" 
 select v-model="formData.address" @change="searchData" 
 option v-for="item,index in regionArr" :key="index" {{item.name}} /option 
 /select 
 /div 
 div id="job-select-2" 
 select v-model="formData.title" @change="searchData" 
 option v-for="(item,index) in searchList" :key="index" {{item}} /option 
 /select 
 /div 
 /div 
 div 
 joblist /joblist 
 /div 
 /div 
 /div 
 /article 
 /template 
 script 
import joblist from 'ponents/job/list';
import { mapGetters, mapActions, mapMutations } from 'vuex';
export default {
 name: 'reportFormIndex',
 data() {
 return {
 formData: {
 title: '',
 address: '',
 keywords: '',
 computed: {
 ...mapGetters(['searchList', 'regionArr', 'show']),
 watch: {},
 title() {
 return '行业';
 methods: {
 ...mapActions(['getData']),
 // select 选中后的回调数据
 searchData() {
 const payload = {
 formData: Object.assign({}, this.formData),
 pageIndex: 0, // 每次搜索后, 显示搜索结果的第一页
 this.$mit('setState', payload);
 mounted() {
 this.$nextTick(() = {
 this.getData();
 components: {
 joblist,
 /script 

组件list.vue

 style lang="scss" 
.list-header {
 position: relative;
 display: flex;
 padding: 25px 30px 20px 30px;
 color: rgb(153, 153, 153);
 font-size: 14px;
 :after {
 position: absolute;
 right: 0;
 bottom: 0;
 left: 0;
 display: inline-block;
 width: 100%;
 height: 1px;
 background-color: #dfdfdf;
 content: '';
.l-header-item-1 {
 padding-left: 20px;
 width: 37.3%;
.l-header-item-2 {
 padding-left: 10px;
 width: 32.7%;
.l-header-item-3 {
 padding-left: 10px;
 width: 18.7%;
.l-header-item-4 {
 display: flex;
 width: 11.3%;
 .open {
 color: #3e8bf5;
 text-decoration: underline;
 font-size: 14px;
 .arrow-open {
 margin-top: 5px;
 margin-left: 5px;
 width: 11px;
 height: 7px;
 transition: all 0.5s linear;
.inner-item {
 padding: 0 30px;
.inner-box {
 position: relative;
 display: flex;
 padding: 25px 0;
 color: rgb(51, 51, 51);
 font-size: 16px;
 transition: all 0.5s linear;
 :after {
 position: absolute;
 right: 0px;
 bottom: 0;
 left: 0px;
 display: inline-block;
 height: 1px;
 background-color: #dfdfdf;
 content: '';
.list-item {
 .active {
 .list-show-detail {
 visibility: visible;
 padding: 0 50px;
 max-height: 1000px;
 transition: all 0.5s linear;
 .inner-box {
 background: #f2f2f2;
 transition: all 0.5s linear;
 :after {
 background-color: transparent;
 .arrow-open {
 transition: all 0.5s linear;
 transform: rotate(-180deg);
.list-show-detail {
 visibility: hidden;
 max-height: 0;
 transition: all 0.5s linear;
.list-task-title {
 margin: 25px 0 15px 0;
 color: rgb(51, 51, 51);
 font-size: 14px;
.list-task-item {
 color: rgb(102, 102, 102);
 font-size: 14px;
 line-height: 1.714;
.list-apply {
 display: flex;
 align-items: center;
 justify-content: center;
 margin: 25px 0 30px 0;
 width: 140px;
 height: 50px;
 border-radius: 4px;
 background-color: rgb(254, 62, 98);
 color: rgb(255, 255, 255);
 font-size: 16px;
/////pagination
.job-pagination {
 padding: 50px 0;
 .pagination-wrapper {
 display: flex;
 justify-content: center;
 margin: 0 auto;
 width: 100%;
 .subscript {
 display: flex;
 align-items: center;
 justify-content: center;
 margin: 0 5px;
 width: 28px;
 height: 28px;
 border: 1px solid rgb(223, 223, 223);
 border-radius: 4px;
 color: blue;
 color: rgb(102, 102, 102);
 text-align: center;
 font-size: 14px;
 .active {
 border: 1px solid rgb(254, 62, 98);
 background-color: rgb(254, 62, 98);
 color: #fff;
 .pagination-page {
 display: inline-block;
 width: 7px;
 height: 11px;
 background-image: url('./images/arrow.png');
 .pagination-next {
 transform: rotate(180deg);
.job-no-data {
 padding: 100px 0;
 .job-no-data-img {
 margin: 0 auto;
 width: 170px;
 height: 170px;
 background-image: url('./images/');
 background-size: cover;
 background-repeat: no-repeat;
 .job-no-data-msg {
 margin-top: 10px;
 color: rgb(51, 51, 51);
 text-align: center;
 font-size: 18px;
 line-height: 2.778;
@media only screen and (max-width: 1200px) {
 .list-header {
 padding: 25px 30px 20px 30px;
@media only screen and (max-width: 767px) {
 .list-header {
 padding: 20px 15px 15px 15px;
 .inner-item {
 padding: 0px 15px 0 15px;
 :after {
 right: 15px;
 left: 15px;
 transform: scaleY(0.5);
 .l-header-item-1 {
 padding-left: 10px;
 .l-header-item-2 {
 padding-left: 10px;
 width: 28.7%;
 .l-header-item-3 {
 padding-left: 10px;
 width: 19.7%;
 .l-header-item-4 {
 width: 14.3%;
 /style 
 template 
 article id="list" 
 div 职位名称 /div 
 div 职位分类 /div 
 div 所在地区 /div 
 div /div 
 /li 
 li v-for="(item,index) in curList" :key="index" :class="{'active':item.show}" v-show="curList.length" 
 div 
 div 
 div {{item.position}} /div 
 div {{item.title}} /div 
 div {{item.address}} /div 
 div @click="showHandler(item.id)" 
 span 展开 /span 
 img src="./images/arrow-open.png" alt="" 
 /div 
 /div 
 /div 
 transition name="el-zoom-in-top" 
 div v-show="item.show" 
 div 岗位职责: /div 
 div 
 div v-for="(item2,index2) in item.task" :key="index2" {{item2}} /div 
 /div 
 div 岗位要求: /div 
 div 
 div v-for="(item3,index3) in item.rule" :key="index3" {{item3}} /div 
 /div 
 /div 
 /transition 
 /li 
 li v-show="!curList.length" 
 div /div 
 div 暂未合适的职位 /div 
 /li 
 li v-show="curList.length" 
 div 
 span @click="prev" 
 span /span 
 /span 
 span @click="selectPageHandler(index - 1)" v-for="index in pageLength" :key="index" : {{index}} /span 
 span @click="next" 
 span /span 
 /span 
 /div 
 /li 
 /ul 
 /article 
 /template 
 script 
import { mapState, mapGetters, mapActions, mapMutations } from 'vuex';
const PER_PAGE = 8; // 每页显示多少个
export default {
 name: 'list',
 data() {
 return {};
 computed: {
 ...mapState({
 // pageIndex: state = state.job.pageIndex,
 ...mapGetters(['filterJobList', 'pageIndex']),
 curList() {
 const { filterJobList, pageIndex } = this;
 const startIndex = pageIndex * PER_PAGE;
 const endIndex = startIndex + PER_PAGE;
 return filterJobList.slice(startIndex, endIndex);
 pageLength() {
 const { filterJobList } = this;
 if (filterJobList.length) {
 return Math.ceil(filterJobList.length / PER_PAGE);
 return 0;
 methods: {
 ...mapActions(['showAndHide']),
 // 操作 展开 隐藏
 showHandler(id) {
 this.showAndHide(id);
 selectPageHandler(pageIndex) {
 this.$mit('setState', {
 pageIndex,
 //同时关闭已经打开的职位详情页
 this.$mit('hideAllDetailMutations');
 // 上一页
 prev() {
 this.$mit('prevMutations');
 // 下一页
 next() {
 this.$mit('nextMutations', this.pageLength);
 mounted() {},
 components: {},
 /script 

store/job.js

import { unique } from 'src/assets/script/util.js';
import jobData from 'src/views/job/data.js';
// 初始状态
const state = {
 realData: [],
 searchList: [],
 regionArr: [{
 name: '上海',
 id: 1,
 name: '武汉',
 id: 2,
 // 右侧搜索,用户输入
 formData: {
 title: '', // 职位分类
 address: '', // 地区
 keywords: '', // 搜索更多职位
 pageIndex: 0, // 第 0 页
 show: false, // 申请工作的 modal
 ApplyJobPosition: '' // 申请工作的职位
// 读取数据
const getters = {
 ApplyJobPosition: state = state.ApplyJobPosition,
 show: state = state.show,
 pageIndex: state = state.pageIndex,
 regionArr: state = state.regionArr,
 searchList: state = {
 const cache = [];
 state.realData.forEach(n = {
 cache.push(n.title);
 return unique(cache);
 // 符合条件的职位
 filterJobList({ realData, formData }) {
 const { title, address, keywords } = formData;
 return (
 realData
 // 职位筛选逻辑
 .filter(item = {
 let matchAddress = true; // 地区筛选
 let matchPosition = true; // 职位筛选
 let matchKeywrod = true; // 关键字 筛选
 if (title) {
 matchPosition = item.title === title;
 if (address) {
 matchAddress = item.address === address;
 if (keywords) {
 // 模糊搜索;
 const keys = keywords
 .toUpperCase() // 转大写
 .replace(' ', '') // 删掉空格
 .split(''); // 切割成 单个字
 matchKeywrod = keys.every(key = item.position.toUpperCase().includes(key));
 return matchAddress matchPosition matchKeywrod;
// 数据改变
const mutations = {
 // 从json文件直接获取元数据
 getDataMutations(state, jobData) {
 state.realData = jobData;
 // 职位详情 显示/隐藏
 showAndHideMutations(state, id) {
 state.realData.forEach((n, i) = {
 if (id === n.id) {
 n.show = !n.show;
 // 职位详情 全部隐藏
 hideAllDetailMutations(state) {
 state.realData.forEach((n, i) = {
 n.show = false;
 setState(state, payload = {}) {
 // console.log('payload', payload);
 Object.entries(payload).forEach(([key, value]) = {
 state[key] = value;
 // prev
 prevMutations(state, payload = {}) {
 if (!state.pageIndex) {
 return;
 state.pageIndex--
 // next
 nextMutations(state, payload = {}) {
 // (state.pageIndex, payload)
 if (state.pageIndex payload - 1) {
 state.pageIndex++
 // open modal
 openApplyJobModal(state, payload = {}) {
 state.show = true
 state.ApplyJobPosition = payload
 //close modal
 closeApplyJobModal(state) {
 state.show = false
// 逻辑响应
const actions = {
 getData({ commit }) {
 commit('getDataMutations', jobData);
 // 显示 隐藏
 showAndHide({ commit }, id) {
 commit('showAndHideMutations', id);
export default {
 state,
 getters,
 actions,
 mutations,
};

util.js

// 数组去重
export function unique(arr) { 
 var newArr = [arr[0]]; 
 for (var i = 1; i arr.length; i++) { 
 if (newArr.indexOf(arr[i]) == -1) { newArr.push(arr[i]); }
 return newArr;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持凡科。