当前位置: 首页 > 知识库问答 >
问题:

使用slot调用子方法

萧献
2023-03-14

我有两个部分。一个子组件,它有两个插槽,由来自另一个组件的DOM填充。我在另一个父组件中使用此组件。

我想要的是当我单击父组件中的元素时关闭组件。

超文本标记语言

<div id="app">
  <parent></parent>
</div>

JS

// Child component.
const ChildTemplate = `
    <div class="m-dropdown">
    <button
      class="m-dropdown__button"
      aria-haspopup="true"
      aria-expanded="false"
      @click="handleClick"
      @keyup.esc="close"
      @closeDropdown="isActive = false"
    >
      <slot name="dropdownToggle"></slot>
    </button>
    <div
      class="m-dropdown__content"
      v-show="isActive"
    >
      <slot name="dropdownContent"></slot>
    </div>
  </div>
`;
const Child = {
    template: ChildTemplate,
    data() {
      return {
        isActive: false,
        dropdownCTA: null,
        dropdownCTAClassname: 'm-dropdown__button',
      };
    },
    methods: {
      handleClick(e) {
        this.isActive = !this.isActive;
        this.dropdownCTA = e.target.closest('button');
        this.dropdownCTA.setAttribute('aria-expanded', 'true');
      },
      close() {
        if (this.isActive) {
          this.isActive = false;
          this.dropdownCTA.setAttribute('aria-expanded', 'false');
        }
      },
      documentClick(e) {
        const el = this.$el;
        if (this.isActive && el !== e.target && !el.contains(e.target)) {
          this.close();
        }
      },
    },
    created() {
      document.addEventListener('click', this.documentClick);
    },
    destroyed() {
      document.removeEventListener('click', this.documentClick);
    }   
};
// Parent component.
const ParentTemplate = `
    <child class="m-item-selector">
    <div
      class="m-item-selector__item"
      slot="dropdownToggle"
    >
       {{itemSelected}} 
    </div>
    <ul
      slot="dropdownContent"
      class="m-item-selector__item-list"
    >
      <li
        class="m-item-selector__item-wrapper"
        v-for="(item, index) in items"
        :key="index"
      >
        <button
            class="m-item-selector__item"
          @click="selectItem(item)"
         >
            {{item}}
         </button>
      </li>
    </ul>
  </child>
`;
const Parent = {
    template: ParentTemplate,
    data() {
      return {
        items: ['item 1', 'item 2', 'item 3'],
        itemSelected: 'item 1',
      };
    },
    components: {
      Child,
    },
    methods: {
      selectItem(item) {
        console.log(item);
        // I want to close my child component in this method but
        // 'this' represents my parent component.
        // How can I access my child component so that
        // I can do something like this: this.close() ?
        this.itemSelected = item;
      },
    }   
};

// Register components.
Vue.component('parent', Parent);
Vue.component('child', Child);

new Vue({
  el: "#app"
})

这是小提琴:https://jsfiddle.net/eywraw8t/19300/

共有1个答案

濮君植
2023-03-14

使用默认槽,这应该可以工作:this.$slots.default[0].context.close()

close()应该在组件的方法部分中定义

如果您使用的是命名插槽,只需替换default[0]

 类似资料:
  • 本文向大家介绍vue template中slot-scope/scope的使用方法,包括了vue template中slot-scope/scope的使用方法的使用技巧和注意事项,需要的朋友参考一下 在vue 2.5.0+ 中slot-scope替代了 scope template 的使用情形为,我们已经封装好一个组建,预留了插槽,使用 的插槽 首先 我们的创建一个组建 组建很简单有一个 slot

  • 本文向大家介绍详解vue slot插槽的使用方法,包括了详解vue slot插槽的使用方法的使用技巧和注意事项,需要的朋友参考一下 官方文档其实已经讲得很详细,我根据文档,把官方的小案例实现了一下,这样更直观 单个slot使用最简单,也是最常用的,当我们定义了一个子组件,父组件在使用的这个组件的时候,想在内部自定义一些初始化数据,这时候就可以用slot实现。 具名slot只是给slot加了name

  • 我试图访问一个方法在嵌套的Chilld组件使用ref。这是删除嵌套删除组件中的数据。我的代码如下(简化代码): 父类: 儿童班: 孙辈阶级: 但是,我无法让Supplier方法在这个孙子上下文中调用更改。该方法被调用,但调用方式很奇怪。 当组件被加载并打印索引时,它会被调用一次,但是它不工作!!!我甚至没有在孙子类中调用这个方法。请帮忙。 更新:除了现在的方法名之外,代码与编写的代码完全相同。

  • 我有两个组成部分: 父组件 子组件 我试图从Parent调用child的方法,我尝试了这种方法,但无法得到结果: 有没有办法从父级调用子级的方法? 注意:子组件和父组件在两个不同的文件中。

  • 问题内容: 我有两个组成部分。 父组件 子组件 我试图从父级调用孩子的方法,我尝试过这种方法,但没有得到结果 有没有一种方法可以从父级调用子级的方法? 注意:子组件和父组件位于两个不同的文件中 问题答案: 首先,让我表示,这通常 不是 在React领域中解决问题的方法。通常,您要做的是将功能传递给道具中的子代,并传递事件中的子代的通知(或者更好的是:)。 但是,如果 必须 在子组件上公开命令式方法

  • 我想编写一个表单组件,它可以导出一个方法来验证其子级。不幸的是,表单在其子级上没有“看到”任何方法。 以下是我如何定义一个潜在的形式子项: 下面是我如何定义Form类: 我注意到我可以使用refs调用子组件上的方法,但不能通过props调用方法。儿童 这种行为有什么原因吗? 我怎样才能解决这个问题?