【发布时间】:2019-03-17 09:10:40
【问题描述】:
我正在编写一个带有render 函数的轻量级functional component(特别是一个水平<Divider/> 组件),我只需要它渲染一次,以优化更新性能;而且它根本不需要反应,因为它应该只在渲染后作为静态内容。但是,它需要一些基本的道具(例如color、height 等)作为分隔符,因为它实际上是建立在 SVG 之上的。
现在,使用single-file component 中的模板,您可以在包含元素上使用v-once 并将其标记为functional,它基本上可以让您在初始渲染时设置道具——从那时起——它将变为静态且无渲染(这对于此目的非常有用),如下所示:
<template functional>
<div class="divider" v-once>
<svg>
<g>
<path :fill="color" d="Mxx.xxx..."></path>
<!-- And more paths for complex dividers -->
</g>
</svg>
</div>
</template>
虽然按预期工作,但似乎无法使用render 函数在组件上设置相同的VNode.isOnce 标志——进一步confirmed by Evan v-once 是编译级指令,因此不可用在render 函数内部——考虑到如何使用基于模板的组件获得相同的效果,这太糟糕了。
带有render功能的functional组件:
export default {
functional: true,
render(h, context) {
// As a non-static component, this function will always get called
// on each update! How can I apply some static flag at this point?
const data = {
style: {
textAlign: 'center'
}
};
const svgs = [
h('svg', ...)
];
return h(context.props.tag, data, svgs);
}
}
有人对此有任何看法或经验吗?
【问题讨论】: