小白使用 vue2.6.10 的 v-for 遇到的一个问题从而引发了一个对于这一行业的思考,希望有人可以开导我

2019-08-08 21:07:20 +08:00
 zazalu
我遇到的问题是这样的,我描述下:

问题 1:

父组件使用"props"传递一个数组"items"给子组件,

子组件使用 v-for 处理这个"items"来循环打印"item"中的 content 字段内容,

过了一段时间后,我会去触发一次父组件的 items 更新,类似如下代码:

```
this.items = this.items.concat([{id:11, content: "第十一条通知"}])
```

因为 vue 官方文档说过,如果是非变异方法改变数组内容,直接使用"replace a array"的方式,也就是我上面的方式.

所以我认为我的代码是没问题的.

但是事实却痛击了我, 不知道为啥 v-for 循环并没有刷新数据.

于是我先使用{{items}}检查了 props 的数据是否已经更新.

结果是{{items}}确实已经更新了第十一条通知的内容进去.

并且我使用 slice 方法去更新数组内容,是可以的, 就唯独 concat 方法不行

问题 2:

问题 2 是我在问题 1 后出现的一个新问题.

我将{{items}}放到了 v-for 所在组件的后面(问题 1 中我是放在最前面验证的), 这时候神奇的事情发生了.

v-for 居然更新了内容.

所以 vue 内部到底发生了什么... 我该怎么去解... 文档我也上下翻了好几次, google,baidu 了类似问题,但是很遗憾没有和我遇到一样问题的伙伴出现

问题 3:

我依旧不服, 想着在单元测试中也试试会不会存在这个问题,

所以我使用 vue-cli 创建了一个超级简单的 vue 单组件项目作为我的单元测试项目, 然后我将一些核心代码移了过去,重新测试了下

(我强调下, 单元测试的代码肯定是和我真正项目中用的是一样的! )

结果是没有任何问题, v-for 工作完全正常!

我.................................................................................



总结:

到最后, 我没法搞定这个问题(我采用的是问题 2 中描述的折中但是非常不优雅的写法), 感觉内心非常的难受, 关电脑, 回宿舍, 简单的吃了下晚饭, 吃着吃着差点掉眼泪 , 感觉写代码也至少一年多了, 这类问题以前在使用 jsp 的时候其实也遇到过类似的. 结果,一年过去了, 我连这种问题都没法搞定, 还谈什么设计模式,算法呢, 一年来感觉压根没有多大提升, 除了找资料和看英文文档能力感觉比以前强了以外, 能做的无非只有 crud.

这么一个问题, 搞得我焦头烂额,浪费了一下午+晚上几个小时的青春. 我想真诚的问下各位前辈们, 是不是我这种人不适合做程序员
8541 次点击
所在节点    Vue.js
121 条回复
zazalu
2019-08-09 09:18:32 +08:00
@libook 谢谢。 我发帖确实感觉在抱怨。 标题其实也提了希望有人开导下,而不是帮我解决问题。 我在发帖后感觉看到大家的回复,觉得受到了一些鼓舞,所以就继续排查问题了。最终虽然不太完美的解决了。不过感觉我的心境好像发生了某种质的变化,这也是一种提升,所以我感觉我昨天的青春并没有浪费而不再感到难受了。谢谢大家
lscho
2019-08-09 09:18:36 +08:00
具体源码我也没看,但是组件内内容必须放到根元素里是官网提到的。。。https://cn.vuejs.org/v2/guide/components.html#%E5%8D%95%E4%B8%AA%E6%A0%B9%E5%85%83%E7%B4%A0

感觉大部分问题官网都有提到,一般问题都是不仔细看文档导致的
zazalu
2019-08-09 09:22:50 +08:00
@lscho 但是很奇怪的是我项目很多地方都是一样的风格 都没问题,唯独这里必须要根元素包裹
meepo3927
2019-08-09 09:26:02 +08:00
码农调试, 一个问题调一天是常有的事, 这就是成长啊!
SilentDepth
2019-08-09 09:26:36 +08:00
表示不能复现问题。
liximomo
2019-08-09 09:32:40 +08:00
你有那么多时间吐槽,你上个完整复现 demo,给 vue 提个 issue,问题说不定已经解决了?你这样子对待开源项目的 bug 才是让我觉得一片黑暗。
zazalu
2019-08-09 09:38:07 +08:00
@jorneyr 对对,就是这种问题,感觉特别不好问别人,也不知道该不该问别人,看上去一切都是按照文档走的,但就是出问题,问别人,回答无非都是那些最常见的解法(可能你已经在问之前就已经尝试无数次无果的东西),js 用起来很方便,但是有时候又感觉不好控制,总是冷不丁一个神奇的错误冒出来。
liximomo
2019-08-09 09:38:24 +08:00
假设这真是个 bug, 以后还会有其他人不幸的遇到,而他们可能没办法那么幸运的解决,所以请提供一个最小可复现 demo, 使问题曝光并得到解决,让其他人不再同楼主这版焦头烂额。
a852695
2019-08-09 09:40:14 +08:00
写前端你还想明白???
zazalu
2019-08-09 09:42:04 +08:00
@liximomo 我做了这方面努力,我想搞个完整复现 demo 出来,所以我去弄了,弄完后 demo 项目缺一点问题都没有(问题 3 所述)。所以意思就是产生问题的源头可能牵扯到项目更大范围我无法控制的地方。我这么一想,我怂了(也许这个行为就是你说的黑暗吧),我可能需要把全部源码搬上去也说不定。 所以内心还是想着自己解决。 你说的对,我也觉得这么做是不对的。 确实我的确是个弟弟和菜鸡
zazalu
2019-08-09 09:43:27 +08:00
@liximomo 嗯 我今天会继续,心结依旧存在,刚睡醒,打起精神来继续干了
liximomo
2019-08-09 09:47:09 +08:00
@zazalu 可以使用二分法,逐步确定产生影响的代码范围。
karnaugh
2019-08-09 09:47:17 +08:00
有个问题。。。你这个数据 messageItems 是 props 传进来的???那你修改啥啊。。。这操作就好比你要修改你爸妈传给你的基因一样。。。如果你不是写错了(本应在 data 里),那么你这个设计可能有点问题,想操作的话请再往外一层操作
TrickWu
2019-08-09 09:50:31 +08:00
我倒是觉得这种能够稳定复现的最好排查
知道问题出在哪
可以先写个最小 demo 看下结果
再或者就删代码调试
慢慢来
zazalu
2019-08-09 09:51:18 +08:00
@karnaugh props 数据我是父组件里修改的,子组件只是使用 。我一般希望数据采集是在同一个地方发起,然后分发给给个组件去刷新数据的。这样对我来说感觉很有条理
karnaugh
2019-08-09 09:54:57 +08:00
@zazalu 要不把父组件的代码贴来看看?(其实截图效果蛮不错的)毕竟看你如此难受还是想帮你解决一下😂
zazalu
2019-08-09 10:00:12 +08:00
@karnaugh 解决是解决了,就是解决的我有点莫名其妙。 新的一天重新打起精神,我先自己再看看吧。实在不行我就打算曝光我的垃圾源码给大家看了。。谢谢您
iyaozhen
2019-08-09 10:07:17 +08:00
楼主不必沮丧,几天查一个问题很常见。
首先楼主能想优雅的解决方案就已经不错了,很多人都是代码能跑就行
然后就是尝试最小集复现,问题一般都在业务中,要剥离出来,这一步有时候比较难,我的经验是复现问题不能想当然,自己做一些场景裁剪,往往会漏掉一些关键点,还是不断减少变量进行复现。
稳定复现就成功了一半,然后问同事、提 issue、论坛都行
yixiang
2019-08-09 10:07:36 +08:00
几年前过 vue。它的自动更新原理是用 Object.defineProperty 设置 getter/setter,好处是不用像 react 一样调用 setState,坏处是涉及到对象和数组的更新时,会有监听不到,不更新的情况,多半是这个原因。

相关文档: https://cn.vuejs.org/v2/guide/reactivity.html https://cn.vuejs.org/v2/guide/list.html#%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9

相较之下,个人认为 react 的 setState 虽然感觉稍微罗嗦,但没啥大坑,设计上可能更好些。
shintendo
2019-08-09 10:30:28 +08:00
@zazalu 看你的补充,直觉再次告诉我是 key 的问题,你的 new-message 组件里面是什么东西,是不是个 p 元素?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/590284

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX