广告位联系
返回顶部
分享到

vue选项卡组件的实现方法

JavaScript 来源:互联网 作者:秩名 发布时间:2022-03-01 16:53:39 人浏览
摘要

主要功能:点击不同的选项,显示不同的内容 html 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 !DOCTYPE html html head meta charset=UTF-8 title/title link rel=stylesheet type=text/css h

主要功能:点击不同的选项,显示不同的内容

html

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

<!DOCTYPE html>

<html>

    <head>

        <meta charset="UTF-8">

        <title></title>

        <link rel="stylesheet" type="text/css" href="css/style.css" />

        <script src="js/jquery.js" type="text/javascript" charset="utf-8"></script>

        <script src="js/vue.js" type="text/javascript" charset="utf-8"></script>

        <script type="text/javascript">

            $(document).ready(function(){

                var app=new Vue({

                    el: "#app",

                    data: {

                        activeKey: '1'//被选择的选项

                    }

                });

            });

        </script>

    </head>

    <body>

        <div id="app" v-cloak>

            <tabs v-model="activeKey">

                <pane label="一" name="1">我是张三</pane>

                <pane label="二" name="2">我是李四</pane>

                <pane label="三" name="3">我是牛五</pane>

            </tabs>

        </div>

        <script src="js/pane.js" type="text/javascript" charset="utf-8"></script>

        <script src="js/tabs.js" type="text/javascript" charset="utf-8"></script>

    </body>

</html>

pane.js

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

Vue.component('pane',{

    name: 'pane',

    template: '\

        <div class="pane" v-show="show"> \

            <slot></slot> \

        </div>',

    data: function(){

        return {

            show: true

        }

    },

    props: {

        name: {

            type: String

        },

        label: {

            type: String,

            default: ''

        }

    },

    methods: {

        updateNav()    {

            this.$parent.updateNav();

        }

    },

    watch: {

        label(){

            this.updateNav();

        }

    },

    mounted() {

        this.updateNav();

    }

})

tabs.js

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

Vue.component('tabs',{

    template: '\

        <div class="tabs">\

            <div class="tabs-bar">\

                <div \

                    :class="tabCls(item)" \

                    v-for="(item,index) in navList" \

                    @click="handleChange(index)"> \

                    {{item.label}} \

                </div>\

            </div> \

            <div class="tabs-content"> \

                <slot></slot> \

            </div> \

        </div>',

    props: {

        value: {

            type: [String,Number]

        }

    },

    data: function(){

        return {

            currentValue: this.value,

            navList: []

        }

    },

    methods: {

        tabCls: function(item){

            return [

                'tabs-tab',

                {

                    'tabs-tab-active': item.name===this.currentValue

                }

            ]

        },

        //遍历所有为pane的子元素

        getTabs(){

            return this.$children.filter(function(item){

                return item.$options.name==='pane';

            });

        },

        //将pane子元素中label name放进navList数组

        updateNav() {

            this.navList=[];

            var _this=this;

            this.getTabs().forEach(function(pane,index){

                _this.navList.push({

                    label: pane.label,

                    name: pane.name ||index

                });

                if(!pane.name) pane.name=index;

                if(index===0){

                    if(!_this.currentValue){

                        _this.currentValue=pane.name || index;

                    }

                }

            });

            this.updateStatus();

        },

        updateStatus(){

            var tabs=this.getTabs();

            var _this=this;

            //显示当前正在选中的

            tabs.forEach(function(tab){

                return tab.show=tab.name===_this.currentValue;

            })

        },

        handleChange: function(index){

            var nav =this.navList[index];

            var name=nav.name;

            this.currentValue=name;

            this.$emit('input',name);

            this.$emit('on-click',name);

        }

    },

    watch: {

        value: function(val){

            this.currentValue=val;

        },

        currentValue: function (){

            this.updateStatus();

        }

    }

     

})


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/GlimmerL/article/details/102532817
相关文章
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计