【发布时间】:2021-07-21 05:46:47
【问题描述】:
如果我有一个带有单个插槽的组件,而不是只渲染它的所有子元素,我想包装每个元素,我会这样做:
Vue.component('MyElement', {
render: function(createElement){
for (let i = 0; i < this.$slots.default.length; i++) {
//create a wrapper element
let wrappedElement = createElement("div", {}, this.$slots.default[i]);
// replace the current element in this slot, with the wrapped element
this.$slots.default[i] = wrappedElement;
}
return createElement("div", this.$slots.default);
}
}
这样使用:
<MyElement ref="myElement">
<p>Item 1</p>
<p>Item 2</p>
</MyElement>
最终看起来像这样
<div>
<div>
<p>Item 1</p>
</div>
<div>
<p>Item 2</p>
</div>
</div>
到目前为止一切都很好。
现在,当我想将另一个 <p> 元素插入 <MyElement> 时,使用
// get reference to <MyElement>
const myElement = this.$refs["myElement"];
// create a new element
var newElement = document.createElement("div");
newElement.innerText = "Hiya";
myElement .$el.appendChild(newElement);
新元素不会被包装,因为不会再次调用渲染,我如何才能完全控制插槽中每个子元素的渲染?还是有更好的时机以编程方式将子项附加到组件中?
谢谢
【问题讨论】:
标签: javascript vue.js vuejs2 vue-render-function