VueJ 렌더링 VNode
tl;dr:
VueJ 지정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>
내가 지금까지 한 일
다음과 같이 구현하기 시작했습니다.
데이터 테이블표시하다
<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 to 0 of 0 entries"가 표시됩니다.
- 그
CustomEvent
버블이 되어 버립니다.<tbody>
잡히고 말았어요DataTable
요소 성공(VueJ에서 슬롯에서 이벤트를 수신할 수 없는 제한 없음)
이것이 할 수 없는 일:
- 실제로 행을 추가합니다.
내 이벤트는 나에게 다양한 것을 주고 있다.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
function(에 전달된 파라미터)render
method)에서 에러가 발생하였습니다.결과를 DOM에 삽입하지 않고 VueJ에 VNode 렌더링을 의뢰하려면 어떻게 해야 합니까?
DataTables.net용 행 상세 템플릿에서도 기본적으로 동일한 작업을 수행하고자 하는 동일한 문제가 발생했습니다.
한 가지 해결방법은 일반적인 컴포넌트를 렌더링하는 것입니다.VNode
프로그래밍 방식으로 인스턴스화 할 수 있습니다.데이터 테이블을 사용하여 삽입하는 동적 상세 행에 대한 설정 방법은 다음과 같습니다.row.child()
API.
RenderNode.js
export default {
props: ['node'],
render(h, context) {
return this.node ? this.node : ''
}
}
데이터 테이블표시하다
위에서 렌더러 컴포넌트 포함
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()
다음과 같이 컴포넌트를 정의해야 합니다.
import {createApp} from 'vue';
import {defineAsyncComponent} from "vue";
createApp({
components: {
'top-bar': defineAsyncComponent(() => import('@Partials/top-bar'))
}
}).mount("#app")
언급URL : https://stackoverflow.com/questions/50556294/vuejs-render-vnode
'programing' 카테고리의 다른 글
Vuex 스토어 WATCH와 SUBSCRIBE의 차이점 (0) | 2022.07.19 |
---|---|
Nuxt JS를 사용한 Vuetify js 최적화 (0) | 2022.07.19 |
C에서 구조물 확장 (0) | 2022.07.19 |
Vuex 3 계산 속성을 사용한 Vee 4 검증 (0) | 2022.07.12 |
C++에서 최소 및 최대 함수 사용 (0) | 2022.07.12 |