经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Vue.js » 查看文章
vue?实现动态设置元素的高度
来源:jb51  时间:2022/8/15 15:41:03  对本文有异议

vue动态设置元素的高度

1. 添加样式绑定

  1. <div class="container" :style="{height: scrollerHeight}">
  2. </div>

2. 添加属性计算

  1. computed: {
  2. ? ? // 滚动区高度?
  3. ? ? scrollerHeight: function() {
  4. ? ? ? return (window.innerHeight - 50) + 'px'; //自定义高度需求
  5. ? ? }
  6. ? }

获取元素高度总是不准确的问题

今天老大没安排活干,也不想划水,于是打算用一个websocket写一个简易的聊天系统。

后端代码很容易就写好,但是前端是真的难搞,遇到一个很严重的问题:

当发送一条消息或者是收到一条消息,消息展示界面不能滑到最下面,展示最新消息,于是,经过一段时间的修改,发送新消息时,滚动条虽然能下滑,但是滑不到最底部,于是我添加了一个按钮,使用按钮,将滚动条滑到最底部是可行的。又使用debug调试,发现:vue会先执行你的其它方法,再渲染页面,导致总是只能滑到上一条消息展示的高度。

于是我再百度,发现:重置数据后,获取dom元素高时,dom元素还未渲染完毕,(可能这就是为什么只能滑到上一条消息展示的地方)

解决办法

  • this.$nextTick()函数 :在下次DOM更新循环结束之后执行延迟回调
  1. this.$nextTick(()=>{?
  2. ? ? ?this.goBottom(); // 滚动条滑到底部的方法
  3. ? ?})

补充:使用vue获取一个指定的元素的高度,可以使用vue的ref

当ref加在普通的元素上,使用this.ref.name获取到的是dom元素

下面是聊天的html代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. ? ? <meta charset="UTF-8">
  5. ? ? <title>微聊</title>
  6. ? ? <script src="../static/js/vue.js"></script>
  7. ? ? <style>
  8. ? ? ? ? .cheet-box{
  9. ? ? ? ? ? ? width: 592px;
  10. ? ? ? ? ? ? height: 160px;
  11. ? ? ? ? }
  12. ? ? ? ? .box{
  13. ? ? ? ? ? ? /*margin: 0 auto;*/
  14. ? ? ? ? ? ? /*overflow:auto;*/
  15. ? ? ? ? ? ? overflow-y: auto;
  16. ? ? ? ? ? ? overflow-x: hidden;
  17. ? ? ? ? ? ? font-family: "微软雅黑 Light";
  18. ? ? ? ? ? ? width: 600px;
  19. ? ? ? ? ? ? height: 300px;
  20. ? ? ? ? ? ? background-color: #ecece9;
  21. ? ? ? ? ? ? border: none;
  22. ? ? ? ? ? ? box-shadow: aliceblue;
  23. ? ? ? ? ? ? margin-bottom: 20px;
  24. ? ? ? ? ? ? padding: 50px;
  25. ? ? ? ? }
  26. ? ? ? ? .to,.me{
  27. ? ? ? ? ? ? word-wrap:break-word;
  28. ? ? ? ? ? ? display: block;
  29. ? ? ? ? ? ? width: 50%;
  30. ? ? ? ? ? ? padding: 26px;
  31. ? ? ? ? ? ? border-radius: 10px;
  32. ? ? ? ? ? ? background-color: #fff;
  33. ? ? ? ? ? ? margin: 5px 0 10px 0;
  34. ? ? ? ? }
  35. ? ? ? ? .system-log{
  36. ? ? ? ? ? ? padding: 5px 0;
  37. ? ? ? ? ? ? color: darkgrey;
  38. ? ? ? ? ? ? text-align: center;
  39. ? ? ? ? }
  40. ? ? ? ? .to{
  41. ? ? ? ? ? ? float: left;
  42. ? ? ? ? }
  43. ? ? ? ? .me{
  44. ? ? ? ? ? ? float: right;
  45. ? ? ? ? }
  46. ? ? </style>
  47. </head>
  48. <body onbeforeunload="checkLeave()">
  49. ? ? <div id="app">
  50. ? ? ? ? <div class="box" id="box" ref="getHeight">
  51. ? ? ? ? ? ? <div v-for="item in messageArray">
  52. <!-- ? ? ? ? ? ? ? ?<div class="system-log">连接成功...</div>-->
  53. ? ? ? ? ? ? ? ? <div class="to" v-if="item.username != message.username" v-text="item.text">
  54. ? ? ? ? ? ? ? ? </div>
  55. ? ? ? ? ? ? ? ? <div class="me" v-else ?v-text="item.text">
  56. ? ? ? ? ? ? ? ? ? ? aaaaaa
  57. ? ? ? ? ? ? ? ? </div>
  58. ? ? ? ? ? ? </div>
  59. ? ? ? ? </div>
  60. ? ? ? ? <div>
  61. ? ? ? ? ? ? <input type="text" v-model="message.username">
  62. ? ? ? ? </div>
  63. ? ? ? ? <div>
  64. ? ? ? ? ? ? <textarea type="text" v-model="message.text" class="cheet-box"></textarea>
  65. ? ? ? ? ? ? <input @click="sendMessage()" type="button" value="发送"/>
  66. ? ? ? ? ? ? <input @click="goBottom()" type="button" value="底部"/>
  67. ? ? ? ? </div>
  68. ? ? </div>
  69. ? ? <script>
  70. ? ? ? ? function checkLeave(){
  71. ? ? ? ? ? ? sessionStorage.setItem('key','hello');
  72. ? ? ? ? ? ? localStorage.setItem('2','3')
  73. ? ? ? ? }
  74. ? ? ? ? var websocket ;
  75. ? ? ? ? var vm = new Vue({
  76. ? ? ? ? ? ?el:'#app',
  77. ? ? ? ? ? ? created(){
  78. ? ? ? ? ? ? ? ? this.initWebSocket();
  79. ? ? ? ? ? ? },
  80. ? ? ? ? ? ? data:{
  81. ? ? ? ? ? ? ? ? ? ? message:{
  82. ? ? ? ? ? ? ? ? ? ? ? ? username:'',
  83. ? ? ? ? ? ? ? ? ? ? ? ? text:'',
  84. ? ? ? ? ? ? ? ? ? ? },
  85. ? ? ? ? ? ? ? ? messageArray:[
  86. ? ? ? ? ? ? ? ? ],
  87. ? ? ? ? ? ? },
  88. ? ? ? ? ? ? methods:{
  89. ? ? ? ? ? ? ? ?initWebSocket(){
  90. ? ? ? ? ? ? ? ? ? ?if (typeof (WebSocket)=="undefined"){
  91. ? ? ? ? ? ? ? ? ? ? ? ?alert('浏览器不支持WebSocket')
  92. ? ? ? ? ? ? ? ? ? ?}else {
  93. ? ? ? ? ? ? ? ? ? ? ? ?console.log('浏览器支持websocket')
  94. ? ? ? ? ? ? ? ? ? ? ? ?websocket = new WebSocket("ws://localhost:8080/ws/asset");
  95. ? ? ? ? ? ? ? ? ? ? ? ?//连接打开事件
  96. ? ? ? ? ? ? ? ? ? ? ? ?websocket.onopen = function() {
  97. ? ? ? ? ? ? ? ? ? ? ? ? ? ?console.log("Socket 已打开");
  98. ? ? ? ? ? ? ? ? ? ? ? ? ? ?var obj = {
  99. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?text:'',
  100. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?username: '',
  101. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?log:'连接成功!'
  102. ? ? ? ? ? ? ? ? ? ? ? ? ? ?}
  103. ? ? ? ? ? ? ? ? ? ? ? ? ? ?websocket.send(JSON.stringify(obj));
  104. ? ? ? ? ? ? ? ? ? ? ? ?};
  105. ? ? ? ? ? ? ? ? ? ? ? ?//收到消息事件
  106. ? ? ? ? ? ? ? ? ? ? ? ?websocket.onmessage = function(msg) {
  107. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?vm.pushArray(msg.data)
  108. ? ? ? ? ? ? ? ? ? ? ? ?};
  109. ? ? ? ? ? ? ? ? ? ? ? ? ? ?//连接关闭事件
  110. ? ? ? ? ? ? ? ? ? ? ? ?websocket.onclose = function() {
  111. ? ? ? ? ? ? ? ? ? ? ? ? ? ?console.log("Socket已关闭");
  112. ? ? ? ? ? ? ? ? ? ? ? ?};
  113. ? ? ? ? ? ? ? ? ? ? ? ?//发生了错误事件
  114. ? ? ? ? ? ? ? ? ? ? ? ?websocket.onerror = function() {
  115. ? ? ? ? ? ? ? ? ? ? ? ? ? ?alert("Socket发生了错误");
  116. ? ? ? ? ? ? ? ? ? ? ? ?}
  117. ? ? ? ? ? ? ? ? ? ? ? ?//窗口关闭时,关闭连接
  118. ? ? ? ? ? ? ? ? ? ? ? ?window.unload=function() {
  119. ? ? ? ? ? ? ? ? ? ? ? ? ? ?websocket.close();
  120. ? ? ? ? ? ? ? ? ? ? ? ?};
  121. ? ? ? ? ? ? ? ? ? ?}
  122. ? ? ? ? ? ? ? ?},
  123. ? ? ? ? ? ? ? ? sendMessage(){
  124. ? ? ? ? ? ? ? ? ? ? websocket.send(JSON.stringify(this.message));
  125. ? ? ? ? ? ? ? ? ? ? this.message.text = ''
  126. ? ? ? ? ? ? ? ? },
  127. ? ? ? ? ? ? ? ? pushArray(msg){
  128. ? ? ? ? ? ? ? ? ? ? let message = JSON.parse(msg);
  129. ? ? ? ? ? ? ? ? ? ? console.log(message)
  130. ? ? ? ? ? ? ? ? ? ? if (message.username!='' && message.text!=''){
  131. ? ? ? ? ? ? ? ? ? ? ? ? this.messageArray.push(message)
  132. ? ? ? ? ? ? ? ? ? ? ? ? this.$nextTick(()=>{
  133. ? ? ? ? ? ? ? ? ? ? ? ? ? ? this.goBottom();
  134. ? ? ? ? ? ? ? ? ? ? ? ? })
  135. ? ? ? ? ? ? ? ? ? ? }
  136. ? ? ? ? ? ? ? ? },
  137. ? ? ? ? ? ? ? ? goBottom(){
  138. ? ? ? ? ? ? ? ? ? ? let box = document.getElementById('box');
  139. ? ? ? ? ? ? ? ? ? ? box.getBoundingClientRect().height
  140. ? ? ? ? ? ? ? ? ? ? box.scrollTo(0,box.scrollHeight-box.clientHeight)
  141. ? ? ? ? ? ? ? ? }
  142. ? ? ? ? ? ? }
  143. ? ? ? ? })
  144. ? ? </script>
  145. </body>
  146. </html>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持w3xue。 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号