!695 下拉图标选择组件优化:1.已选择图标高亮回显 2.滚动条采用el-scrollbar
Merge pull request !695 from 绿色心情/icon-select
This commit is contained in:
		
						commit
						2e99c68ed0
					
				@ -1,7 +1,7 @@
 | 
				
			|||||||
#app {
 | 
					#app {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  .main-container {
 | 
					  .main-container {
 | 
				
			||||||
    min-height: 100%;
 | 
					    height: 100%;
 | 
				
			||||||
    transition: margin-left .28s;
 | 
					    transition: margin-left .28s;
 | 
				
			||||||
    margin-left: $base-sidebar-width;
 | 
					    margin-left: $base-sidebar-width;
 | 
				
			||||||
    position: relative;
 | 
					    position: relative;
 | 
				
			||||||
 | 
				
			|||||||
@ -1,22 +1,33 @@
 | 
				
			|||||||
<!-- @author zhengjie -->
 | 
					<!-- @author zhengjie -->
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
  <div class="icon-body">
 | 
					  <div class="icon-body">
 | 
				
			||||||
    <el-input v-model="name" style="position: relative;" clearable placeholder="请输入图标名称" @clear="filterIcons" @input="filterIcons">
 | 
					    <el-input v-model="name" class="icon-search" clearable placeholder="请输入图标名称" @clear="filterIcons" @input="filterIcons">
 | 
				
			||||||
      <i slot="suffix" class="el-icon-search el-input__icon" />
 | 
					      <i slot="suffix" class="el-icon-search el-input__icon" />
 | 
				
			||||||
    </el-input>
 | 
					    </el-input>
 | 
				
			||||||
    <div class="icon-list">
 | 
					    <div class="icon-list">
 | 
				
			||||||
      <div v-for="(item, index) in iconList" :key="index" @click="selectedIcon(item)">
 | 
					      <el-scrollbar>
 | 
				
			||||||
        <svg-icon :icon-class="item" style="height: 30px;width: 16px;" />
 | 
					        <div class="list-container">
 | 
				
			||||||
        <span>{{ item }}</span>
 | 
					          <div v-for="(item, index) in iconList" class="icon-item-wrapper" :key="index" @click="selectedIcon(item)">
 | 
				
			||||||
 | 
					            <div :class="['icon-item', { active: activeIcon === item }]">
 | 
				
			||||||
 | 
					              <svg-icon :icon-class="item" class-name="icon" style="height: 30px;width: 16px;" />
 | 
				
			||||||
 | 
					              <span :title="item">{{ item }}</span>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
 | 
					      </el-scrollbar>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script>
 | 
					<script>
 | 
				
			||||||
import icons from './requireIcons'
 | 
					import icons from './requireIcons'
 | 
				
			||||||
export default {
 | 
					export default {
 | 
				
			||||||
  name: 'IconSelect',
 | 
					  name: 'IconSelect',
 | 
				
			||||||
 | 
					  props: {
 | 
				
			||||||
 | 
					    activeIcon: {
 | 
				
			||||||
 | 
					      type: String
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
  data() {
 | 
					  data() {
 | 
				
			||||||
    return {
 | 
					    return {
 | 
				
			||||||
      name: '',
 | 
					      name: '',
 | 
				
			||||||
@ -46,22 +57,55 @@ export default {
 | 
				
			|||||||
  .icon-body {
 | 
					  .icon-body {
 | 
				
			||||||
    width: 100%;
 | 
					    width: 100%;
 | 
				
			||||||
    padding: 10px;
 | 
					    padding: 10px;
 | 
				
			||||||
 | 
					    .icon-search {
 | 
				
			||||||
 | 
					      position: relative;
 | 
				
			||||||
 | 
					      margin-bottom: 5px;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    .icon-list {
 | 
					    .icon-list {
 | 
				
			||||||
      height: 200px;
 | 
					      height: 200px;
 | 
				
			||||||
      overflow-y: scroll;
 | 
					      ::v-deep .el-scrollbar {
 | 
				
			||||||
      div {
 | 
					        height: 100%;
 | 
				
			||||||
 | 
					        .el-scrollbar__wrap {
 | 
				
			||||||
 | 
					          overflow-x: hidden;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      .list-container {
 | 
				
			||||||
 | 
					        display: flex;
 | 
				
			||||||
 | 
					        flex-wrap: wrap;
 | 
				
			||||||
 | 
					        .icon-item-wrapper {
 | 
				
			||||||
 | 
					          width: calc(100% / 3);
 | 
				
			||||||
          height: 30px;
 | 
					          height: 30px;
 | 
				
			||||||
          line-height: 30px;
 | 
					          line-height: 30px;
 | 
				
			||||||
          margin-bottom: -5px;
 | 
					          margin-bottom: -5px;
 | 
				
			||||||
          cursor: pointer;
 | 
					          cursor: pointer;
 | 
				
			||||||
        width: 33%;
 | 
					          display: flex;
 | 
				
			||||||
        float: left;
 | 
					          .icon-item {
 | 
				
			||||||
 | 
					            display: flex;
 | 
				
			||||||
 | 
					            max-width: 100%;
 | 
				
			||||||
 | 
					            height: 100%;
 | 
				
			||||||
 | 
					            padding: 0 2px;
 | 
				
			||||||
 | 
					            &:hover {
 | 
				
			||||||
 | 
					              background: #ececec;
 | 
				
			||||||
 | 
					              border-radius: 5px;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            .icon {
 | 
				
			||||||
 | 
					              flex-shrink: 0;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            span {
 | 
					            span {
 | 
				
			||||||
              display: inline-block;
 | 
					              display: inline-block;
 | 
				
			||||||
              vertical-align: -0.15em;
 | 
					              vertical-align: -0.15em;
 | 
				
			||||||
              fill: currentColor;
 | 
					              fill: currentColor;
 | 
				
			||||||
 | 
					              padding-left: 2px;
 | 
				
			||||||
              overflow: hidden;
 | 
					              overflow: hidden;
 | 
				
			||||||
 | 
					              text-overflow: ellipsis;
 | 
				
			||||||
 | 
					              white-space: nowrap;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          .icon-item.active {
 | 
				
			||||||
 | 
					            background: #ececec;
 | 
				
			||||||
 | 
					            border-radius: 5px;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,9 @@
 | 
				
			|||||||
<template>
 | 
					<template>
 | 
				
			||||||
  <div :class="classObj" class="app-wrapper" :style="{'--current-color': theme}">
 | 
					  <div :class="classObj" class="app-wrapper" :style="{'--current-color': theme}">
 | 
				
			||||||
    <el-scrollbar>
 | 
					 | 
				
			||||||
      <div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside"/>
 | 
					      <div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside"/>
 | 
				
			||||||
      <sidebar v-if="!sidebar.hide" class="sidebar-container"/>
 | 
					      <sidebar v-if="!sidebar.hide" class="sidebar-container"/>
 | 
				
			||||||
      <div :class="{hasTagsView:needTagsView,sidebarHide:sidebar.hide}" class="main-container">
 | 
					      <div :class="{hasTagsView:needTagsView,sidebarHide:sidebar.hide}" class="main-container">
 | 
				
			||||||
 | 
					        <el-scrollbar>
 | 
				
			||||||
          <div :class="{'fixed-header':fixedHeader}">
 | 
					          <div :class="{'fixed-header':fixedHeader}">
 | 
				
			||||||
            <navbar/>
 | 
					            <navbar/>
 | 
				
			||||||
            <tags-view v-if="needTagsView"/>
 | 
					            <tags-view v-if="needTagsView"/>
 | 
				
			||||||
@ -12,9 +12,9 @@
 | 
				
			|||||||
          <right-panel>
 | 
					          <right-panel>
 | 
				
			||||||
            <settings/>
 | 
					            <settings/>
 | 
				
			||||||
          </right-panel>
 | 
					          </right-panel>
 | 
				
			||||||
      </div>
 | 
					 | 
				
			||||||
        </el-scrollbar>
 | 
					        </el-scrollbar>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script>
 | 
					<script>
 | 
				
			||||||
 | 
				
			|||||||
@ -134,7 +134,7 @@
 | 
				
			|||||||
                trigger="click"
 | 
					                trigger="click"
 | 
				
			||||||
                @show="$refs['iconSelect'].reset()"
 | 
					                @show="$refs['iconSelect'].reset()"
 | 
				
			||||||
              >
 | 
					              >
 | 
				
			||||||
                <IconSelect ref="iconSelect" @selected="selected" />
 | 
					                <IconSelect ref="iconSelect" @selected="selected" :active-icon="form.icon" />
 | 
				
			||||||
                <el-input slot="reference" v-model="form.icon" placeholder="点击选择图标" readonly>
 | 
					                <el-input slot="reference" v-model="form.icon" placeholder="点击选择图标" readonly>
 | 
				
			||||||
                  <svg-icon
 | 
					                  <svg-icon
 | 
				
			||||||
                    v-if="form.icon"
 | 
					                    v-if="form.icon"
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user