将渲染方法注入到模板中

问题描述 投票:0回答:3

Vue组件的render方法必须单独使用还是可以与模板结合使用?我的大部分组件都可以使用模板呈现,但只需要使用代码呈现其中的一小部分。如果可能的话,我如何将渲染方法输出与模板结合起来?

组件中的示例:

<template>
   <table>
      <tr>
        // use render method here
      </tr>
      <tr v-for="row in rows">
        // use render method here
      </tr>  
   </table>
</template>

上面的点需要渲染方法来循环遍历数组

$scopedSlots.column
,并根据父级提供的多个
<th>
渲染每个
<td>
<templates v-slot:column={row}>

vue.js vue-component
3个回答
2
投票

据我所知,您可以使用渲染函数或模板 - 但不能同时使用两者。它们不能合并。

要使示例正常工作,您可以使用

v-html
指令,该指令会更新元素的
innerHTML
https://012.vuejs.org/api/directives.html#v-html .

new Vue({
  el: '#el',
  data: {
    rows: ['row1', 'row2', 'row3']
  },
  methods: {
    renderRow(row) {
      return `<td>${row}</td>`;
    }
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="el">
  <table>
    <tr v-for="row in rows" v-html="renderRow(row)">
    
    </tr>
  </table>
</div>


1
投票

我也面临着同样的挑战。这就是我提出你的问题的方式。

正如其他人所说,似乎您可以使用模板或渲染函数,但不能同时使用两者。

我的建议是让组件只处理渲染函数,而父组件可以使用模板方法

所以,按照你的例子

<template>
   <table>
      <tr>
        <component-using-only-render-method />
      </tr>
      <tr v-for="row in rows">
        <component-using-only-render-method />
      </tr>  
   </table>
</template>

我认为这是两全其美且妥协最小的


0
投票
import type { FunctionalComponent, VNode } from 'vue';

// https://vuejs.org/guide/extras/render-function#functional-components
interface Props { renderer: VNode }
const RenderFunction: FunctionalComponent<Props> = (props: Props) => props.renderer;
RenderFunction.props = {
    renderer: {
        type: Object,
        required: true
    }
};
export default RenderFunction;

用途:

<template>
<RenderFunction :renderer="renderer">
</template>
<script setup lang="tsx">
const renderer = (<div></div>);
</script>
© www.soinside.com 2019 - 2024. All rights reserved.