【Vue.js】使用HoC渲染动态组件列表

编写动态组件列表时,一般会使用如下方式

<component :is="comp.name" v-for="comp in list"></component>
{
  compontents: {
    foo,
    bar,
    baz
  },
  data: {
    list: [{name: 'foo'}, {name: 'bar'}, {name:'baz'}]
  }
}

这样处理会有一个问题,如果需要渲染多个foo组件(或者其他重复的组件),同一组件之间的数据会被缓存对一个组件绑定数据更改会触发其他同名组件数据的更改,但是如果使用<keep-alive>缓存组件状态,则友会导致组件不能重复渲染。

原因

<component />的设计目的,是为了应对像tab标签页类似的场景,这些场景对页面唯一性要求比较高,所以同名的component,数据会缓存

解决方法

使用HoC的思想,建立一个组件容器,利用render创建动态的组件列表:

const components = {
  foo, bar, baz
}

export const ComponentPod {
  functional: true, // 无状态容器
  render(createElement, context) {
    const { data } = context;
    const { name } = data.attrs;
    return createElement(
      'div', 
      null, 
      createElement(components[name], data)
    );
  },
}
<component-pod name="item" v-for="item in list" />
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Vue 实例 属性和方法 每个 Vue 实例都会代理其 data 对象里所有的属性:var data = { a:...
    云之外阅读 6,641评论 0 6
  • 主要还是自己看的,所有内容来自官方文档。 介绍 Vue.js 是什么 Vue (读音 /vjuː/,类似于 vie...
    Leonzai阅读 8,653评论 0 25
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,793评论 1 32
  • 写作,喝酒,城市的白天夜晚跟朋友到处走走 看书,听歌,弹唱,图图画画 找些老旧的书店,看个饿的七荤八素,灰头土脸 ...
    湛蓝黑眼圈凡徒阅读 1,170评论 0 0
  • 五十八回 二心搅乱大乾坤 一体难修真寂灭 听说假猴子占了水帘洞,大圣平地跳起,大骂一声,提云急奔水帘洞。沙僧随后...
    活捉外星人阅读 13,318评论 0 8