vue筛选框封装

这篇具有很好参考价值的文章主要介绍了vue筛选框封装。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

vue筛选框封装,element,vue2.0,windows

点击对默认查询条件之外的条件进行 增加或删除

在使用的组件或标签加入:filtrateList="filtrateList"传入条件查询数组

当前demo写在xk-page中,就以xk-page组件为例

<xk-upage
:filtrateList="filtrateList"
:queryArr="queryArr"></xk-upage>

属性

属性参数 说明 类型 可选值 默认值
filtrateList 需要筛选的查询条件 Array

//可选值说明可看xk-upage组件
{
name: '报废名称(默认)',
key: 'pointScrapName',
disabled: true,
checked: true,
type: 'input',
plaholder: '报废单名称'
}

[]

treeRef

定义ref String -

tree

computed计算属性

computed方法中属性 说明 类型 可选值 默认值

...mapGetters(['customCondition'])

获取最新的查询条件列表

Array -

[ ]

 ...mapState({
      defultCheck: (state) => state.taskManage.defultCheck
    })

 获取默认的查询条件列表 Array -

[ ]

watch监听

watch方法中属性 说明 类型 可选值 默认值

  watch: {
    customCondition: {
      deep: true,
      handler (list) {
        const newData = this.defultCheck.concat(list)
        this.$set(this, 'queryArr', [...new Set(newData)])
      }
    }
  }

customCondition方法来自计算属性所定义

Object -

-

组件原码:

<template>
  <el-popover placement="top-start" width="200" trigger="hover">
    <el-card class="box-card" shadow="never">
      <div slot="header" class="clearfix">
        <el-input
          placeholder="搜索过滤条件"
          v-model.trim="filterText"
          size="small"
        >
          <i slot="suffix" class="el-icon-search" @click="handleSearch"></i>
        </el-input>
      </div>
      <el-tree
        :ref="treeRef"
        :data="setFiltrateList"
        show-checkbox
        node-key="key"
        :default-checked-keys="defaultCheckKyes"
        :props="defaultProps"
        @check="handleCheck"
        :filter-node-method="filterNode"
        @check-change="treeNodeClick"
      >
      </el-tree>
    </el-card>
    <xk-svg-icon
      class="filtrate"
      iconClass="shaixuan1"
      slot="reference"
    ></xk-svg-icon>
  </el-popover>
</template>

<script>
import { mapMutations } from 'vuex'

export default {
  name: 'XkFiltrate',
  inject: ['headerFrom'],
  props: {
    filtrateList: {
      // 筛选列表
      type: Array,
      default: () => []
    },
    treeRef: {
      type: String,
      default: 'tree'
    }
  },
  data () {
    return {
      filterText: '',
      setFiltrateList: [],
      defaultCheckKyes: [], // 默认选中
      defaultProps: {
        children: 'children',
        label: 'name'
      }
    }
  },

  methods: {
    ...mapMutations({
      setCustomCondition: 'taskManage/CUSTOM_CONDITION'
    }),
    handleSearch () {
      console.log('点击搜索--暂时没做需求', this.filterText)
    },
    // 触发的节点数组
    handleCheck (data, checkedData) {
      // console.log('data, checkedData, =>', data, checkedData)
      this.setCustomCondition(checkedData.checkedNodes)
    },
    // 过滤节点
    filterNode (value, data) {
      if (!value) {
        return true
      }
      return data.label.indexOf(value) !== -1
    },
    treeNodeClick (item, node, self) {
      const checkedData = this.$refs[this.treeRef].getCheckedKeys()
      // 对取消选中的值进行清空
      if (checkedData.indexOf(item.key) == -1) {
        for (const key in this.headerFrom) {
          if (Object.hasOwnProperty.call(this.headerFrom, key)) {
            if (item.key == key) {
              this.headerFrom[key] = null
            }
          }
        }
      }
    }
  },
  watch: {
    filtrateList: {
      immediate: true,
      handler (list) {
        if (list.length > 0) {
          const allList = list.map((items) => {
            const index =
              items.name.lastIndexOf('(') || items.name.lastIndexOf('(')
            return {
              ...items,
              name: index < 0 ? items.name : items.name.substring(0, index),
              label: items.name,
              value: items.key
            }
          })
          this.setFiltrateList = allList
          // 过滤默认选中的key
          for (const i in this.setFiltrateList) {
            if (this.setFiltrateList[i].checked) {
              this.defaultCheckKyes.push(this.setFiltrateList[i].key)
            }
          }
        }
      }
    },
    // input文本过滤触发
    filterText (val) {
      this.$refs[this.treeRef].filter(val)
    }
  }
}
</script>

<style scoped lang="scss">
.filtrate {
  cursor: pointer;
}
.box-card {
  border: none;
  .el-card__body {
    padding: 0;
  }
}
.clearfix {
  ::v-deep .el-input__suffix {
    display: flex;
    align-items: center;
    cursor: pointer;
  }
}
</style>

 vuex:这里采用的是模块化,需求的百度了解下

const state = {
  customCondition: [], // 自定义条件数据
  defultCheck: [] // 默认选中数据
}

const mutations = {
  CUSTOM_CONDITION: (state, list) => {
    // 默认选中的数数
    state.defultCheck = list.filter((item) => item.checked)
    state.customCondition = list.filter((item) => !item.checked)
  }
}

const actions = {
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

demo:

注:

filtrateList定义的数组内容来自table列,具体根据需求,属性要根据xk-form查询条件类型入参才能完整显示文章来源地址https://www.toymoban.com/news/detail-543350.html

 <xk-upage
      :filtrateList="filtrateList"
      :queryArr="queryArr"
  ></xk-upage>

<script>
import { mapGetters, mapState } from 'vuex'
export default {
  name: 'example',
  data () {
    return {
      dialogShow: false,
      queryArr: [
        {
          type: 'input',
          key: 'pointScrapName',
          name: '报废名称',
          plaholder: '报废单名称'
        },
        {
          type: 'select',
          key: 'registerUserId',
          name: '选择人员',
          plaholder: '选择人员',
          options: []
        },
        {
          type: 'select',
          key: 'state',
          plaholder: '状态',
          name: '状态',
          options: [
            { label: '待审核', value: '待审核' },
            { label: '已通过', value: '已通过' }
          ]
        }
      ],
    
      tableHeader: [
        {
          label: '标准名称',
          prop: 'pointScrapNo',
          type: 'link',
          emit: 'handleLink'
        },
        { label: '标准编号', prop: 'pointScrapName' },
        {
          label: '创建时间',
          prop: 'registerUserName'
        },
        { label: '备注', prop: 'createTime' },
        {
          label: '状态',
          prop: 'switch',
          type: 'state' // disabled: false
        },
        {
          label: '操作',
          type: 'operator',
          btn: [
            { name: '编辑', show: true, emit: 'examine' },
            { name: '删除', show: true, emit: 'audit' }
          ]
        }
      ],
      tableData: [
        ],
      // 自定义查询列表
      filtrateList: [
        {
          name: '报废名称(默认)',
          key: 'pointScrapName',
          disabled: true,
          checked: true,
          type: 'input',
          plaholder: '报废单名称'
        },
        {
          key: 'registerUserId',
          name: '选择人员(默认)',
          plaholder: '选择人员',
          disabled: true,
          checked: true,
          type: 'select',
          options: []
        },
        {
          type: 'select',
          key: 'state',
          plaholder: '状态',
          name: '状态(默认)',
          options: [
            { label: '待审核', value: '待审核' },
            { label: '已通过', value: '已通过' }
          ],
          disabled: true,
          checked: true
        },
        {
          name: '标准名称',
          key: 'bznc',
          plaholder: '请输入标准名称',
          type: 'input'
        },
        {
          name: '标准编号',
          key: 'bcbh',
          plaholder: '请输入标准编号',
          type: 'input'
        },
        {
          name: '创建时间',
          key: 'cjsj',
          plaholder: '请输入标准编号',
          type: 'time'
        },
        {
          name: '备注',
          key: 'bz',
          plaholder: '请输入标准编号',
          type: 'input'
        }
      ],
      copyArr: null
    }
  },
  computed: {
    ...mapGetters(['customCondition']), // 获取最新的查询条件
    ...mapState({
      defultCheck: (state) => state.taskManage.defultCheck // 获取默认的查询条件
    })
  },
  watch: {
    customCondition: {
      deep: true,
      handler (list) {
        const newData = this.defultCheck.concat(list)
        this.$set(this, 'queryArr', [...new Set(newData)])
      }
    }
  }
}
</script>

到了这里,关于vue筛选框封装的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue2+Element-UI的el-steps封装与修改样式

     

    2024年02月14日
    浏览(45)
  • 前端歌谣-第伍拾陆课-vue2-element组件封装el-button-groups(续)

    我是歌谣 今天继续给大家带来el-button-groups(项目的讲解

    2024年02月03日
    浏览(40)
  • Vue2自己封装的基础组件库或基于Element-ui再次封装的基础组件库,如何发布到npm并使用(支持全局或按需引入使用),超详细

    以下我以 wocwin-admin-vue2 项目为例 修改目录结构,最终如下 1、导入组件,组件必须声明 name 2、定义 install 方法,接收 Vue 作为参数。如果使用 use 注册插件,则所有的组件都将被注册 3、导出的对象必须具有 install,才能被 Vue.use() 方法安装(全局使用) 4、按需引入 5、packa

    2024年02月08日
    浏览(79)
  • vue筛选框封装

    点击对默认查询条件之外的条件进行 增加或删除 在使用的组件或标签加入:filtrateList=\\\"filtrateList\\\"传入条件查询数组 当前demo写在xk-page中,就以xk-page组件为例 xk-upage :filtrateList=\\\"filtrateList\\\" :queryArr=\\\"queryArr\\\"/xk-upage 属性参数 说明 类型 可选值 默认值 filtrateList 需要筛选的查询条件

    2024年02月13日
    浏览(24)
  • vue2 - 详细介绍element UI中在el-select嵌套el-tree树形控件实现下拉选择树型结构数据的效果实例(组件封装)

    在项目上常用使用到 el-select 和 el-tree 组合实现,记录下两者结合的实现过程。(代码以及注释清晰明了,代码直接使用即可) 要求根据项目接口提供的数据,el-tree 里的数据是一次性返回来的,点击最后一层级时,请求接口,在点击层级下方追加数据追加的数据要显示勾

    2024年04月15日
    浏览(64)
  • vue+element ui 表格添加多个搜索条件筛选(前端查询)

    filterList 为筛选后的数据,可以重新给tableData赋值,赋值后如果遇到表格数据不刷新的情况,可以给table加上一个随机的key。这样可以解决重新赋值页面不刷新的情况。

    2024年02月16日
    浏览(38)
  • vue2自定义封装图片预览组件

    前言:预览图片现在已经有成熟的组件了,比如element ui的图片预览功能,但是现实开发过程中,element ui图片预览已经不满足需求了,比如涉及预览时删除图片以及下载图片 自定义封装图片预览组件 功能:滚轮滚动图片放大、还原图片、左旋转、右旋转、上一张、下一张、删

    2024年01月18日
    浏览(59)
  • vue2 封装 webSocket 开箱即用

    第一步:    下载 webSocket  第二步:   需要在 main.js 中 引入  第三步:     封装相关的连接和断开    相关代码!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  第四步:  引入使用 到这步接收信息已经OK了(记得和后端配合)    使用

    2024年02月14日
    浏览(38)
  • Vue+Element Ui实现el-table自定义表头下拉选择表头筛选

    用vue+element ui开发管理系统时,使用el-table做表格,当表格列过多的时候,想要做成可选表头的,实现表格列的筛选显示,效果如下: 代码文件结构: 废话不多说,直接上代码: 第一步:新建名为 TableHeaderRender.vue 的文件 template   el-popover     placement=\\\"bottom\\\"     width=\\\"2

    2024年02月02日
    浏览(61)
  • Vue2封装自定义全局Loading组件

    前言 在开发的过程中,点击提交按钮,或者是一些其它场景总会遇到Loading加载框,PC的一些UI库也没有这样的加载框,无法满足业务需求,因此可以自己自定义一个,实现过程如下。 效果图 如何封装? 第1步:创建要封装成全局组件的文件 第2步:注册组件 Loading这类的通用

    2024年02月15日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包