问答

vue插槽下的元素不支持ref的绑定 ? (完整版vue 如何获取 compil

作者:admin 2021-04-21 我要评论

这样写可以:(下方答案有解释) 感谢各位! this.$refs.testGridItem[2].$children[0].$children[0].$refs.myChart ========================================= 1....

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

这样写可以:(下方答案有解释)
感谢各位!

this.$refs.testGridItem[2].$children[0].$children[0].$refs.myChart

=========================================

1.问题: 如何拿到testLayout第二条数据中,键值为j的值中ref='myChart

2.能拿到gridItem中的ref:

this.$refs.testElementItem[1].$refs.testChart

3.使用了TemplateRender组件Vue.compile编译html字符串

4.尝试在testElement引用TemplateRender时,加入ref="testRender",然后使用 this.$refs.testElementItem[2].$refs.testRender.$refs.myChart, 定位失败, 提示Cannot read property '$refs' of undefined

  1. 使用this.$refs.testElementItem[2].$slots.default.$refs.myChart 报错提示:Cannot read property 'myChart' of undefined

1.数据结构:

data () {
    return {
        layout: JSON.parse(JSON.stringify(testLayout))
        ... ...
        }}

let testLayout = [
        {"x":0,"y":0,"w":3,"h":6,"i":"0","j":"<h2>222</h2>", resizable: true, draggable: true, static: false},
        {"x":6,"y":0,"w":9,"h":6,"i":"1","j":'<div>'+'<span  ref=\'myChart\' class=\'myChart\'></span>'+'</div>', resizable: null, draggable: null, static: false},

        ]

2 App 组件:
(在<test-element>组件中使用v-html="item.j",通过slot插槽传入html字符串)

<grid-layout>
    <grid-item v-for="item in layout" :key="item.i"
               :static="item.static"
               :x="item.x"
               :y="item.y"
               :w="item.w"
               :h="item.h"
               :i="item.i"
               
               ref="testElementItem"
    >
        <test-element :text="item.j" @removeItem="removeItem($event)" :infoObj="clusterObj">
        <!-- <div v-html="item.i"></div> -->
        </test-element>
    </grid-item>
</grid-layout>

3 gridLayout 结构:

    <div ref="item" class="vue-grid-layout" :style="mergedStyle">
        <slot></slot>
        <grid-item class="vue-grid-placeholder"
                   v-show="isDragging"
                   :x="placeholder.x"
                   :y="placeholder.y"
                   :w="placeholder.w"
                   :h="placeholder.h"
                   :i="placeholder.i"
                    
                   
                   ></grid-item>
    </div>

4 gridItem 结构:

    <div ref="item"
         class="vue-grid-item"
         :class="classObj"
         :style="style"
    >
        <slot></slot>
        <span v-if="resizableAndNotStatic" ref="handle" :class="resizableHandleClass"></span>
        <span ref="testChart" class="testChart"></span>
    </div>

5 testElement 结构:

    <div>
        <span class="text">
            {{text}}
        </span>
        <span class="remove" @click="$emit('removeItem', text)">x</span>
        <slot></slot>
      <TemplateRender
      :template="text"
      :infoObj="infoObj"
      ref="testRender"
    />
    </div>

6 TemplateRender 组件:

import Vue from 'vue';
export default {
  props: ['template', 'infoObj'],
  render () {
    const r = Vue.compile(this.template).render;
    return r.call(this);
  },
};
###

终于找到了答案了,眼睛泪汪汪的.

是这么写的:

this.$refs.testGridItem[2].$children[0].$children[0].$refs.myChart

两层$children[0], 应该是因为有两层solot.
在testElement组件中使用了TemplateRender 组件进行vue.complie编译,看样子是编译返回后,内容还是注入slot插槽显示啊,这样就能解释通了.

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  •  vue插槽下的元素不支持ref的绑定 ? (

    vue插槽下的元素不支持ref的绑定 ? (

  • 关于防抖节流里面的this指向问题

    关于防抖节流里面的this指向问题

  • koa中的洋葱模型具体有什么作用,求案

    koa中的洋葱模型具体有什么作用,求案

  • 安装Android studio 后 遇到 android s

    安装Android studio 后 遇到 android s

腾讯云代理商
海外云服务器