【问题标题】:Vue loses slot reactivity when use with render functionVue 在与渲染功能一起使用时失去槽反应性
【发布时间】:2020-04-15 21:51:35
【问题描述】:

我有这个标记

    <ComponentA>
       <Child @click="selected=1">{{selected}}</Child>
       <Child @click="selected=2">{{selected}}</Child>
       <Child @click="selected=3">{{selected}}</Child>
       <Child @click="selected=4">{{selected}}</Child>
    </ComponentA> 
  data() {
    return: {selected: -1}
  }

没关系,它是响应式的,它显示selected in -1,如果单击任何Childselected 将更改并显示在Dom 中。但是我需要一种方法来根据特定条件仅安装 Child 的一部分。所以我的方法如下所示:

<!-- ComponentA -->
<template>
 <div id="container">
   <slot></slot>
 </div>
</template>
function selectChildren(VNodes) {...} // return VNode[]
function mountSelectionChildren(VNodes) {
  const childrenCmp = {
    data: function () {
     return {
      items: [],
     }
    },
    mounted() {
      this.items = selectChildren(VNodes) // get a slice of total Child, based on certains conditions I ommited
    }
    render(h) {
      return h("div", [this.items.map(item => h("div", {...},[item]))])
    }
  }
  new Vue(childrenCmp).$mount("#container") 
}
export default {
  mounted() {
    mountSelectionChildren(this.$slots.default)
  }
}

它可以渲染我想要的 DOM 和 UI,但是现在,单击 Child elems 不是反应式的,并且不显示 selected 属性。那么,我怎样才能使安装了 render fn 的插槽变成反应式的呢?

【问题讨论】:

  • this.items.map 在纯 JavaScript 中将返回一个新数组 - 所以我认为这就是你失去反应性的地方?

标签: vue.js


【解决方案1】:

尝试类似:

function selectChildren(VNodes) {...} // return VNode[]

export default {
  render(h){
    let VNodes = this.$slots.default || []

    let items = selectChildren(VNodes)
    return h("div", [items.map(item => h("div", {...},[item]))])
  }
}

【讨论】:

    猜你喜欢
    • 2021-04-16
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 2020-03-24
    • 2020-03-18
    • 1970-01-01
    相关资源
    最近更新 更多