update Tabs method of find children

Now, can use other components to package the TabPane, but should set animated to false.
This commit is contained in:
梁灏 2019-02-22 17:23:39 +08:00
parent 13b2bfe919
commit 4d8b401656
5 changed files with 2191 additions and 1553 deletions

View file

@ -0,0 +1,8 @@
<template>
<div class="i-wrapper"><slot></slot></div>
</template>
<script>
export default {
}
</script>

View file

@ -1,12 +1,22 @@
<template> <template>
<Tabs type="card" closable @on-tab-remove="handleTabRemove" :beforeRemove="handleBeforeRemove"> <Tabs type="card" :animated="true" closable @on-tab-remove="handleTabRemove" :beforeRemove="handleBeforeRemove">
<TabPane label="标签一" v-if="tab0">标签一的内容</TabPane> <Wrapper>
<TabPane label="标签二" v-if="tab1">标签二的内容</TabPane> <TabPane label="标签一" v-if="tab0">标签一的内容</TabPane>
<TabPane label="标签三" v-if="tab2">标签三的内容</TabPane> <TabPane label="标签二" v-if="tab1">标签二的内容</TabPane>
<TabPane label="标签三" v-if="tab2">标签三的内容</TabPane>
</Wrapper>
</Tabs> </Tabs>
<!--<Tabs type="card" :animated="true" closable @on-tab-remove="handleTabRemove" :beforeRemove="handleBeforeRemove">-->
<!--<TabPane label="标签一" v-if="tab0">标签一的内容</TabPane>-->
<!--<TabPane label="标签二" v-if="tab1">标签二的内容</TabPane>-->
<!--<TabPane label="标签三" v-if="tab2">标签三的内容</TabPane>-->
<!--</Tabs>-->
</template> </template>
<script> <script>
import Wrapper from '../components/wrapper.vue';
export default { export default {
components: { Wrapper },
data () { data () {
return { return {
tab0: true, tab0: true,

3703
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -6,6 +6,7 @@
export default { export default {
name: 'TabPane', name: 'TabPane',
inject: ['TabsInstance'],
props: { props: {
name: { name: {
type: String type: String
@ -36,13 +37,13 @@
computed: { computed: {
contentStyle () { contentStyle () {
return { return {
visibility: this.$parent.activeKey !== this.currentName ? 'hidden' : 'visible' visibility: this.TabsInstance.activeKey !== this.currentName ? 'hidden' : 'visible'
}; };
} }
}, },
methods: { methods: {
updateNav () { updateNav () {
this.$parent.updateNav(); this.TabsInstance.updateNav();
} }
}, },
watch: { watch: {

View file

@ -32,7 +32,7 @@
<script> <script>
import Icon from '../icon/icon.vue'; import Icon from '../icon/icon.vue';
import Render from '../base/render'; import Render from '../base/render';
import { oneOf, MutationObserver } from '../../utils/assist'; import { oneOf, MutationObserver, findComponentsDownward } from '../../utils/assist';
import Emitter from '../../mixins/emitter'; import Emitter from '../../mixins/emitter';
import elementResizeDetectorMaker from 'element-resize-detector'; import elementResizeDetectorMaker from 'element-resize-detector';
@ -64,6 +64,9 @@
name: 'Tabs', name: 'Tabs',
mixins: [ Emitter ], mixins: [ Emitter ],
components: { Icon, Render }, components: { Icon, Render },
provide () {
return { TabsInstance: this };
},
props: { props: {
value: { value: {
type: [String, Number] type: [String, Number]
@ -166,7 +169,8 @@
}, },
methods: { methods: {
getTabs () { getTabs () {
return this.$children.filter(item => item.$options.name === 'TabPane'); // return this.$children.filter(item => item.$options.name === 'TabPane');
return findComponentsDownward(this, 'TabPane');
}, },
updateNav () { updateNav () {
this.navList = []; this.navList = [];
@ -393,7 +397,7 @@
return false; return false;
}, },
updateVisibility(index){ updateVisibility(index){
[...this.$refs.panes.children].forEach((el, i) => { [...this.$refs.panes.querySelectorAll(`.${prefixCls}-tabpane`)].forEach((el, i) => {
if (index === i) { if (index === i) {
[...el.children].filter(child=> child.classList.contains(`${prefixCls}-tabpane`)).forEach(child => child.style.visibility = 'visible'); [...el.children].filter(child=> child.classList.contains(`${prefixCls}-tabpane`)).forEach(child => child.style.visibility = 'visible');
if (this.captureFocus) setTimeout(() => focusFirst(el, el), transitionTime); if (this.captureFocus) setTimeout(() => focusFirst(el, el), transitionTime);