|
|
@@ -1,201 +1,221 @@
|
|
|
-<template>
|
|
|
-
|
|
|
- <a-select
|
|
|
- v-if="async"
|
|
|
- showSearch
|
|
|
- labelInValue
|
|
|
- :disabled="disabled"
|
|
|
- :getPopupContainer="(node) => node.parentNode"
|
|
|
- @search="loadData"
|
|
|
- :placeholder="placeholder"
|
|
|
- v-model="selectedAsyncValue"
|
|
|
- style="width: 100%"
|
|
|
- :filterOption="false"
|
|
|
- @change="handleAsyncChange"
|
|
|
- allowClear
|
|
|
- :notFoundContent="loading ? undefined : null"
|
|
|
- >
|
|
|
- <a-spin v-if="loading" slot="notFoundContent" size="small"/>
|
|
|
- <a-select-option v-for="d in options" :key="d.value" :value="d.value">{{ d.text }}</a-select-option>
|
|
|
- </a-select>
|
|
|
-
|
|
|
- <a-select
|
|
|
- v-else
|
|
|
- :getPopupContainer="(node) => node.parentNode"
|
|
|
- showSearch
|
|
|
- :disabled="disabled"
|
|
|
- :placeholder="placeholder"
|
|
|
- optionFilterProp="children"
|
|
|
- style="width: 100%"
|
|
|
- @change="handleChange"
|
|
|
- :filterOption="filterOption"
|
|
|
- v-model="selectedValue"
|
|
|
- allowClear
|
|
|
- :notFoundContent="loading ? undefined : null">
|
|
|
- <a-spin v-if="loading" slot="notFoundContent" size="small"/>
|
|
|
- <a-select-option v-for="d in options" :key="d.value" :value="d.value">{{ d.text }}</a-select-option>
|
|
|
- </a-select>
|
|
|
-
|
|
|
-</template>
|
|
|
-
|
|
|
-<script>
|
|
|
- import { ajaxGetDictItems,getDictItemsFromCache } from '@/api/api'
|
|
|
- import debounce from 'lodash/debounce';
|
|
|
- import { getAction } from '../../api/manage'
|
|
|
-
|
|
|
- export default {
|
|
|
- name: 'JSearchSelectTag',
|
|
|
- props:{
|
|
|
- disabled: Boolean,
|
|
|
- value: [String, Number],
|
|
|
- dict: String,
|
|
|
- dictOptions: Array,
|
|
|
- async: Boolean,
|
|
|
- placeholder:{
|
|
|
- type:String,
|
|
|
- default:"请选择",
|
|
|
- required:false
|
|
|
- }
|
|
|
- },
|
|
|
- data(){
|
|
|
- this.loadData = debounce(this.loadData, 800);//消抖
|
|
|
- this.lastLoad = 0;
|
|
|
- return {
|
|
|
- loading:false,
|
|
|
- selectedValue:[],
|
|
|
- selectedAsyncValue:[],
|
|
|
- options: [],
|
|
|
- }
|
|
|
- },
|
|
|
- created(){
|
|
|
- this.initDictData();
|
|
|
- },
|
|
|
- watch:{
|
|
|
- "value":{
|
|
|
- immediate:true,
|
|
|
- handler(val){
|
|
|
- if(!val){
|
|
|
- if(val==0){
|
|
|
- this.initSelectValue()
|
|
|
- }else{
|
|
|
- this.selectedValue=[]
|
|
|
- this.selectedAsyncValue=[]
|
|
|
- }
|
|
|
- }else{
|
|
|
- this.initSelectValue()
|
|
|
- }
|
|
|
- }
|
|
|
- },
|
|
|
- "dict":{
|
|
|
- handler(){
|
|
|
- this.initDictData()
|
|
|
- }
|
|
|
- }
|
|
|
- },
|
|
|
- methods:{
|
|
|
- initSelectValue(){
|
|
|
- if(this.async){
|
|
|
- if(!this.selectedAsyncValue || !this.selectedAsyncValue.key || this.selectedAsyncValue.key!=this.value){
|
|
|
- console.log("这才请求后台")
|
|
|
- getAction(`/sys/dict/loadDictItem/${this.dict}`,{key:this.value}).then(res=>{
|
|
|
- if(res.success){
|
|
|
- let obj = {
|
|
|
- key:this.value,
|
|
|
- label:res.result
|
|
|
- }
|
|
|
- this.selectedAsyncValue = {...obj}
|
|
|
- }
|
|
|
- })
|
|
|
- }
|
|
|
- }else{
|
|
|
- this.selectedValue = this.value.toString()
|
|
|
- }
|
|
|
- },
|
|
|
- loadData(value){
|
|
|
- console.log("数据加载",value)
|
|
|
- this.lastLoad +=1
|
|
|
- const currentLoad = this.lastLoad
|
|
|
- this.options = []
|
|
|
- this.loading=true
|
|
|
- // 字典code格式:table,text,code
|
|
|
- getAction(`/sys/dict/loadDict/${this.dict}`,{keyword:value}).then(res=>{
|
|
|
- this.loading=false
|
|
|
- if(res.success){
|
|
|
- if(currentLoad!=this.lastLoad){
|
|
|
- return
|
|
|
- }
|
|
|
- this.options = res.result
|
|
|
- console.log("我是第一个",res)
|
|
|
- }else{
|
|
|
- this.$message.warning(res.message)
|
|
|
- }
|
|
|
-
|
|
|
- })
|
|
|
-
|
|
|
- },
|
|
|
- initDictData(){
|
|
|
- if(!this.async){
|
|
|
- //如果字典项集合有数据
|
|
|
- if(this.dictOptions && this.dictOptions.length>0){
|
|
|
- this.options = [...this.dictOptions]
|
|
|
- }else{
|
|
|
- //根据字典Code, 初始化字典数组
|
|
|
- let dictStr = ''
|
|
|
- if(this.dict){
|
|
|
- let arr = this.dict.split(',')
|
|
|
- if(arr[0].indexOf('where')>0){
|
|
|
- let tbInfo = arr[0].split('where')
|
|
|
- dictStr = tbInfo[0].trim()+','+arr[1]+','+arr[2]+','+encodeURIComponent(tbInfo[1])
|
|
|
- }else{
|
|
|
- dictStr = this.dict
|
|
|
- }
|
|
|
- if (this.dict.indexOf(",") == -1) {
|
|
|
- //优先从缓存中读取字典配置
|
|
|
- if (getDictItemsFromCache(this.dictCode)) {
|
|
|
- this.options = getDictItemsFromCache(this.dictCode);
|
|
|
- return
|
|
|
- }
|
|
|
- }
|
|
|
- ajaxGetDictItems(dictStr, null).then((res) => {
|
|
|
- if (res.success) {
|
|
|
- this.options = res.result;
|
|
|
- }
|
|
|
- })
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- },
|
|
|
- filterOption(input, option) {
|
|
|
- return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
|
|
|
- },
|
|
|
- handleChange (selectedValue) {
|
|
|
- console.log("selectedValue",selectedValue)
|
|
|
- this.selectedValue = selectedValue
|
|
|
- this.callback()
|
|
|
- },
|
|
|
- handleAsyncChange(selectedObj){
|
|
|
- this.selectedAsyncValue = selectedObj
|
|
|
- this.selectedValue = selectedObj.key
|
|
|
- this.callback()
|
|
|
- },
|
|
|
- callback(){
|
|
|
- this.$emit('change', this.selectedValue);
|
|
|
- },
|
|
|
- setCurrentDictOptions(dictOptions){
|
|
|
- this.options = dictOptions
|
|
|
- },
|
|
|
- getCurrentDictOptions(){
|
|
|
- return this.options
|
|
|
- }
|
|
|
-
|
|
|
- },
|
|
|
- model: {
|
|
|
- prop: 'value',
|
|
|
- event: 'change'
|
|
|
- }
|
|
|
- }
|
|
|
-</script>
|
|
|
-
|
|
|
-<style scoped>
|
|
|
-
|
|
|
+<template>
|
|
|
+
|
|
|
+ <a-select
|
|
|
+ v-if="async"
|
|
|
+ showSearch
|
|
|
+ labelInValue
|
|
|
+ :disabled="disabled"
|
|
|
+ :getPopupContainer="getPopupContainer"
|
|
|
+ @search="loadData"
|
|
|
+ :placeholder="placeholder"
|
|
|
+ v-model="selectedAsyncValue"
|
|
|
+ style="width: 100%"
|
|
|
+ :filterOption="false"
|
|
|
+ @change="handleAsyncChange"
|
|
|
+ allowClear
|
|
|
+ :notFoundContent="loading ? undefined : null"
|
|
|
+ >
|
|
|
+ <a-spin v-if="loading" slot="notFoundContent" size="small"/>
|
|
|
+ <a-select-option :value="undefined">请选择</a-select-option>
|
|
|
+ <a-select-option v-for="d in options" :key="d.value" :value="d.value" v-if="deleteValue.indexOf(d.value) == -1">{{ d.text || d.label }}</a-select-option>
|
|
|
+ </a-select>
|
|
|
+
|
|
|
+ <a-select
|
|
|
+ v-else
|
|
|
+ :getPopupContainer="getPopupContainer"
|
|
|
+ showSearch
|
|
|
+ :disabled="disabled"
|
|
|
+ :placeholder="placeholder"
|
|
|
+ optionFilterProp="children"
|
|
|
+ style="width: 100%"
|
|
|
+ @change="handleChange"
|
|
|
+ :filterOption="filterOption"
|
|
|
+ v-model="selectedValue"
|
|
|
+ allowClear
|
|
|
+ :notFoundContent="loading ? undefined : null">
|
|
|
+ <a-spin v-if="loading" slot="notFoundContent" size="small"/>
|
|
|
+ <a-select-option :value="undefined">请选择</a-select-option>
|
|
|
+ <a-select-option v-for="d in options" :key="d.value" :value="d.value" v-if="deleteValue.indexOf(d.value) == -1">{{ d.text || d.label }}</a-select-option>
|
|
|
+ </a-select>
|
|
|
+
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+ import { ajaxGetDictItems,getDictItemsFromCache } from '@/api/api'
|
|
|
+ import debounce from 'lodash/debounce';
|
|
|
+ import { getAction } from '../../api/manage'
|
|
|
+
|
|
|
+ export default {
|
|
|
+ name: 'JSearchSelectTag',
|
|
|
+ props:{
|
|
|
+ disabled: Boolean,
|
|
|
+ value: [String, Number],
|
|
|
+ dict: String,
|
|
|
+ dictCode: String,
|
|
|
+ dictOptions: Array,
|
|
|
+ async: Boolean,
|
|
|
+ placeholder:{
|
|
|
+ type:String,
|
|
|
+ default:"请选择",
|
|
|
+ required:false
|
|
|
+ },
|
|
|
+ getPopupContainer:{
|
|
|
+ type: Function,
|
|
|
+ default: (node) => node.parentNode
|
|
|
+ },
|
|
|
+ deleteValue:{
|
|
|
+ type: Array,
|
|
|
+ // 对象或数组默认值必须从一个工厂函数获取
|
|
|
+ default: function () {
|
|
|
+ return [];
|
|
|
+ },
|
|
|
+ }
|
|
|
+ },
|
|
|
+ data(){
|
|
|
+ this.loadData = debounce(this.loadData, 800);//消抖
|
|
|
+ this.lastLoad = 0;
|
|
|
+ return {
|
|
|
+ loading:false,
|
|
|
+ selectedValue:[],
|
|
|
+ selectedAsyncValue:[],
|
|
|
+ options: [],
|
|
|
+ }
|
|
|
+ },
|
|
|
+ created(){
|
|
|
+ this.initDictData();
|
|
|
+ },
|
|
|
+ watch:{
|
|
|
+ "value":{
|
|
|
+ immediate:true,
|
|
|
+ handler(val){
|
|
|
+ if(!val){
|
|
|
+ if(val==0){
|
|
|
+ this.initSelectValue()
|
|
|
+ }else{
|
|
|
+ this.selectedValue=[]
|
|
|
+ this.selectedAsyncValue=[]
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ this.initSelectValue()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ "dict":{
|
|
|
+ handler(){
|
|
|
+ this.initDictData()
|
|
|
+ }
|
|
|
+ },
|
|
|
+ "dictOptions":{
|
|
|
+ handler(){
|
|
|
+ this.initDictData()
|
|
|
+ }
|
|
|
+ },
|
|
|
+ },
|
|
|
+ methods:{
|
|
|
+ initSelectValue(){
|
|
|
+ if(this.async){
|
|
|
+ if(!this.selectedAsyncValue || !this.selectedAsyncValue.key || this.selectedAsyncValue.key!=this.value){
|
|
|
+ console.log("这才请求后台")
|
|
|
+ getAction(`/sys/dict/loadDictItem/${this.dict}`,{key:this.value}).then(res=>{
|
|
|
+ if(res.success){
|
|
|
+ let obj = {
|
|
|
+ key:this.value,
|
|
|
+ label:res.result
|
|
|
+ }
|
|
|
+ this.selectedAsyncValue = {...obj}
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ this.selectedValue = this.value.toString()
|
|
|
+ }
|
|
|
+ },
|
|
|
+ loadData(value){
|
|
|
+ console.log("数据加载",value)
|
|
|
+ this.lastLoad +=1
|
|
|
+ const currentLoad = this.lastLoad
|
|
|
+ this.options = []
|
|
|
+ this.loading=true
|
|
|
+ // 字典code格式:table,text,code
|
|
|
+ getAction(`/sys/dict/loadDict/${this.dict}`,{keyword:value}).then(res=>{
|
|
|
+ this.loading=false
|
|
|
+ if(res.success){
|
|
|
+ if(currentLoad!=this.lastLoad){
|
|
|
+ return
|
|
|
+ }
|
|
|
+ this.options = res.result
|
|
|
+ console.log("我是第一个",res)
|
|
|
+ }else{
|
|
|
+ this.$message.warning(res.message)
|
|
|
+ }
|
|
|
+
|
|
|
+ })
|
|
|
+
|
|
|
+ },
|
|
|
+ initDictData(){
|
|
|
+ if(!this.async){
|
|
|
+ this.options = [];
|
|
|
+ //如果字典项集合有数据
|
|
|
+ if(this.dictOptions && this.dictOptions.length>0){
|
|
|
+ this.options = [...this.dictOptions]
|
|
|
+ }else{
|
|
|
+ //根据字典Code, 初始化字典数组
|
|
|
+ let dictStr = ''
|
|
|
+ if(this.dict){
|
|
|
+ let arr = this.dict.split(',')
|
|
|
+ if(arr[0].indexOf('where')>0){
|
|
|
+ let tbInfo = arr[0].split('where')
|
|
|
+ dictStr = tbInfo[0].trim()+','+arr[1]+','+arr[2]+','+encodeURIComponent(tbInfo[1])
|
|
|
+ }else{
|
|
|
+ dictStr = this.dict
|
|
|
+ }
|
|
|
+ if (this.dict.indexOf(",") == -1) {
|
|
|
+ //优先从缓存中读取字典配置
|
|
|
+ if (getDictItemsFromCache(this.dictCode)) {
|
|
|
+ this.options = getDictItemsFromCache(this.dictCode);
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ajaxGetDictItems(dictStr, null).then((res) => {
|
|
|
+ if (res.success) {
|
|
|
+ this.options = res.result;
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ filterOption(input, option) {
|
|
|
+ return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
|
|
|
+ },
|
|
|
+ handleChange (selectedValue) {
|
|
|
+ console.log("selectedValue",selectedValue)
|
|
|
+ this.selectedValue = selectedValue
|
|
|
+ this.callback()
|
|
|
+ },
|
|
|
+ handleAsyncChange(selectedObj){
|
|
|
+ this.selectedAsyncValue = selectedObj
|
|
|
+ this.selectedValue = selectedObj.key
|
|
|
+ this.callback()
|
|
|
+ },
|
|
|
+ callback(){
|
|
|
+ this.$emit('change', this.selectedValue);
|
|
|
+ },
|
|
|
+ setCurrentDictOptions(dictOptions){
|
|
|
+ this.options = dictOptions
|
|
|
+ },
|
|
|
+ getCurrentDictOptions(){
|
|
|
+ return this.options
|
|
|
+ }
|
|
|
+
|
|
|
+ },
|
|
|
+ model: {
|
|
|
+ prop: 'value',
|
|
|
+ event: 'change'
|
|
|
+ }
|
|
|
+ }
|
|
|
+</script>
|
|
|
+
|
|
|
+<style scoped>
|
|
|
+
|
|
|
</style>
|