|
本帖最后由 管理员 于 2019-7-12 18:04 编辑
使用过list组件的开发人员都知道,list中的list-item组件在使用for、if的时候务必要保证当前item的唯一性,否则会导致渲染奔溃。
我整理出一个最精简的含有list组件的demo,这是一个有问题的demo:
- <template>
- <div>
- <list class="items">
- <block for="{{(k,v) in productList}}">
- <list-item type="{{'product-'+v.tags.length}}" class="item">
- <text class="title">{{v.title}}</text>
- <text class="tags" for="{{(k2,v2) in v.tags}}" if="{{k2<3}}">
- <span class="v">{{v2}}</span>
- </text>
- </list-item>
- </block>
- </list>
- </div>
- </template>
-
- <script>
- export default {
- private: {
- productList: [
- {
- title: 'this is a',
- tags: [
- 'a1', 'a22', '', 'a4', 'a5'
- ]
- },
- {
- title: 'this is b',
- tags: [
- 'b1', 'b2', 'b3', 'a4', 'b5'
- ]
- },
- {
- title: 'this is c',
- tags: [
- 'c1', 'c2', 'c3', 'c4', 'c5'
- ]
- }
- ]
- },
- }
- </script>
-
- <style lang="less" scoped>
- .items {
- width: 100%; height: 100%; flex-direction: column; background-color: #f8f8f8;
- .item {
- flex-direction: column;
- background-color: #fff;
- margin: 10px;
- padding: 10px;
- .title {
- font-weight: bold;
- }
- .tags {
- flex-direction:row;
- .v {
- background-color: #f6f6f6; padding: 0 10px; margin: 10px;
- }
- }
- }
- }
- </style>
复制代码
运行后,会发现,一上来就奔溃了,查下dom渲染结构会发现,会发现,出 无限输出a2,直至内存溢出,挂了。
解决方案:
1、前端上去更改模版上的for、if的关系:
- <template>
- <div>
- <list class="items">
- <block for="{{(k,v) in productList}}">
- <list-item type="{{'product-'+v.tags.length}}" class="item">
- <text class="title">{{v.title}}</text>
- <text class="tags" for="{{(k2,v2) in v.tags}}">
- <block if="{{k2<3}}">
- <span class="v">{{v2}}</span>
- </block>
- </text>
- </list-item>
- </block>
- </list>
- </div>
- </template>
复制代码
2、后端去修正返回的原始数据,或者前端拿到后,预处理一下数据,把空字符串变成 空格,也能避免:
- <script>
- export default {
- private: {
- productList: [
- {
- title: 'this is a',
- tags: [
- 'a1', 'a22', ' ', 'a4', 'a5'
- ]
- },
- {
- title: 'this is b',
- tags: [
- 'b1', 'b2', 'b3', 'a4', 'b5'
- ]
- },
- {
- title: 'this is c',
- tags: [
- 'c1', 'c2', 'c3', 'c4', 'c5'
- ]
- }
- ]
- },
- }
- </script>
复制代码
这是我踩过的坑,希望后来的人可以避免,或者期待官方可以尽快修复这种问题。
|
|