gpt4 book ai didi

javascript - VueJS 渲染 VNode

转载 作者:搜寻专家 更新时间:2023-10-30 22:42:42 24 4
gpt4 key购买 nike

tl;博士:

给定一个 VueJS VNode对象,如何获取渲染后生成的 HTML 元素?

例如:

> temp1
VNode {tag: "h1", data: undefined, children: Array(1), text: undefined, elm: undefined, …}
> temp1.children[0]
VNode {tag: undefined, data: undefined, children: undefined, text: "Test", elm: undefined, …}
> doSomething(temp1)
<h1>Test</h1>

目标

我正在尝试围绕 DataTables.net 构建一个小型 VueJS 包装器图书馆。

为了在我的标记中模仿 HTML 表格的行为,我想要如下内容:

<datatable>
<thead>
<tr>
<th>Name</th>
<th>Age</th>
<th>Salary</th>
</tr>
</thead>
<tbody>
<datatable-row v-for="person in people">
<td>{{ person.name }}</td>
<td>{{ person.age }}</td>
<td>{{ person.salary }}</td>
</datatable-row>
</tbody>
</datatable>

到目前为止我做了什么

我已经开始按如下方式实现它:

DataTable.vue

<template>
<table ref="table" class="display table table-striped" cellspacing="0" width="100%">
<slot></slot>
</table>
</template>

<script>
/* global $ */
export default {
data: () => ({
instance: null
}),
mounted() {
this.instance = $(this.$refs.table).dataTable();
this.$el.addEventListener("dt.row_added", function(e) {
this.addRow(e.detail);
});
},
methods: {
addRow(row) {
// TODO <-----
console.log(row);
}
}
};
</script>

DataTableRow.vue

<script>
/* global CustomEvent */
export default {
mounted() {
this.$nextTick(() => {
this.$el.dispatchEvent(new CustomEvent("dt.row_added", {
bubbles: true,
detail: this.$slots.default.filter(col => col.tag === "td")
}));
});
},
render() { return ""; }
};

目前的作用:

  • 当页面加载时,DataTable 被初始化。因此列标题的格式正确,我在左下角看到“显示 0 到 0 个条目”
  • CustomEvent能够冒出<tbody>并被 DataTable 捕获element 成功(规避VueJS中不能监听slot事件的限制)

做什么:

  • 实际添加行

我的事件给我一个 VNode 的数组对象。有一个VNode我行中的每列。 DataTables API 有一个 addRow可以这样调用的函数:

this.instance.row.add(["col1", "col2", "col3"]);

在我的例子中,我希望 VNode 渲染的结果元素是这个数组中的元素。

var elems = [];
for (var i = 0; i < row.length; i++)
elems[i] = compile(row[i]);
this.instance.row.add(elems);

不幸的是这个compile方法让我望而却步。我尝试浏览 VueJS 文档并尝试使用谷歌搜索,但没有成功。我尝试手动传递 createElement函数(传递给 render 方法的参数),但这引发了错误。我如何让 VueJS 在不将结果注入(inject) DOM 的情况下呈现 VNode?

最佳答案

我遇到了同样的问题,想对 DataTables.net 的行详细信息模板做基本相同的事情。

一个解决方案可能是创建一个通用组件来呈现 VNode 并以编程方式实例化它。以下是我如何使用数据表的 row.child() API 设置动态详细信息行。

RenderNode.js

export default {
props: ['node'],
render(h, context) {
return this.node ? this.node : ''
}
}

Datatables.vue

从上面包含渲染器组件

import Vue from 'vue'
import nodeRenderer from './RenderNode'

实例化并挂载渲染器得到编译后的HTML

// Assume we have `myVNode` and want its compiled HTML

const DetailConstructor = Vue.extend(nodeRenderer)

const detailRenderer = new DetailConstructor({
propsData: {
node: myVNode
}
})

detailRenderer.$mount()
// detailRenderer.$el is now a compiled DOM element
row.child(detailRenderer.$el).show()

关于javascript - VueJS 渲染 VNode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50556294/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com