problem: 记一次聊天框的表情包弹框不显示的找问题过程
左边是列表,包含了群和成员,右侧是聊天窗口。点击群列表,右侧显示群聊窗口,点击学员,右侧显示私聊窗口。
群聊窗口和私聊窗口是不同的组件,但是窗口中的子组件,例如窗口的头部、中间内容部分、输入框都是复用的同一个组件。
一个花了很长时间才定位到问题的bug:
群聊窗口的表情包弹窗怎么也不显示,但是私聊窗口的表情包弹窗总是可以正常显示,复用的都是同一个组件,而且本地都是正常的,到线上就出现这个问题。
起初完全没有入口定位,最初猜测是数据渲染问题,输入框组件中加载表情包的逻辑代码在组件没有渲染之前就执行了,然后给这段逻辑代码加了定时器延时。
仍然无效。
这个bug停滞了几天,感觉自己的思维力不够,不知道怎么去定位这个bug,花时间去看了《思维力》这本书,然后再来看这个bug。
首先界定问题:
这里适合思维力里面说的界定问题中的第三条,探究问题本质。
问题本质是什么呢?本地是可以的,线上的不可以,那么就应该对比一下线上和本地有什么不同。线上的数据扒下来在本地运行一下,也不行,和线上表现一致;那么对比一下线上的数据和本地有什么不同,发现线上的和本地的字段格式不同在于多了一个id字段;已经找到了问题的苗头,利用思维力中的5w来探究问题的根本,为什么这个id字段会导致群聊和私聊的表情包显示有差异?公用的组件中拿这个id字段有做什么逻辑处理?去看下组件,发现给组件用id绑定了key。去掉key,问题解决了!!解决这个问题的关键其实是发现当从私聊切换到群聊时,表情包中的内容元素不见了,display为none,让我意识到有一种在代码中添加了控制元素显示与隐藏的逻辑,所以是代码中有写什么影响元素显示的逻辑。如果掌握了找问题的方法论,完全可以不依靠经验去找问题本质。
回到问题本身:
vue中为了快速渲染元素会复用已有元素,复用就意味着会保留上一次的状态,如果不希望元素复用,可以给元素绑定一个唯一的key。
那为什么这里给聊天框中的子组件——输入框组件绑定了一个key,会导致群聊窗口表情包不能正常渲染呢?
这个问题涉及到 Vue的虚拟DOM算法,这里就不总结了。
总结:
这个问题虽然是自己给自己挖了一个坑,但是在解决这个问题的过程中,我真正的意识到真正解决问题的高手,不是在于他有多了解这个问题,对这个问题相关的知识积累了多少经验(就像《思维力》这本书中说的一样),而在于他具备解决问题的模式,利用解决问题的逻辑去推断出问题的本质原因。
当我最后用理性的逻辑推出这个问题的根本的时候,我真的感受到了一阵成就感,这种把一个自己当初完全没办法解决的问题,最后靠逻辑解决的成就感真的太让人兴奋了。希望2019年能有更多这样的体验。
problem: 记一次聊天框的表情包弹框不显示的找问题过程的更多相关文章
- 使用mint-ui中弹框组件与原生弹框阻止父页面不滑动方法
1,使用mint-ui框架中<mt-popup></mt-popup>,在组件中加入 lockScroll="true" 阻止父页面不滑动. 2,原生弹框中 ...
- Bootstrap学习笔记(9)--模态框(登录/注册弹框)
说明: 1. 上来一个ul先把登录和注册两个链接扔进去,ul的类nav,navbar-nav是导航条,navbar-right让他固定在右侧.每个li的里面,data-toggle="mod ...
- iview框架 两侧弹框 出现第二层弹框 一闪而过的问题
分析原因:寡人怀疑可能是,两层弹出框 采用的是一个开关值,发生了覆盖 解决方式 是在第二层弹框外套层计时器 源代码如下: 修改后为:
- vue中超简单的方法实现点击一个按钮出现弹框,点击弹框外关闭弹框
效果图展示: View层 <template> <div> <div class="mask" v-if="showModal" ...
- 基于uni-app全端弹框组件uaPopup「兼容h5+小程序+app端|nvue」
uniapp兼容多端自定义模态弹框组件UAPopup ua-popup 一款轻量级的uniapp自定义弹窗组件.汇集了android.ios和微信弹窗效果(msg消息.alert提示框.dialog对 ...
- 【前端开发】--js弹框
js三种弹框 一.普通弹框 这类弹框就是仅仅是个提示作用,并不会做其它操作 关键词:alert() 这个没啥好说的,就是一个弹框. 二.判断弹框 这类框有一个判断作用 关键字:conf ...
- angularJs $mdDialog和$uibModal弹框关闭传值
$mdDialog以一个点击button按钮出现弹框为例: $scope.btn=function($event,row){ var dScope = $scope.$new(true); dScop ...
- 如何优雅的写一个Vue 的弹框
写Vue或者是react 都会遇见弹框的问题.也尝试了多种办法来写弹框,一直都不太满意,今天特地看了一下 Element UI 的源码,模仿着写了一个简易版. 大概有一下几个问题: 1.弹框的层级问题 ...
- html自定义弹框
一.要实现的功能 1.弹框弹出时有遮罩 2.弹框内的文字过多时右侧有滚动条 3.根据执行结果变更弹框title的样式 二.具体实现 思路:定义一个有宽高的div,默认隐藏,当要显示时,设置为dis ...
随机推荐
- Linux命名空间
Linux Namespaces机制提供一种资源隔离方案.PID,IPC,Network等系统资源不再是全局性的,而是属于特定的Namespace.每个Namespace里面的资源对其他Namespa ...
- echarts 折线图点击高亮
echarts中注册事件很多 ,记录下今天做的折线图点击高亮: 查了api,看了半天,发现折线图点击时只能做到圆点变大,并不能实现点击线条,整条线条高亮,也真是醉了. 上图: 如图所示,只能圆点变大. ...
- redis命令Set类型(七)
集合类型 集合类型:无序.不可重复 列表类型:有序.可重复 命令: 1>增加/删除元素 语法:SADD key member [member -] 127.0.0.1:6379> sadd ...
- [转载]JS中 map, filter, some, every, forEach, for in, for of 用法总结
转载地址:http://codebay.cn/post/2110.html 1.map 有返回值,返回一个新的数组,每个元素为调用func的结果. let list = [1, 2, 3, 4, 5] ...
- thinkphp5.0--编写api,返回json格式
前几天没有写php代码,今天写了一下,今天的任务主要是构建自己的异常体系类,出现一个问题,就是返回结果不是json格式,而是一个页面,我找了一两个小时,没有找到问题,以为代码的问题,用断点调试了一通, ...
- 关于grub修复引导系统
这周末遇到停电,机房的一台数据服务器启动不了,开机硬件自检以后,就停留在一个黑屏状态左上角有光标闪烁,却一直进入不了系统. 还好手里有centos6.5的系统盘,进入修复选项,具体进入修复请参照这里 ...
- VB中获取网页数据
以下是在Microsoft Visual Basic 6.0 中文版下做的 VB可以抓取网页数据,所用的控件是Inet控件. 第一步:单击工程-->部件 选择Microsoft Internet ...
- robotframework之去除空格、去掉前面的0、增加空格换行符的方法,两个字符之间的拼接
1.去除空格 A)若需要去除两个拼接字符之间的空格,可以使用robotframework中的关键词Catenate,需要注意的是SEPARATOR=一定需要大写 B)若在一个字符串中存在空格,且需要去 ...
- Jrebel 配置
先下载插件 http://139.199.89.239:1008/88414687-3b91-4286-89ba-2dc813b107ce http://jrebel.autoseasy.cn/xix ...
- 《Self-Attention Generative Adversarial Networks》里的注意力计算
前天看了 criss-cross 里的注意力模型 仔细理解了 在: https://www.cnblogs.com/yjphhw/p/10750797.html 今天又看了一个注意力模型 < ...