Cascader add transfer prop

This commit is contained in:
梁灏 2017-07-20 16:00:03 +08:00
parent ecaf8d51e0
commit a9cd43b39c
5 changed files with 99 additions and 13 deletions

View file

@ -1,5 +1,14 @@
<template> <template>
<Cascader v-model="value3" :data="data" filterable></Cascader> <div style="width: 400px;">
<Row>
<i-col span="12">
<Cascader transfer v-model="value3" :data="data" filterable></Cascader>
</i-col>
<i-col span="12">
<Cascader v-model="value3" :data="data" filterable></Cascader>
</i-col>
</Row>
</div>
</template> </template>
<script> <script>
export default { export default {

View file

@ -5,10 +5,11 @@
<Modal v-model="showModal" title="弹窗"> <Modal v-model="showModal" title="弹窗">
<Tabs> <Tabs>
<Tab-pane label="演示" style="height: 80px;"> <Tab-pane label="演示" style="height: 80px;">
<Date-picker transfer type="daterange" placement="bottom-end" placeholder="选择日期" style="width: 200px"></Date-picker> <!--<Date-picker transfer type="daterange" placement="bottom-end" placeholder="选择日期" style="width: 200px"></Date-picker>-->
<i-select transfer multiple v-model="m1"> <!--<i-select transfer multiple v-model="m1">-->
<i-option v-for="item in options" :value="item.value" :key="item.value">{{ item.label }}</i-option> <!--<i-option v-for="item in options" :value="item.value" :key="item.value">{{ item.label }}</i-option>-->
</i-select> <!--</i-select>-->
<Cascader transfer :data="data4" :load-data="loadData"></Cascader>
</Tab-pane> </Tab-pane>
</Tabs> </Tabs>
</Modal> </Modal>
@ -51,6 +52,20 @@
value: 'chongqing', value: 'chongqing',
label: '重庆市' label: '重庆市'
} }
],
data4: [
{
value: 'beijing',
label: '北京',
children: [],
loading: false
},
{
value: 'hangzhou',
label: '杭州',
children: [],
loading:false
}
] ]
} }
}, },
@ -74,6 +89,40 @@
this.$refs["formSelect"].clearSingleSelect(); this.$refs["formSelect"].clearSingleSelect();
this.options = []; this.options = [];
// }, 300) // }, 300)
},
loadData (item, callback) {
item.loading = true;
setTimeout(() => {
if (item.value === 'beijing') {
item.children = [
{
value: 'talkingdata',
label: 'TalkingData'
},
{
value: 'baidu',
label: '百度'
},
{
value: 'sina',
label: '新浪'
}
];
} else if (item.value === 'hangzhou') {
item.children = [
{
value: 'ali',
label: '阿里巴巴'
},
{
value: '163',
label: '网易'
}
];
}
item.loading = false;
callback();
}, 1000);
} }
} }
} }

View file

@ -3,7 +3,7 @@
<Poptip trigger="hover" title="提示标题" content="提示内容"> <Poptip trigger="hover" title="提示标题" content="提示内容">
<Button>hover 激活</Button> <Button>hover 激活</Button>
</Poptip> </Poptip>
<Poptip title="提示标题" content="提示内容"> <Poptip transfer title="提示标题" content="提示内容">
<Button>click 激活</Button> <Button>click 激活</Button>
</Poptip> </Poptip>
<Poptip trigger="focus" title="提示标题" content="提示内容"> <Poptip trigger="focus" title="提示标题" content="提示内容">

View file

@ -1,6 +1,6 @@
<template> <template>
<div :class="classes" v-clickoutside="handleClose"> <div :class="classes" v-clickoutside="handleClose">
<div :class="[prefixCls + '-rel']" @click="toggleOpen"> <div :class="[prefixCls + '-rel']" @click="toggleOpen" ref="reference">
<slot> <slot>
<i-input <i-input
ref="input" ref="input"
@ -19,7 +19,12 @@
</slot> </slot>
</div> </div>
<transition name="slide-up"> <transition name="slide-up">
<Drop v-show="visible"> <Drop
v-show="visible"
:class="{ [prefixCls + '-transfer']: transfer }"
ref="drop"
:data-transfer="transfer"
v-transfer-dom>
<div> <div>
<Caspanel <Caspanel
v-show="!filterable || (filterable && query === '')" v-show="!filterable || (filterable && query === '')"
@ -51,6 +56,7 @@
import Icon from '../icon/icon.vue'; import Icon from '../icon/icon.vue';
import Caspanel from './caspanel.vue'; import Caspanel from './caspanel.vue';
import clickoutside from '../../directives/clickoutside'; import clickoutside from '../../directives/clickoutside';
import TransferDom from '../../directives/transfer-dom';
import { oneOf } from '../../utils/assist'; import { oneOf } from '../../utils/assist';
import Emitter from '../../mixins/emitter'; import Emitter from '../../mixins/emitter';
import Locale from '../../mixins/locale'; import Locale from '../../mixins/locale';
@ -62,7 +68,7 @@
name: 'Cascader', name: 'Cascader',
mixins: [ Emitter, Locale ], mixins: [ Emitter, Locale ],
components: { iInput, Drop, Icon, Caspanel }, components: { iInput, Drop, Icon, Caspanel },
directives: { clickoutside }, directives: { clickoutside, TransferDom },
props: { props: {
data: { data: {
type: Array, type: Array,
@ -117,6 +123,10 @@
}, },
notFoundText: { notFoundText: {
type: String type: String
},
transfer: {
type: Boolean,
default: false
} }
}, },
data () { data () {
@ -333,11 +343,17 @@
if (this.currentValue.length) { if (this.currentValue.length) {
this.updateSelected(); this.updateSelected();
} }
if (this.transfer) {
this.$refs.drop.update();
}
} else { } else {
if (this.filterable) { if (this.filterable) {
this.query = ''; this.query = '';
this.$refs.input.currentValue = ''; this.$refs.input.currentValue = '';
} }
if (this.transfer) {
this.$refs.drop.destroy();
}
} }
this.$emit('on-visible-change', val); this.$emit('on-visible-change', val);
}, },

View file

@ -1,6 +1,13 @@
@cascader-prefix-cls: ~"@{css-prefix}cascader"; @cascader-prefix-cls: ~"@{css-prefix}cascader";
@cascader-item-prefix-cls: ~"@{css-prefix}cascader-menu-item"; @cascader-item-prefix-cls: ~"@{css-prefix}cascader-menu-item";
.selectDropDown{
width: auto;
padding: 0;
white-space: nowrap;
overflow: visible;
}
.@{cascader-prefix-cls} { .@{cascader-prefix-cls} {
//position: relative; //position: relative;
line-height: normal; line-height: normal;
@ -64,10 +71,7 @@
} }
.@{select-dropdown-prefix-cls} { .@{select-dropdown-prefix-cls} {
width: auto; .selectDropDown();
padding: 0;
white-space: nowrap;
overflow: visible;
} }
.select-item(@cascader-prefix-cls, @cascader-item-prefix-cls); .select-item(@cascader-prefix-cls, @cascader-item-prefix-cls);
@ -138,6 +142,14 @@
} }
} }
} }
.@{cascader-prefix-cls}-transfer{
z-index: @zindex-transfer;
.selectDropDown();
.select-item(@cascader-prefix-cls, @cascader-item-prefix-cls);
.ivu-select-item span{
color: @error-color;
}
}
.@{form-item-prefix-cls}-error{ .@{form-item-prefix-cls}-error{
.@{cascader-prefix-cls} { .@{cascader-prefix-cls} {