在我的插槽中包装动态添加的子元素

Posted

技术标签:

【中文标题】在我的插槽中包装动态添加的子元素【英文标题】:Wrapping dynamically added child elements in my slot 【发布时间】: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>

到目前为止一切都很好。

现在,当我想将另一个 &lt;p&gt; 元素插入 &lt;MyElement&gt; 时,使用

// 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);

新元素不会被包装,因为不会再次调用渲染,我如何才能完全控制插槽中每个子元素的渲染?还是有更好的时机以编程方式将子项附加到组件中?

谢谢

【问题讨论】:

【参考方案1】:

如果您可以考虑为项目创建component。所以当你想添加一个新项目时,你可以创建一个method 来调用项目组件。

我为这个例子做了一个代码片段。

Vue.component('MyElement', 
  template: '#element-container',
);

Vue.component('MyElementItem', 
  template: '#element-item',
  props: 
    innerText: 
      type: String,
      default: '',
    
  
);

new Vue(
  el: '#app',
  data() 
    return 
      items: ['Item 1', 'Item 2', 'Item 3'],
    
  ,
  method: 
    // you can add a method that will add more items, then the MyElementItem component will be invoked.
  
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="app">
  <my-element>
    <my-element-item v-for="(item, index) in items" :key="index" :inner-text="item" />
  </my-element>
</div>

<script type="text/x-template" id="element-container">
  <div>
    <slot></slot>
  </div>
</script>

<script type="text/x-template" id="element-item">
  <div>
    <p> innerText </p>
  </div>
</script>

【讨论】:

以上是关于在我的插槽中包装动态添加的子元素的主要内容,如果未能解决你的问题,请参考以下文章

jquery 怎么获得动态添加后的子元素个数

PHP如何动态为多维数组的子数组分别添加元素

js 为动态添加的元素绑定事件

Vue绑定到动态插槽元素?

动态添加元素的数据绑定

Jquery 给动态添加元素添加点击事件