我有自己内部使用的vue组件——数据可以有带有子元素的数组,我使用这个数组在循环中渲染它们,并根据嵌套级别渲染下一级别、下一级别等.

现在,我想从父级运行child方法,然后——如果语句是正确的,也可以将其调用到child、next level等.

我用

    <mycomponent
            ref="myFirstLevelRefName"
            (...)
    ></mycomponent>

然后:

this.$refs.myFirstLevelRefName 

to call first-level childs. But what about about child nodes? 我用 them in view in that way:

    <mycomponent
            v-for="(subElement, index) in getSubelements()"
            ref="???"
            v-bind:data="subElement"
            v-bind:key="index"
    ></mycomponent>

我试过寄这个$从子级到控制台的引用,但它是空的.

我应该如何在嵌套元素中设置ref name,然后从父元素调用它们?

推荐答案

虽然从技术上讲可以访问$refs个嵌套的子对象...

Vue.component('mycomponent', {
    template: "#mycomponent",
});

new Vue({
  el: '#app',
  mounted() {
    console.log(
      'Second level <input>\'s value:',
      this.$refs.myFirstLevelRefName.$refs.mySecondLevelRefName.value
    )
  }
})
<script src="https://unpkg.com/vue/dist/vue.min.js"></script>

<template id="mycomponent">
    <div>
        <input ref="mySecondLevelRefName" value="Hello">
    </div>
</template>

<div id="app">
  <mycomponent ref="myFirstLevelRefName"></mycomponent>
</div>

对于简单场景,执行父/深子或深祖先/sibling 姐妹通信的一种方法是使用event hub.(有关复杂场景,请参见Vuex.)

您将创建一个全局变量:

var eventHub = new Vue(); // use a Vue instance as event hub

要发出在任何组件中使用的事件,请执行以下操作:

eventHub.$emit('myevent', 'some value');

那么,在任何其他部分中,你都可以听到这个事件.该活动的活动可以是任何形式,包括method call分(这是您想要的):

eventHub.$on('myevent', (e) => {
    console.log('myevent received', e)
    // this.callSomeMethod();
});

Demo:

var eventHub = new Vue(); // use a Vue instance as event hub

Vue.component('component-first', {
    template: "#component-1st",
    methods: {
      myMethod() {
        eventHub.$emit('myevent', 'some value');
      }
    }
});
Vue.component('component-second', {template: "#component-2nd"});
Vue.component('component-third', {
  template: "#component-3rd",
  created() {
    eventHub.$on('myevent', (e) => {
      this.check();
    });
  },
  methods: {
    check() {
      console.log('check method called at 3rd level child');
    }
  }
})

new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue.js!'
  }
})
<script src="https://unpkg.com/vue/dist/vue.min.js"></script>

<template id="component-1st">
    <div>
        1st level component
        <button @click="myMethod">Trigger event at 1st level component that will call 3rd level child's method</button>
        <hr>
        <component-second></component-second>
    </div>
</template>
<template id="component-2nd">
    <div>
        <component-third></component-third>
    </div>
</template>
<template id="component-3rd">
    <div><h1>3rd level child</h1></div>
</template>

<div id="app">
  <component-first></component-first>
</div>

Note:如果在您的环境中创建一个专用实例作为事件中心是件复杂的事情,那么您可以将eventHub替换为this.$root(在组件内部),并使用您自己的Vue实例作为中心.

Vue.js相关问答推荐

过渡如何在 Vue JS 3 中的图像上工作?

Vuetify 3 - NavBar 组件占据整个视口高度

有没有办法将react 键作为值传递给由 v-for 创建的 v-model

在移动版本中使用标准的 v-data-table

如果单元格不可见,则以编程方式打开行的编辑模式. Ag 网格,Vue.js

vite - 具有相对assets资源 路径的子页面

在Vue cli项目中,Laravel api app放在哪里以及如何在vue js中调用api?

Vuetify grid layout - 如何填充网格中元素的高度

在keyup Vuejs 2上获取输入值

为什么 vue 中的 @mouseover 操作不起作用

为什么Vue.js 使用单字标签

W3C 验证和 Vue 的 HTML 绑定语法

事件 click点击的无效处理程序:未定义

如何在生产模式下为 chrome 扩展启用 Vue devtools?

'不提供名为'createRouter'的导出'' vue 3、vite 和 vue-router

在找不到图像源时设置替代图像

Vue JS 在渲染前等待数据

Vue CLI 3 sass-resources-loader - Options.loaders 未定义

Vuejs获取事件正在调用的元素?

如何使用vue js判断组件本身的数据何时发生变化?