vuerefs(vuerefs和props区别)
本篇文章给大家谈谈vuerefs,以及vuerefs和props区别对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、vue中$refs, $emit, $on, $once, $off的使用详解
- 2、vue获取使用$refs获取自组件方法和属性注意问题
- 3、Vue中ref和$refs的介绍及使用
- 4、vue中$refs的使用记录
vue中$refs, $emit, $on, $once, $off的使用详解
父组运搜件调用子组件的方法,可以传递数据。
父组件:
子组件:
子组件调用父组件的方法并传递数据。
子组件:
父组件:
兄弟组件之间相互传递数据。
首先创建一个vue的空白实例(兄弟组件的桥梁)
子组件a:发送放使用$emit自定义事件把数据带过去。
子组件b:接收方通过$on监听自定义事件的callback接收数据
父组件:
监听一个自定义事件,但是只触发一次。一旦触发之后,监听器就会被移除。
将on变成once,即只执行一次。
移除自定义事件监听器,语法:vm.$off( [event, callback] )
如果没有提供参数,则移除所有的事件监听器;(注意这条,一般在main.js中,移除所有事件绑定)
如果只提供了事件好悄胡,则移除该事件所有的监听器;
如果同时提供了事件与回友拦调,则只移除这个回调的监听器。
[img]vue获取使用$refs获取自组件方法和属性注意问题
ref可以绑定dom节点或字组件,用于获取子组件的方法毕孙和属性。但是只有组件 完成渲染 时,才可以获取得到,且$refs也不是响应式的!
响应式处理可以包括以下几种方法:也就是说,在子组件完成渲染以后,动态修改的data或method,在父组件都可以实时获取。
(1)使用nexttick();子组件 同步 更改数据可反映到父组件上,nexttick属于微任务,也就是说,在本轮事件循环完成之前,可以执行异步操作,从而保证实时性。
(2)如果子组件数据更新是异步,比如说从接口请求回来的这种,使用nexttick,甚至settimeout(()={},0) 都无法读取到已经修改的data,因为在消息队列里面,异步任务作为宏任务始终排在队尾。常发生的情况是,接口请求的数据还没到,父组件中已经读取了refs[componets].xxx的数据,这会导致这个数据打印出来是undefined。
解决办法是:
settimeout(100ms)的等待,这种方法虽然可以解决,但是非常不好,原因是你无法控制接口要多少秒才能到达响应结果
打印结果:
由此可见 settimeout 0 会在接口响应前执行。
使用回调的方式。接口响应完,在then里,通过$emit触发父组件获取refs的方法。这种回调必然可以保证数据已经set到,再次手动获取,即可得到响应手悔链值。
(3)以上分别用于解决子组件同步和异步的问题,但如果子组件使用v-if(资料发现v-for同样会有这种问题),子组件未被渲染,同样会出现$refs无法读取的问题。暴力解决法是,v-if换成v-show。区别在于:v-show不会发生重拍,只是display:none。这种方式虽然可以保证 $refs获取到子组件的数据,但在某些特定的业务场景下(比如子组件前或请求必须在父组件完成某操作的时候进行),会导致一些逻辑错误。因此合理的解决办法是,用(2)中回调的方法。
其他解决办法待更新
Vue中ref和$refs的介绍及使用
在JavaScript中需老颤腊要通过document.querySelector("#demo")来获取dom节点,然后再获取这个节点的值。在Vue中,我们不用获取dom节点,元素绑定ref之后,直接侍滑通过this.$refs即可调用,这样可以减少获取dom节点的消耗。
this.$refs是一个对象,持有当前组件中注册过 ref特性的所有 DOM 元素和子组件实例
当ref和洞培v-for一起使用时,获取到的引用将会是一个数组,包含循环数组源
【1】子组件code:
【2】父组件code:
vue中$refs的使用记录
ref 目前使用过的三种方式:
1、在html的元素中使用rel,可在js中直接调用祥羡该元素,用this.$refs.(ref值) 获取到的是dom元素
2、在vue的组件上加rel,可在js中直接使用该组件包括该组件的方法,用this.$refs.(ref值).方法名()
3、在v-for的循环列中使用rel
避坑:
v-for中使用rel需要绑定 变量 ,即v-bind:rel='变量名'
ref 需要在dom渲染完成后才会有 ,在使用渣宴裤的时候确保dom已经渲染完成。比如在生命周期 mounted(){} 钩子中调用 ,或者 在 this.$nextTick(()={}) 中调用 。
如果rel循环未绑定变量,那就$refs获取获取数组再循环得到使用即可
例子1:在html元素上使用
div id="app"
h1 ref="h1ele"这是h1/h1
hello ref="ho"/hello
button @click="getref"获取h1元素/button
/div
获取注册过 ref 的所有组件或元素
methods: {
getref() {
// 表示从 $refs对象 中, 获取 ref 属性值为: h1ele DOM元素
console.log(this.$refs.h1ele.innerText);
this.$refs.h1ele.style.color = 'red';// 修改html样式
console.log(this.$refs.ho.msg);// 获取组件数据
console.log(this.$refs.ho.test);// 获取组件的方法
}
}
例子2:
html部分
view class="example-body"
button class="button" type="primary" @click="togglePopup('top', 'popup')"顶部弹出 popup/button
button class="button" type="primary" @click="togglePopup('center', 'popup')"如简中间弹出 popup/button
button class="button" type="primary" @click="togglePopup('bottom', 'popup')"底部弹出 popup/button
/view
uni-popup ref="showpopup" :type="type" @change="change"text class="popup-content"{{ content }}/text/uni-popup
uni-popup ref="showtip" :type="type" :mask-click="false" @change="change"
view class="uni-tip"
text class="uni-tip-title"警告/text
text class="uni-tip-content"这是一个通过自定义 popup,自由扩展的 警告弹窗。点击遮罩不会关闭弹窗。/text
view class="uni-tip-group-button"
text class="uni-tip-button" @click="cancel('tip')"取消/text
text class="uni-tip-button" @click="cancel('tip')"确定/text
/view
/view
/uni-popup
js部分
methods: {
togglePopup(type, open) {
switch (type) {
case 'top':
this.content = '顶部弹出 popup'
break
case 'bottom':
this.content = '底部弹出 popup'
break
case 'center':
this.content = '居中弹出 popup'
break
}
this.type = type
this.$nextTick(() = {
this.$refs['show' + open].open()
})
},
cancel(type) {
this.$refs['show' + type].close()
},
change(e) {
console.log('是否打开:' + e.show)
}
},
一般来讲获取DOM元素,需document.querySelector(".class")获取这个dom节点,然后在获取元素的值。
但是用ref绑定之后,我们就不需要在获取dom节点了,直接在上面的元素上绑定rel,然后$refs里面调用就行。
然后在javascript里面这样调用:this.$refs.元素绑定rel 这样就可以减少获取dom节点的消耗了
关于vuerefs和vuerefs和props区别的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。