位置: IT常识 - 正文

Vue(ref和$refs属性介绍与使用)

编辑:rootadmin
Vue(ref和$refs属性介绍与使用) 一、 Vue(ref和$refs属性介绍与使用)

推荐整理分享Vue(ref和$refs属性介绍与使用),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

在Vue中一般很少会用到直接操作DOM,但不可避免有时候需要用到,这时我们可以通过ref和$refs这两个来实现,本文我们就来详细的介绍下这个内容

除了自定义属性外,Vue实例还暴露一些有用的实例属性和方法,他们都有前缀$,以便和用户定义的属性和方法分开 常用的属性有:

常用的属性有:1:vm.$el //获取vue实例关联的Dom元素2: vm.$data //获取vue实例的data选项3:vm.$options//获取vue实例的自定义属性4:vm.$refs//获取vue实例中所有含有ref属性的dom元素,如果有多个,只返回最后一个。5: vm.$ref // ref 被用来给元素或子组件注册引用信息, 引用信息将会注册在父组件的 $refs 对象上,如果是在普通的DOM元素上使用,引用指向的就是 DOM 元素,如果是在子组件上,引用就指向组件的实例 ref加载普通元素上,this.$refs. 获取到的就是dom元素 ref记载在子组件上,this.$refs. 获取到的就是组件实例,可使用组件的所有方法。ref有三种用法: ①ref加在普通的元素上,用this.ref.name获取到的是dom元素; ②ref加在子组件上,用this.ref.name获取到的是组件实例,可以使用组件的所有方法; ③如何利用v-for和ref获取一组数据或者dom节点。 当v-for用于元素或者组件的时候,引用信息将是包含dom节点或组件实例的数组; 关于ref注册时间的重要说明:因为ref本身是作为渲染结果被创建的,在初始渲染的时候,你不能访问它们--它们还不存在!$refs也不是响应式的,因此你不应该试图用它在模板中做数据绑定。ref

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

ref作用

用来给元素或者子组件注册引用信息。引用信息将会注册给父组件的$refs对象上。 1、如果给普通的dom元素使用,引用指向的是dom元素。 2、如果是给子组件使用,引用指向的是子组件的实例。

注意: 1、$refs只有在组件渲染完成后才填充,在初始渲染的时候不能访问它们,并且它是非响应式的,因此不能用它在模板中做数据绑定。 2、微信小程序中给dom元素使用ref无效。得到的是 空对象.

$refs

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

具体演示

1.基础代码

先来准备案例基础代码,如下

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script src="./lib/vue-2.4.0.js"></script></head><body> <div id="app"> </div> <script> var vm = new Vue({ el: "#app", data: {}, methods: {} }) </script></body></html>2.普通DOM2.1 普通方式

我们先通过 getElementById 方法来获取   

2.2 ref使用

接下来我们通过 ref 属性来试试。   

然后查看 vm 实例对象   

通过上面的演示我们发现 在vm实例上有一个 $refs属性,而且该属性就有我们通过ref注册的DOM对象,于是我们可以这样获取DOM对象

3.组件

ref 也可以作用在组件中,我们来看下效果

3.1 添加组件

先来添加一个自定义的组件

3.2 ref 使用

在 子组件中使用 ref属性,会将子组件添加到父组件的$refs对象中,如下 查看vm对象

通过 vm 实例查看 发现 $refs中绑定的有 我们的login组件,而且还看到了对应的 组件中的 msg属性和 show方法,那这样我们可以调用了,如下

3.5 完整代码<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script src="./lib/vue-2.4.0.js"></script></head><body> <div id="app"> <input type="button" value="获取h3的值" @click="getElement()"> <h3 id="myh3" ref="myh3" >我是一个h3</h3> <hr> <login ref='mylogin'></login> </div> <script> var login = { template: "<h3>我是login子组件</h3>", data(){ return { msg: "ok" } }, methods:{ show(){ console.log("show方法执行了...") } } } var vm = new Vue({ el: "#app", data: {}, methods: { getElement(){ // 通过 getElementById 方式获取 DOM 对象 // console.log(document.getElementById("myh3").innerHTML) // console.log(this.$refs.myh3.innerHTML) console.log(this.$refs.mylogin.msg) this.$refs.mylogin.show() } }, components:{ login } }) </script></body></html>二. vue中父子组件通过ref传值「dialog组件」

一个基于vue的项目,有可能会很多的组件,组件之间难免需要进行数据的传递,比如: 父组件 传数据 给子组件;子组件传数据给父组件等,需要用到组件之间的通信处理方式。 项目中经常用到element中的dialog组件,现记录父子组件通过ref传值。

操作流程:

1.父组件中点击按钮吊起子组件模态框dialog进行内容设置,并给子组件传递idthis.$nextTick(() => { //此函数执行时所有的DOM挂载和渲染都已完成 this.$refs.dialogRef.init(this.fatherId); //获取子组件中init方法并将父组件id传递给子组件 });2.在子组件中需接收父组件传来的内容id并查询内容详情init (val) { this.activityId = val //接收父组件传递的id值}3.在子组件dialog中可以编辑内容,然后将数据通过$emit传递给父组件this.$emit("setActivityBtn", this.SetForm); //setActivityBtn为父组件接收的方法,将参数传给父组件4.父组件接收数据后提交到服务器setActivityBtn(data) { //获取子组件传来的值 let params = data },

以下为父子组件全部代码

Vue(ref和$refs属性介绍与使用)

子组件Dialog

<script>export default { name: '', data () { return { id: '', //用来查询详情的id dialogFormVisible: false, //模态框 SetForm: { }, //模态框数据 } }, methods: { // 初始化方法 init (val) { this.activityId = val //接收父组件传递的值 this.dialogFormVisible = true; this.getActivityInfo() }, //获取内容详情 getActivityInfo () { }, //模态框确定按钮 setActivityBtn () { this.$emit("setActivityBtn", this.SetForm); //将参数传给父组件 this.dialogFormVisible = false; },}</script>

父组件

<script>import Dialog from '../components/Dialog'export default { name: '', data () { return { fatherId:'', //详情id dialogShow: false, //模态框 } },components: { // 组件的引用 Dialog }, methods: { //吊起模态框 activitySet() { this.dialogShow= true; this.$nextTick(() => { //此函数执行时所有的DOM挂载和渲染都已完成 this.$refs.dialogRef.init(this.fatherId); //获取子组件中init方法并将父组件id传递给子组件 }); }, //确定按钮 setActivityBtn(data) { //获取子组件传来的值 let params = data XXXXXXXX(params).then(res => { if (res.data.code == 0) { this.dialogFormVisible = false } }) },}</script>

吊起模态框

<script>import Dialog from '../components/Dialog'export default { name: '', data () { return { fatherId:'', //详情id dialogShow: false, //模态框 } },components: { // 组件的引用 Dialog }, methods: { //吊起模态框 activitySet() { this.dialogShow= true; this.$nextTick(() => { //此函数执行时所有的DOM挂载和渲染都已完成 this.$refs.dialogRef.init(this.fatherId); //获取子组件中init方法并将父组件id传递给子组件 }); }, //确定按钮 setActivityBtn(data) { //获取子组件传来的值 let params = data XXXXXXXX(params).then(res => { if (res.data.code == 0) { this.dialogFormVisible = false } }) },}</script>三.拓展方式一、父子组件通过ref传值,然后在子组件中data函数直接return获得

父组件中:可以通过ref向子组件传值

this.$refs.dialogRef.name1=this.fatherName1this.$refs.dialogRef.name2=this.fatherName2

子组件中:可以通过数组的形式向父组件传递多个参数

this.$emit("setActivityBtn", [this.SetForm,this.dialogFormVisible]);方式二.v-bind绑定,子组件中props接受,return中定义要改变传给父组件的属性:

父组件

<script> this.fatherName= this.detailData.name; this.fatherSalePrice= this.detailData.salePrice;</script>

子组件

<script> export default { props: { sonName: { type:String, default:'' }, sonSalePrice: { type:Number, default:0 }, }, data:function () { return { cartName:this.sonName, cartSalePrice:this.sonSalePrice } }, methods: { addCart() { this.$emit('confirmAddCart',[this.cartName,this.cartSalePrice]); } } }</script>

注:vue的思想是数据驱动视图,所以尽量少的用直接操作dom,当然一些需要获取元素宽高等场景时也会用到$refs 事件驱动

四 vue的思想是数据驱动视图

在前端来说数据驱动式框架,必然离不开事件驱动,事件驱动一定程度上弥补了数据驱动的不足,在dom操作的时代通常都是这样操作: 通过特定的选择器查找到需要操作的节点 -> 给节点添加相应的事件监听 响应用户操作,效果是这样: 用户执行某事件(点击,输入,后退等等) -> 调用 JavaScript 来修改节点 这种模式对业务来说是没有什么问题,但是从开发成本和效率来说会比较力不从心,在业务系统越来越庞大的时候,就显得复杂了。另一方面,找节点和修改节点这件事,效率本身就很低,因此出现了数据驱动模式。

数据驱动

读取模板,同时获得数据,并建立 VM( view-model ) 的抽象层 -> 在页面进行填充 要注意的是,MVVM 对应了三个层,M - Model,可以简单的理解为数据层;V - View,可以理解为视图,或者网页界面;VM - ViewModel,一个抽象层,简单来说可以认为是 V 层中抽象出的数据对象,并且可以与V 和 M 双向互动(一般实现是基于双向绑定,双向绑定的处理方式在不同框架中不尽相同)。 用户执行某个操作 -> 反馈到 VM 处理(可以导致 Model 变动) -> VM 层改变,通过绑定关系直接更新页面对应位置的数据

Vue 模式

Vue 通过{{}}绑定文本节点,data里动态数据与Props静态数据进行一个映射关系,当data中的属性或者props中的属性有变动,以上两者里的每个数据都是行为操作需要的数据或者模板 view 需要渲染的数据,一旦其中一个属性发生变化,则所有关联的行为操作和数据渲染的模板上的数据同一时间进行同步变化,这种基于数据驱动的模式更简便于大型应用开发。只要合理的组织数据和代码,就不会显得后续皮软。

何为动态数据 data,何为静态数据 props相同点

两者选项里都可以存放各种类型的数据,当行为操作改变时,所有行为操作所用到和模板所渲染的数据同时都会发生同步变化。

不同点

Data 被称之为动态数据的原因,在各自实例中,在任何情况下,我们都可以随意改变它的数据类型和数据结构,不会被任何环境所影响。

Props 被称之为静态数据的原因,在各自实例中,一旦在初始化被定义好类型时,基于 Vue 是单向数据流,在数据传递时始终不能改变它的数据类型。

更为关键地是,对数据单向流的理解,props的数据都是通过父组件或者更高层级的组件数据或者字面量的方式进行传递的,不允许直接操作改变各自实例中的props数据,而是需要通过别的手段,改变传递源中的数据。

data 选项

当一个实例创建的时候,Vue会将其响应系统的数据放在data选项中,当这些属性的值发生改变时,视图将会产生“响应”,即匹配更新为新的值。初始定行的行为代码也都会随着响应系统进行一个映射。

而 data 选项中的数据在实例中可以任意改变,不受任何影响,前提必须数据要跟逻辑相辅相成。

初始化映射<template> <div> <p v-if='boolean'>true</p> <p v-for='value in obj'>{{value}}</p> <p v-for='item in list'>{{item}}</p> <p>{{StringMsg}}</p> <p>{{NumberMsg}}</p> </div></template><script> export default { data () { return { obj : {a:'1',b:'2',c:'3'}, list:['a','b','c'], boolean : true, StringMsg : 'hello vue', NumberMsg : 2.4, } } }</script>

运行代码时,在data选项里定义了五种数据类型,通过指令和{{}}进行渲染,证实了data选项里可以定义任何数据类型。

视图与数据映射<template> <div> <p>{{StringMsg}}</p> <p>{{NumberMsg}}</p> <button @click='changeData'>改变数据</button> </div></template><script> export default { data () { return { StringMsg : 'hello vue', NumberMsg : 2.4 } }, methods: { changeData () { this.StringMsg = 2.4; this. NumberMsg = 'hello vue' } } }</script>

每个.vue 的文件则就是一个实例,在 data 中定义了两种数据:

String 类型 Number 类型 同时还定义了一个 changeData 事件。

在运行代码时候,data选项已经进入了Vue的响应系统里,model层(数据层)与view层(视图层)进行了对应的映射,任何数据类型都可以定义。

当用户发生点击操作的时候,同时可以把 StringMsg, NumberMsg 的数据对调,充分说明了,无论值和类形都可以进行随意转换。

行为与数据的映射<template> <div> <p>{{StringMsg}}</p> <p>{{NumberMsg}}</p> <button @click='changeData'>改变数据</button> <button @click='findData'>查看数据</button> </div></template><script> export default { data () { return { StringMsg : 'hello vue', NumberMsg : 2.4 } }, methods: { changeData () { this.StringMsg = 2.4; this.NumberMsg = 'hello vue' }, findData () { console.log(`StringMsg: ${this.StringMsg}`) console.log(`NumberMsg: ${this.NumberMsg}`) } } }</script>

改变数据以后,通过点击 findData 事件来进行验证,虽然在初始化定义好了行为数据的检测代码,但是当数据在执行 findData 之前先执行 changeData,一旦改变 data 选项里的数据时,findData 里对应的数据同时也会进行相应的映射。

this.StringMsg //=> 2.4this.NumberMsg //=>‘hello vue’五 、总结:data 选项里的数据是灵活的可以定义任何数据类型也可以改变成任何数据类型当数据变化时,视图和行为绑定的数据都会同步改变props使用props传递数据作用域是孤立的,它是父组件通过模板传递而来,想接收到父组件传来的数据,需要通过props选项来进行接收。子组件需要显示的
本文链接地址:https://www.jiuchutong.com/zhishi/300107.html 转载请保留说明!

上一篇:【C】Array(c++ array)

下一篇:前端实战|React18极客园——登陆模块(token持久化、路由拦截、mobx、封装axios)(前端实战面试题)

  • 美团帮送订单怎么操作流程(美团帮送订单怎么结算的)

    美团帮送订单怎么操作流程(美团帮送订单怎么结算的)

  • iphone8屏幕是lcd还是oled(iphone8屏幕是什么牌子)

    iphone8屏幕是lcd还是oled(iphone8屏幕是什么牌子)

  • 华为nova5可不可以无线充电(华为nova5可不可以无线反向充电)

    华为nova5可不可以无线充电(华为nova5可不可以无线反向充电)

  • 怎么查看qq密码是多少(自己怎么查看qq密码)

    怎么查看qq密码是多少(自己怎么查看qq密码)

  • 三星c7快充怎么开启(三星如何快充)

    三星c7快充怎么开启(三星如何快充)

  • qq怎么不用手机验证码登录(qq怎么不用手机号码注册)

    qq怎么不用手机验证码登录(qq怎么不用手机号码注册)

  • 小米手环绑定不上怎么办(小米手环绑定不了是怎么回事)

    小米手环绑定不上怎么办(小米手环绑定不了是怎么回事)

  • 先科sast怎么连接蓝牙(先科怎么连接手机)

    先科sast怎么连接蓝牙(先科怎么连接手机)

  • 触屏排线断了能接上吗(屏幕排线断了要换整个屏幕吗)

    触屏排线断了能接上吗(屏幕排线断了要换整个屏幕吗)

  • 表格不能上下移动(表格不能上下移怎么设置)

    表格不能上下移动(表格不能上下移怎么设置)

  • 三星手机浏览器崩溃怎么解决(三星手机浏览器下载)

    三星手机浏览器崩溃怎么解决(三星手机浏览器下载)

  • 小米手表color可以回微信吗(小米手表color可以下载QQ吗)

    小米手表color可以回微信吗(小米手表color可以下载QQ吗)

  • 把文件从远程计算机传送到本地计算机的过程称为什么(把文件从远程计算机拷贝到本地)

    把文件从远程计算机传送到本地计算机的过程称为什么(把文件从远程计算机拷贝到本地)

  • 闲鱼不点开消息会显示已读吗(闲鱼点击想要没有发消息会被看到吗)

    闲鱼不点开消息会显示已读吗(闲鱼点击想要没有发消息会被看到吗)

  • 京东账户余额在哪里找到(京东金融如何注销账户)

    京东账户余额在哪里找到(京东金融如何注销账户)

  • 淘宝买家星级怎么算(淘宝买家星级怎么划分)

    淘宝买家星级怎么算(淘宝买家星级怎么划分)

  • 怎么注册新的微信号(怎么注册新的微博号)

    怎么注册新的微信号(怎么注册新的微博号)

  • 声卡都有哪些种类(声卡都有啥)

    声卡都有哪些种类(声卡都有啥)

  • 电脑自带麦克风吗(电脑自带麦克风在哪)

    电脑自带麦克风吗(电脑自带麦克风在哪)

  • 在别人电脑上登录微信没退怎么办(在别人电脑上登微信是否安全)

    在别人电脑上登录微信没退怎么办(在别人电脑上登微信是否安全)

  • 企业微信设置部门职务(企业微信设置部门不可见)

    企业微信设置部门职务(企业微信设置部门不可见)

  • 一个4g基站能覆盖多远(一个4g基站能覆盖多少用户)

    一个4g基站能覆盖多远(一个4g基站能覆盖多少用户)

  • 小米怎么取消仅在wifi下载(小米怎么取消仅自动续费)

    小米怎么取消仅在wifi下载(小米怎么取消仅自动续费)

  • 苹果8有animoji表情吗(iphone8可以用手表解锁吗)

    苹果8有animoji表情吗(iphone8可以用手表解锁吗)

  • 苹果手机怎么样设置字体(苹果手机怎么样把旧手机的所有东西转到新手机)

    苹果手机怎么样设置字体(苹果手机怎么样把旧手机的所有东西转到新手机)

  • 美团众包有哪些订单类型(美团众包有哪些兼职)

    美团众包有哪些订单类型(美团众包有哪些兼职)

  • sai2笔刷怎么导入(sai2笔刷怎么导入abr笔刷)

    sai2笔刷怎么导入(sai2笔刷怎么导入abr笔刷)

  • Linux系统下为Gitlab配置邮件提醒的方法详解(linux中git命令)

    Linux系统下为Gitlab配置邮件提醒的方法详解(linux中git命令)

  • window.location.href的用法(window.location.href返回值)

    window.location.href的用法(window.location.href返回值)

  • 个人退税需要多少天
  • 印花税申报缴纳错误,怎么办
  • 息税前利润怎么算
  • 员工外出办事报备制度
  • 财务报表没报会影响出口退税吗为什么
  • 母子公司的关联交易怎么看
  • 母公司出售子公司给另一家子公司
  • 承兑汇票区别
  • 建筑企业外地预缴
  • 一般纳税人减免增值税政策
  • 小微企业免税销售额和其他免税销售额
  • 营业执照注销还需要交钱吗
  • 延期申报预缴税款比例
  • 逾期缴纳车辆购置税后情况说明怎么写
  • 奖励给优质供应商会计处理怎么做?
  • 在建工程非应税项目有哪些?
  • 别人给的发票一直不开
  • 增值税专用发票的税率是多少啊
  • 产品成本核算的一般程序
  • 承租人转租需要退押金吗
  • 对外投资增长过快
  • 施工项目直接成本和间接成本
  • 注册资本需要缴清吗
  • 电脑中毒蓝屏了怎么办修复
  • 使用U盘安装win7出现找不到任何设备驱动程序
  • php递归函数遍历数组
  • 不动产在建工程领用原材料的分录
  • 电脑网络提示ip地址错误怎么办
  • vue知识点总结
  • 可视化大屏的几种模式
  • 工程师模式有什么用
  • 固定资产转为投资性房地产公允价值
  • 存货非正常损失可以所得税前扣除吗
  • 代扣代缴个税手续费返还文件
  • MySQL中用通用查询日志找出查询次数最多的语句的教程
  • vue+ele
  • 季末资产总额怎么计算
  • 应收补贴款是什么
  • 0税率发票什么意思
  • 送货单和收款收据的区别
  • 房地产销售老项目增值税
  • 小规模第一次申报流程
  • 个人补缴的医保有钱返吗
  • 企业的业务招待费属于什么费用
  • 普通发票忘记开数量和单价可以用吗?
  • 当月红冲上月开具的增值税
  • 公司自己搭建的房子出租可以按投资性房地产吗
  • 应付账款现金折扣会计分录
  • 以前年度应付款少记怎么入账
  • 确认递延所得税资产账务处理
  • 固定资产清理时累计折旧提完了怎么账务处理
  • 主营业务收入和营业外收入的区别
  • sql server索引怎么用
  • win8.1所有程序在哪里
  • 三星笔记本预装win8改win7好吗
  • linux操作系统版本有哪些
  • linux主机名是什么意思
  • centos sh
  • linux sleep命令有什么用
  • linux字符串命令
  • win7定时静音
  • cortana小娜怎么用
  • js实现倒计时60s
  • ecmascript6入门
  • opengles入门
  • shell脚本入门详解
  • jquery滚动条滚动到指定位置
  • nodejs深入浅出pdf百度云
  • js过滤字符串中的特殊字符
  • jquery escape
  • js tab切换
  • 一起学下载软件
  • 咸阳国税局长是哪里人
  • 发票缴销办理流程图
  • 租房完税证明需要多长时间内的
  • 非正常户转为正常户申请怎样写
  • 广西职称申报系统入口220
  • 怎么查票据真伪
  • 山东省税务局网站首页
  • 地税局属于市直单位吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设