理解Vue 2.0 的ref属性及简单用法

以一个菜单为例:

先搭建一个菜单列表example.vue:

<style src="./example.less" lang="less" scoped></style>
<template>
    <div class="menu">
        <div>
            <div class="side-bar">
            </div>
            <ul class="catalog-list" >
                <li class="level1" v-for="firstLevel in menuList">
                    <em class="circle-pointer"></em>
                    <a href="#" class="title-link">{{firstLevel.name}}</a>
                    <ul v-if="firstLevel.children.length>0">
                        <li class="level2" v-for="secondLevel in firstLevel.children">
                            <em class="pointer"></em>
                            <a href="#" class="title-link">{{secondLevel.name}}</a>

                            <ul v-if="secondLevel.children.length>0">
                                <li class="level3"
                                    @click="moveArrow"
                                    v-for="thirdLevel in secondLevel.children">
                                    <a :href="'#item_'+thirdLevel.id" class="title-link">{{thirdLevel.name}}</a>
                                </li>
                            </ul>
                        </li>
                    </ul>
                </li>
                <li class="last"> <em class="circle-pointer"></em></li>
                <a class="arrow" href="javascript:void(0);"></a>
            </ul>

        </div>

    </div>
</template>
<script src="./example.js"></script>

加载数据menuList后效果如图:
这里写图片描述

为了让左边箭头随鼠标的点击移动,给三级目录绑定事件

获取当前鼠标点击的top以及外层div元素的top

为了访问到DOM元素的值,要用到ref属性,将以上的最外层Div改写为:
<div class="menu" ref="menuBorder">
就可以将class为menu的dom属性集合,即menuBorder挂载到this.refs上,通过this.refs.menuBorderj就可以访问了

example.js:

export default {
    data() {
        return {
            menuList: [{
                name: '一级目录',
                children: [
                    {
                        name: '二级目录',
                        children: [
                            {
                                name: '三级目录',
                                children: ['内容']
                            },
                            {
                                name: '二级目录',
                                children: [{
                                    name: '三级目录',
                                    children: ['内容']
                                }]
                            },
                            {
                                name: '二级目录',
                                children: [{
                                    name: '三级目录',
                                    children: ['内容']
                                }]
                            },
                            {
                                name: '二级目录',
                                children: [{
                                    name: '三级目录',
                                    children: ['内容']
                                }]
                            },
                            {
                                name: '二级目录',
                                children: [{
                                    name: '三级目录',
                                    children: ['内容']
                                }]
                            },
                            {
                                name: '二级目录',
                                children: [{
                                    name: '三级目录',
                                    children: ['内容']
                                }]
                            }
                        ]
                    },{
                        name: '二级目录',
                        children: [
                            {
                                name: '三级目录',
                                children: ['内容']
                            },
                            {
                                name: '二级目录',
                                children: [{
                                    name: '三级目录',
                                    children: ['内容']
                                }]
                            },
                            {
                                name: '二级目录',
                                children: [{
                                    name: '三级目录',
                                    children: ['内容']
                                }]
                            },
                            {
                                name: '二级目录',
                                children: [{
                                    name: '三级目录',
                                    children: ['内容']
                                }]
                            }
                        ]
                    }],
            }]
        };
    },

    methods:{
        moveArrow:function (e) {
            console.log($(e.target).offset().top)
            let parentTop=this.$refs.menuBorder.offsetTop;
            var top = $(e.target).offset().top - parentTop;
            $('.arrow').css('top', top );
        }
    }
};

less文件省略……

达到目的,是因为别人让用这个才试着使用,刚开始很模糊,不知道它的目的是什么,然后自己用完一遍后,发现就和选择器差不多效果……………………

自己实践了一下

console.log($('.menu').offset().top);
console.log(this.$refs.menuBorder.offsetTop)

结果:
这里写图片描述

好吧,一样的………………
只能安慰自己多学习了一点知识
笑 脸

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值