📘
技术积累
  • 简介
  • 学习方法
    • 如何提高编程技能
  • 基础知识
    • Linux
      • Linux常用指令
      • rsync
      • VIM
      • tmate命令行分享
      • 命令别名存储
      • 项目服务器重启
    • 设计模式
    • 自动化接口使用
    • 项目经理培训
    • 报价策略
    • 培训材料撰写
  • 工具
    • Ajax
    • AutV
    • axios
    • Babel
    • bower
    • codecov
    • crypto
    • CSS3D
    • Docker
    • Echarts
    • Git
      • 如何删除项目
      • 多个ssh_key的生成与使用
      • 常用命令清单
    • Gitbook
      • Gitbook 更多配置
      • Markdown 标记示例
    • gulp
    • Istanbul
    • JEST
    • jMeter
    • js-md5
    • Kama
    • LESS Sass 编译工具Koala介绍
    • Lodash
    • Markdown
    • Maven
    • Moment
    • Nginx
    • NPM
    • NVM
    • particles.js粒子效果
    • PM2
    • Qs
    • Swagger
    • Webpack
    • Webpack
    • Yarn
    • Yeoman使用
  • 平台
    • 代码托管平台 GitLab
    • 代码安全平台 sonarqube
  • 语言和框架
    • 工作流
    • Angular
      • FUSE-Angular前端框架项目初始化
      • AngularJs-toaster-Angular提示弹框插件
      • ng-file-upload-Angular上传图片插件
      • ngclipboard-Angular复制到剪贴板插件
    • Vue
      • ElementUI-Vue前端框架项目初始化
      • clipboard使用
      • mobileSelect.js使用
      • vue-cookies使用
      • vue-fullpage使用
      • vue-router使用
      • Vue的Ref属性
      • Vuex使用
      • Vux使用
      • vux-uploader使用
      • Vue生命周期图例
      • iview-loader使用
    • cycleJs
    • ES6
      • async/await
    • react
      • react生命周期
      • create-react-app
      • Rematch
      • react-router
      • react-router-dom
      • css-in-js
    • TypeScript
      • VueAndTypeScript
    • 微信小程序
    • Hexo博客框架
      • Hexo博客框架-图片问题处理
      • Hexo博客框架-切换主题
    • SmartClient
    • HybridApp混合开发
      • uniapp
  • 代码审查
    • 代码命名规范
    • 页面代码结构
    • JavaScript标准编码风格
    • AirbnbJavaScript风格指南
  • 其他
    • 收藏|激发灵感的33套网页配色方案(附色值)
    • KPI&OKR
    • 测试自动化
    • view
    • 前端面试
      • 项目方面
      • html+css
      • JavaScript方面
      • JavaScript面试
      • 框架方面
      • 前端面试3+1
        • 20190420
        • 20190419
        • 20190418
        • 20190417
    • Linux面试题
    • JAVA面试
    • 测试面试
    • 钉钉使用
    • sd360
  • 前端知识积累
    • css3单位汇总
    • CSS解决loading效果
    • 深度克隆的方法
    • 加密技术
    • 解决ios下的微信页面背景音乐无法自动播放问题
    • 一套绝佳的图标字体库和CSS框架:Font Awesome
    • 关于ico图标不显示解决办法
    • 提升页面响应速度
    • innerHTML引入的script如何使用
    • JavaMap转Json
    • JS开发工具大全
    • 移动端插件
    • 移动端页面通过前端方法禁止ios页面横屏方法
    • 图片资源网站
    • 排序方式
    • 图片预览上传
    • Windows部署时脚本报错
Powered by GitBook
On this page
  • 1 Vue的ref和$refs属性
  • 1.1 简介
  • 2 vue中的ref和$refs
  • 2.1 vm.$refs
  • 2.2 ref
  • 3 ref的使用实例
  • 3.1 ref使用在外面的组件上
  • 3.2 ref使用在外面的元素上
  • 3.3 ref使用在里面的元素上---局部注册组件
  • 3.4 ref使用在里面的元素上---全局注册组件

Was this helpful?

  1. 语言和框架
  2. Vue

Vue的Ref属性

作者:高天阳

邮箱:13683265113@163.com

更改历史

* 2018-08-07        高天阳     初始化文档

1 Vue的ref和$refs属性

1.1 简介

ref被用来给DOM元素或子组件注册引用信息。引用信息会根据父组件的$refs对象进行注册。 如果在普通的DOM元素上使用,引用信息就是元素; 如果用在子组件上,引用信息就是组件实例

  • 注意:只要想要在Vue中直接操作DOM元素,就必须用ref属性进行注册

<!-- vm.$refs.p will the DOM node -->
<p ref='p'>hello</p>

<!-- vm.$refs.child will be child comp instance -->
<child-comp ref='child'></child-comp>

示例:

<div class="goods">
    <div class="menu-wrapper" ref="menuWrapper">
        <ul>
            <li v-for="item in goods" class="menu-item">
                <span class="text border-1px">
                    <span v-show="item.type>0" class="icon" v-bind:class="classMain">
                        {{item.name}}
                    </span>
                </span>
            </li>
        </ul>
    </div>
</div>
<div class="foods-wrapper" ref="foodsWrapper">
    <ul>
        <li v-for="item in goods" class="food-list"></li>
    </ul>
</div>
created: function () {
    var self = this;
    self.$http.get('/api/goods').then((res) => {
        self.goods = res.body.dataJson;
        // 这里获取数据赋予data中的goods属性,进而去更新视图层的展示,但因为Vue中更新DOM是异步的,所以这里即使更新goods也不会立刻改变DOM,所以我们必须使用nextTick的API操作DOM
        self.$nextTick(() => {
            self._initScroll();
        })
    });
    self.classMap = ['decrease','discount','guarantee','invoice','special'];
},
methods: {
    /**
     * 初始化
     */
    _initScroll() {
        var self = this;
        self.foodsScroll = new BScroll(self.$refs.foodsWrapper,{})
        self.menuScroll = new BScroll(self.$refs.menuWrapper,{})
    }
}

这里为了在create的时候引用DOM元素,先在DOM中使用ref标签进行了注册,然后便可以通过’this.$refs’再跟注册时的名称来引用DOM元素了

2 vue中的ref和$refs

2.1 vm.$refs

  • 类型:Object

  • 只读

  • 详细:

  • 参考:

2.2 ref

  • 预期:string

ref被用来给元素或子组件注册引用信息。引用信息将会注册在父组件的$refs对象上。如果在普通的 DOM 元素上使用, 引用指向的就是 DOM 元素;如果用在子组件上,引用就指向组件实例:

<!-- vm.$refs.p will the DOM node -->
<p ref='p'>hello</p>

<!-- vm.$refs.child will be child comp instance -->
<child-comp ref='child'></child-comp>

当 v-for 用于元素或组件的时候,引用信息将是包含 DOM 节点或组件实例的数组。

关于 ref 注册时间的重要说明:因为 ref 本身是作为渲染结果被创建的,在初始渲染的时候你不能访问它们 - 它们还不存在! $refs 也不是响应式的,因此你不应该试图用它在模板中做数据绑定。

3 ref的使用实例

3.1 ref使用在外面的组件上

<!DOCTYPE html>
<html>
<head>
    <title>demo</title>
    <meta charset="UTF-8">
</head>
<body>
<div id="ref-outside-component" @click="consoleRef">
    <component-father ref="outsideComponentRef">
    </component-father>
    <p>ref在外面的组件上</p>
</div>
</body>
<!-- import Vue before Element -->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
<script>
    var refoutsidecomponentTem={
        template:"<div class='childComp'><h5>我是子组件</h5></div>"
    };
    var  refoutsidecomponent=new Vue({
        el:"#ref-outside-component",
        components:{
            "component-father":refoutsidecomponentTem
        },
        methods:{
            consoleRef:function () {
                console.log(this); // #ref-outside-component     vue实例
                console.log(this.$refs.outsideComponentRef);  // div.childComp vue实例
            }
        }
    });
</script>
</html>

3.2 ref使用在外面的元素上

<!DOCTYPE html>
<html>
<head>
    <title>demo</title>
    <meta charset="UTF-8">
</head>
<body>
<!--ref在外面的元素上-->
<div id="ref-outside-dom" @click="consoleRef" >
    <component-father>
    </component-father>
    <p  ref="outsideDomRef">ref在外面的元素上</p>
</div>
</body>
<!-- import Vue before Element -->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
<script>
    var refoutsidedomTem={
        template:"<div class='childComp'><h5>我是子组件</h5></div>"
    };
    var  refoutsidedom=new Vue({
        el:"#ref-outside-dom",
        components:{
            "component-father":refoutsidedomTem
        },
        methods:{
            consoleRef:function () {
                console.log(this); // #ref-outside-dom    vue实例
                console.log(this.$refs.outsideDomRef);  //   <p> ref在外面的元素上</p>
            }
        }
    });
</script>
</html>

3.3 ref使用在里面的元素上---局部注册组件

<!DOCTYPE html>
<html>
<head>
    <title>demo</title>
    <meta charset="UTF-8">
</head>
<body>
<!--ref在里面的元素上-->
<div id="ref-inside-dom">
    <component-father>
    </component-father>
    <p>ref在里面的元素上</p>
</div>
</body>
<!-- import Vue before Element -->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
<script>
    var refinsidedomTem={
        template:"<div class='childComp' @click='consoleRef'>" +
        "<h5 ref='insideDomRef'>我是子组件</h5>" +
        "</div>",
        methods:{
            consoleRef:function () {
                console.log(this);  // div.childComp   vue实例
                console.log(this.$refs.insideDomRef);  // <h5 >我是子组件</h5>
            }
        }
    };
    var refinsidedom=new Vue({
        el:"#ref-inside-dom",
        components:{
            "component-father":refinsidedomTem
        }
    });
</script>
</html>

3.4 ref使用在里面的元素上---全局注册组件

<!DOCTYPE html>
<html>
<head>
    <title>demo4</title>
    <meta charset="UTF-8">
</head>
<body>
<!--ref在里面的元素上--全局注册-->
<div id="ref-inside-dom-all">
    <ref-inside-dom-quanjv></ref-inside-dom-quanjv>
</div>
</body>
<!-- import Vue before Element -->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
<script>
    Vue.component("ref-inside-dom-quanjv",{
        template:"<div class='insideFather'> " +
        "<input type='text' ref='insideDomRefAll' @input='showinsideDomRef'>" +
        "  <p>ref在里面的元素上--全局注册 </p> " +
        "</div>",
        methods:{
            showinsideDomRef:function () {
                console.log(this); //这里的this其实还是div.insideFather
                console.log(this.$refs.insideDomRefAll); // <input  type="text">
            }
        }
    });

    var refinsidedomall=new Vue({
        el:"#ref-inside-dom-all"
    });
</script>
</html>
Previousvue-router使用NextVuex使用

Last updated 4 years ago

Was this helpful?

一个对象,持有已注册过的ref的所有子组件

参考:子组件

特性
子组件引用
特殊特性 - ref
子组件Refs