Files
vxe-table/examples/views/pulldown/Pulldown.vue
2020-11-08 20:20:57 +08:00

605 lines
18 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<div>
<h2>{{ $t('app.aside.nav.pulldown') }}</h2>
<p class="tip">下拉容器可以非常简单的基于下拉容器去实现各种下拉组件查看 <router-link class="link" :to="{name: 'VXEAPI', params: {name: 'pulldown'}}">API</router-link></p>
<p>
<vxe-pulldown ref="xDown1">
<template #default>
<vxe-input v-model="demo1.value1" placeholder="可搜索的下拉框" @focus="focusEvent1" @keyup="keyupEvent1"></vxe-input>
</template>
<template #dropdown>
<div class="my-dropdown1">
<div class="list-item1" v-for="item in demo1.list1" :key="item.value" @click="selectEvent1(item)">
<i class="fa fa-user-o"></i>
<span>{{ item.label }}</span>
</div>
</div>
</template>
</vxe-pulldown>
<vxe-pulldown ref="xDown2">
<template #default>
<vxe-input v-model="demo2.value2" placeholder="可搜索的大数据下拉框" @focus="focusEvent2" @keyup="keyupEvent2"></vxe-input>
</template>
<template #dropdown>
<vxe-list height="200" class="my-dropdown2" :data="demo2.list2" auto-resize>
<template #default="{ items }">
<div class="list-item2" v-for="item in items" :key="item.value" @click="selectEvent2(item)">
<i class="fa fa-envelope-o"></i>
<span>{{ item.label }}</span>
</div>
</template>
</vxe-list>
</template>
</vxe-pulldown>
<vxe-pulldown ref="xDown3" destroy-on-close>
<template #default>
<vxe-button icon="fa fa-table" @click="clickEvent3">切换下拉表格</vxe-button>
</template>
<template #dropdown>
<div class="my-dropdown3">
<vxe-table
auto-resize
:data="demo3.tableData3">
<vxe-table-column field="name" title="Name"></vxe-table-column>
<vxe-table-column field="role" title="Role"></vxe-table-column>
<vxe-table-column field="sex" title="Sex"></vxe-table-column>
</vxe-table>
</div>
</template>
</vxe-pulldown>
<vxe-pulldown ref="xDown4" transfer>
<template #default>
<vxe-input v-model="demo4.value4" suffix-icon="fa fa-search" placeholder="实现下拉分页表格" @keyup="keyupEvent4" @focus="focusEvent4" @suffix-click="suffixClick4"></vxe-input>
</template>
<template #dropdown>
<div class="my-dropdown4">
<vxe-grid
highlight-hover-row
auto-resize
height="auto"
:loading="demo4.loading4"
:pager-config="demo4.tablePage4"
:data="demo4.tableData4"
:columns="demo4.tableColumn4"
@cell-click="cellClickEvent4">
</vxe-grid>
</div>
</template>
</vxe-pulldown>
</p>
<p class="demo-code">{{ $t('app.body.button.showCode') }}</p>
<pre>
<pre-code class="html">{{ demoCodes[0] }}</pre-code>
<pre-code class="javascript">{{ demoCodes[1] }}</pre-code>
<pre-code class="css">{{ demoCodes[2] }}</pre-code>
</pre>
</div>
</template>
<script lang="ts">
import { defineComponent, onMounted, reactive, ref, Ref } from 'vue'
import { VxePulldownInstance, VxeGridEvents } from '../../../types/vxe-table'
interface ItemVO1 {
label: string;
vlue: string;
}
interface ItemVO2 {
label: string;
vlue: string;
}
export default defineComponent({
setup () {
const data1: ItemVO1[] = [
{ label: '选项1', vlue: '1' },
{ label: '选项2', vlue: '2' },
{ label: '选项3', vlue: '3' },
{ label: '选项4', vlue: '4' },
{ label: '选项5', vlue: '5' },
{ label: '选项6', vlue: '6' },
{ label: '选项7', vlue: '7' },
{ label: '选项8', vlue: '8' },
{ label: '选项9', vlue: '9' },
{ label: '选项10', vlue: '10' },
{ label: '选项11', vlue: '11' },
{ label: '选项12', vlue: '12' }
]
const demo1 = reactive({
value1: '',
list1: data1
})
const xDown1 = ref() as Ref<VxePulldownInstance>
const focusEvent1 = () => {
const $pulldown1 = xDown1.value
$pulldown1.showPanel()
}
const keyupEvent1 = () => {
demo1.list1 = demo1.value1 ? data1.filter((item) => item.label.indexOf(demo1.value1) > -1) : data1
}
const selectEvent1 = (item: ItemVO1) => {
const $pulldown1 = xDown1.value
demo1.value1 = item.label
$pulldown1.hidePanel().then(() => {
demo1.list1 = data1
})
}
const data2: ItemVO2[] = [
{ label: '选项1', vlue: '1' },
{ label: '选项2', vlue: '2' },
{ label: '选项3', vlue: '3' },
{ label: '选项4', vlue: '4' },
{ label: '选项5', vlue: '5' },
{ label: '选项6', vlue: '6' },
{ label: '选项7', vlue: '7' },
{ label: '选项8', vlue: '8' },
{ label: '选项9', vlue: '9' },
{ label: '选项10', vlue: '10' },
{ label: '选项11', vlue: '11' },
{ label: '选项12', vlue: '12' }
]
const demo2 = reactive({
value2: '',
list2: data2
})
const xDown2 = ref() as Ref<VxePulldownInstance>
const focusEvent2 = () => {
const $pulldown2 = xDown2.value
$pulldown2.showPanel()
}
const keyupEvent2 = () => {
demo2.list2 = demo2.value2 ? data2.filter((item) => item.label.indexOf(demo2.value2) > -1) : data2
}
const selectEvent2 = (item: ItemVO2) => {
const $pulldown2 = xDown2.value
demo2.value2 = item.label
$pulldown2.hidePanel().then(() => {
demo2.list2 = data2
})
}
const demo3 = reactive({
tableData3: [
{ name: 'Test1', role: '前端', sex: '男' },
{ name: 'Test2', role: '后端', sex: '男' },
{ name: 'Test3', role: '测试', sex: '男' },
{ name: 'Test4', role: '设计师', sex: '女' }
]
})
const xDown3 = ref() as Ref<VxePulldownInstance>
const clickEvent3 = () => {
const $pulldown3 = xDown3.value
$pulldown3.togglePanel()
}
const demo4 = reactive({
value4: '',
tableColumn4: [
{ field: 'name', title: 'Name' },
{ field: 'role', title: 'Role' },
{ field: 'sex', title: 'Sex' }
],
loading4: false,
tableData4: [] as any[],
tableList4: [
{ name: 'Test1', role: '前端', sex: '男' },
{ name: 'Test2', role: '后端', sex: '男' },
{ name: 'Test3', role: '测试', sex: '男' },
{ name: 'Test4', role: '设计师', sex: '女' },
{ name: 'Test5', role: '前端', sex: '男' },
{ name: 'Test6', role: '前端', sex: '男' },
{ name: 'Test7', role: '前端', sex: '男' }
],
tablePage4: {
total: 0,
currentPage: 1,
pageSize: 10
}
})
const xDown4 = ref() as Ref<VxePulldownInstance>
const focusEvent4 = () => {
const $pulldown4 = xDown4.value
$pulldown4.showPanel()
}
const keyupEvent4 = () => {
demo4.loading4 = true
setTimeout(() => {
demo4.loading4 = false
if (demo4.value4) {
demo4.tableData4 = demo4.tableList4.filter((row) => row.name.indexOf(demo4.value4) > -1)
} else {
demo4.tableData4 = demo4.tableList4.slice(0)
}
}, 100)
}
const suffixClick4 = () => {
const $pulldown4 = xDown4.value
$pulldown4.togglePanel()
}
const cellClickEvent4: VxeGridEvents.CellClick = ({ row }) => {
const $pulldown4 = xDown4.value
demo4.value4 = row.name
$pulldown4.hidePanel()
}
onMounted(() => {
keyupEvent4()
})
return {
demo1,
xDown1,
focusEvent1,
keyupEvent1,
selectEvent1,
demo2,
xDown2,
focusEvent2,
keyupEvent2,
selectEvent2,
demo3,
xDown3,
clickEvent3,
demo4,
xDown4,
focusEvent4,
keyupEvent4,
suffixClick4,
cellClickEvent4,
demoCodes: [
`
<p>
<vxe-pulldown ref="xDown1">
<template #default>
<vxe-input v-model="demo1.value1" placeholder="可搜索的下拉框" @focus="focusEvent1" @keyup="keyupEvent1"></vxe-input>
</template>
<template #dropdown>
<div class="my-dropdown1">
<div class="list-item1" v-for="item in demo1.list1" :key="item.value" @click="selectEvent1(item)">
<i class="fa fa-user-o"></i>
<span>{{ item.label }}</span>
</div>
</div>
</template>
</vxe-pulldown>
<vxe-pulldown ref="xDown2">
<template #default>
<vxe-input v-model="demo2.value2" placeholder="可搜索的大数据下拉框" @focus="focusEvent2" @keyup="keyupEvent2"></vxe-input>
</template>
<template #dropdown>
<vxe-list height="200" class="my-dropdown2" :data="demo2.list2" auto-resize>
<template #default="{ items }">
<div class="list-item2" v-for="item in items" :key="item.value" @click="selectEvent2(item)">
<i class="fa fa-envelope-o"></i>
<span>{{ item.label }}</span>
</div>
</template>
</vxe-list>
</template>
</vxe-pulldown>
<vxe-pulldown ref="xDown3" destroy-on-close>
<template #default>
<vxe-button icon="fa fa-table" @click="clickEvent3">切换下拉表格</vxe-button>
</template>
<template #dropdown>
<div class="my-dropdown3">
<vxe-table
auto-resize
:data="demo3.tableData3">
<vxe-table-column field="name" title="Name"></vxe-table-column>
<vxe-table-column field="role" title="Role"></vxe-table-column>
<vxe-table-column field="sex" title="Sex"></vxe-table-column>
</vxe-table>
</div>
</template>
</vxe-pulldown>
<vxe-pulldown ref="xDown4" transfer>
<template #default>
<vxe-input v-model="demo4.value4" suffix-icon="fa fa-search" placeholder="实现下拉分页表格" @keyup="keyupEvent4" @focus="focusEvent4" @suffix-click="suffixClick4"></vxe-input>
</template>
<template #dropdown>
<div class="my-dropdown4">
<vxe-grid
highlight-hover-row
auto-resize
height="auto"
:loading="demo4.loading4"
:pager-config="demo4.tablePage4"
:data="demo4.tableData4"
:columns="demo4.tableColumn4"
@cell-click="cellClickEvent4">
</vxe-grid>
</div>
</template>
</vxe-pulldown>
</p>
`,
`
import { defineComponent, onMounted, reactive, ref, Ref } from 'vue'
import { VxePulldownInstance } from 'vxe-table'
interface ItemVO {
label: string;
vlue: string;
}
export default defineComponent({
setup () {
const data1: ItemVO[] = [
{ label: '选项1', vlue: '1' },
{ label: '选项2', vlue: '2' },
{ label: '选项3', vlue: '3' },
{ label: '选项4', vlue: '4' },
{ label: '选项5', vlue: '5' },
{ label: '选项6', vlue: '6' },
{ label: '选项7', vlue: '7' },
{ label: '选项8', vlue: '8' },
{ label: '选项9', vlue: '9' },
{ label: '选项10', vlue: '10' },
{ label: '选项11', vlue: '11' },
{ label: '选项12', vlue: '12' }
]
const demo1 = reactive({
value1: '',
list1: data1
})
const xDown1 = ref() as Ref<VxePulldownInstance>
const focusEvent1 = () => {
const $pulldown1 = xDown1.value
$pulldown1.showPanel()
}
const keyupEvent1 = () => {
demo1.list1 = demo1.value1 ? data1.filter((item) => item.label.indexOf(demo1.value1) > -1) : data1
}
const selectEvent1 = (item: ItemVO) => {
const $pulldown1 = xDown1.value
demo1.value1 = item.label
$pulldown1.hidePanel().then(() => {
demo1.list1 = data1
})
}
const data2: ItemVO[] = [
{ label: '选项1', vlue: '1' },
{ label: '选项2', vlue: '2' },
{ label: '选项3', vlue: '3' },
{ label: '选项4', vlue: '4' },
{ label: '选项5', vlue: '5' },
{ label: '选项6', vlue: '6' },
{ label: '选项7', vlue: '7' },
{ label: '选项8', vlue: '8' },
{ label: '选项9', vlue: '9' },
{ label: '选项10', vlue: '10' },
{ label: '选项11', vlue: '11' },
{ label: '选项12', vlue: '12' }
]
const demo2 = reactive({
value2: '',
list2: data2
})
const xDown2 = ref() as Ref<VxePulldownInstance>
const focusEvent2 = () => {
const $pulldown2 = xDown2.value
$pulldown2.showPanel()
}
const keyupEvent2 = () => {
demo2.list2 = demo2.value2 ? data2.filter((item) => item.label.indexOf(demo2.value2) > -1) : data2
}
const selectEvent2 = (item) => {
const $pulldown2 = xDown2.value
demo2.value2 = item.label
$pulldown2.hidePanel().then(() => {
demo2.list2 = data2
})
}
const demo3 = reactive({
tableData3: [
{ name: 'Test1', role: '前端', sex: '男' },
{ name: 'Test2', role: '后端', sex: '男' },
{ name: 'Test3', role: '测试', sex: '男' },
{ name: 'Test4', role: '设计师', sex: '女' }
]
})
const xDown3 = ref() as Ref<VxePulldownInstance>
const clickEvent3 = () => {
const $pulldown3 = xDown3.value
$pulldown3.togglePanel()
}
const demo4 = reactive({
value4: '',
tableColumn4: [
{ field: 'name', title: 'Name' },
{ field: 'role', title: 'Role' },
{ field: 'sex', title: 'Sex' }
],
loading4: false,
tableData4: [] as any[],
tableList4: [
{ name: 'Test1', role: '前端', sex: '男' },
{ name: 'Test2', role: '后端', sex: '男' },
{ name: 'Test3', role: '测试', sex: '男' },
{ name: 'Test4', role: '设计师', sex: '女' },
{ name: 'Test5', role: '前端', sex: '男' },
{ name: 'Test6', role: '前端', sex: '男' },
{ name: 'Test7', role: '前端', sex: '男' }
],
tablePage4: {
total: 0,
currentPage: 1,
pageSize: 10
}
})
const xDown4 = ref() as Ref<VxePulldownInstance>
const focusEvent4 = () => {
const $pulldown4 = xDown4.value
$pulldown4.showPanel()
}
const keyupEvent4 = () => {
demo4.loading4 = true
setTimeout(() => {
demo4.loading4 = false
if (demo4.value4) {
demo4.tableData4 = demo4.tableList4.filter((row) => row.name.indexOf(demo4.value4) > -1)
} else {
demo4.tableData4 = demo4.tableList4.slice(0)
}
}, 100)
}
const suffixClick4 = () => {
const $pulldown4 = xDown4.value
$pulldown4.togglePanel()
}
const cellClickEvent4 = ({ row }: ItemVO) => {
const $pulldown4 = xDown4.value
demo4.value4 = row.name
$pulldown4.hidePanel()
}
onMounted(() => {
keyupEvent4()
})
return {
demo1,
xDown1,
focusEvent1,
keyupEvent1,
selectEvent1,
demo2,
xDown2,
focusEvent2,
keyupEvent2,
selectEvent2,
demo3,
xDown3,
clickEvent3,
demo4,
xDown4,
focusEvent4,
keyupEvent4,
suffixClick4,
cellClickEvent4
}
}
}
}
`,
`
.my-dropdown1 {
height: 200px;
overflow: auto;
border-radius: 4px;
background-color: #fff;
border: 1px solid #dcdfe6;
}
.list-item1:hover {
background-color: #f5f7fa;
}
.my-dropdown2 {
border-radius: 4px;
background-color: #fff;
border: 1px solid #dcdfe6;
}
.list-item2:hover {
background-color: #f5f7fa;
}
.my-dropdown3 {
width: 400px;
background-color: #fff;
border: 1px solid #dcdfe6;
box-shadow: 0 0 6px 2px rgba(0, 0, 0, 0.1);
}
.my-dropdown4 {
width: 600px;
height: 300px;
background-color: #fff;
border: 1px solid #dcdfe6;
box-shadow: 0 0 6px 2px rgba(0, 0, 0, 0.1);
}
`
]
}
}
})
</script>
<style lang="css" scoped>
.my-dropdown1 {
height: 200px;
overflow: auto;
border-radius: 4px;
background-color: #fff;
border: 1px solid #dcdfe6;
}
.list-item1:hover {
background-color: #f5f7fa;
}
.my-dropdown2 {
border-radius: 4px;
background-color: #fff;
border: 1px solid #dcdfe6;
}
.list-item2:hover {
background-color: #f5f7fa;
}
.my-dropdown3 {
width: 400px;
background-color: #fff;
border: 1px solid #dcdfe6;
box-shadow: 0 0 6px 2px rgba(0, 0, 0, 0.1);
}
.my-dropdown4 {
width: 600px;
height: 300px;
background-color: #fff;
border: 1px solid #dcdfe6;
box-shadow: 0 0 6px 2px rgba(0, 0, 0, 0.1);
}
</style>