【问题标题】:Is there any way to access child method from parent component when mounting in Vue.js 3?在 Vue.js 3 中安装时,有什么方法可以从父组件访问子方法?
【发布时间】:2020-12-21 10:40:39
【问题描述】:

你能教我在 VueJS 中挂载时如何从父组件访问子函数吗?

我已附上示例代码以明确此问题。

附: 我已将子组件和一些代码添加到父组件。 你可以看到下面的代码。

<template>
  <div>Child</div>
</template>

<script lang="ts">
import { defineComponent } from "@vue/composition-api";

export default defineComponent({
  name: "Child",
  setup() {
    const childFunc = () => {
      console.log('This is Child.');
    };
  
    return {
      childFunc
    }
  }
});
</script>
<script lang="ts">
import { defineComponent, ref, onMounted } from "@vue/composition-api";
import Child from "./Child.vue";

export default defineComponent({
  name: "Parent",
  components: {
    Child
  },
  setup() {
    const child = ref();

    onMounted(() => {
      child.value.childFunc(); // Error: childFunc of undefined 
    });

    return {
      child
    };
  },
});
</script>
<template>
  <Child ref="child" />
</template>

【问题讨论】:

  • 如何定义Child 组件?
  • 我将子组件定义为父组件。
  • 请分享
  • 上面可以看到

标签: vue.js vue-component mount ref vuejs3


【解决方案1】:

它应该可以工作,在下面的示例中,我创建了一个带有按钮的子组件,该按钮增加了一个计数,mounted 中的这个计数由父级增加一:

const {
  createApp,
  ref,
  onMounted,
  defineComponent
} = Vue

let Child = defineComponent({
  name: "Child",
    setup() {
    const childFunc = () => {
      console.log('This is Child.');
    };
  
    return {
      childFunc
    }
  },
  data() {
    return {
      count: 0
    }
  },
  methods: {
    increment() {
      this.count++;
    }
  },
  template: `
    <button @click="count++">
      You clicked me {{ count }} times.
    </button>`
})
let app = createApp({
  el: '#app',
  setup() {
    const child = ref();

    onMounted(() => {
 child.value.childFunc(); 
      child.value.increment()
    });

    return {
      child
    };
  },
  components: {
    Child
  }
}).mount('#app')
<script src="https://unpkg.com/vue@next/dist/vue.global.js"></script>

<div id="app">
  test
  <Child ref="child" />
</div>

【讨论】:

  • 真的...感谢您的报告。我会尝试找出一些问题。而且我还想补充一点,我可以在 onMounted 函数中找到“child”。但是,我在其中找不到“child.value”。
  • 尝试将child 记录到像console.log(child) 这样的挂载钩子中并给我输出
  • 这是结果。 RefImpl {value: (...)get value: ƒ ()set value: ƒ (v)__proto__: Object}
  • 它有效,您可以检查我编辑的答案,我使用与您相同的逻辑
  • 它不能正常工作,但如果我使用setTimeout(),我可以完美访问它。
【解决方案2】:

我觉得有必要问:你确定要这样做吗?函数只是一个哑函数,而不是响应式的。您如何设想组件之间的分离? Vue 组件在与商店交互时效果最佳,因此它们之间的链接尽可能少。父子关系只是指 DOM 放置,它可能会随着时间而改变。 ref 是您应该问自己“我真的需要这样做吗?”的功能之一。

【讨论】:

  • 是的,你是对的,Vue 鼓励数据驱动的过程
  • 感谢您的回答。我需要访问子组件的函数,因此使用 setTimeOut 函数处理了这个问题。你能给我一些你的解决方案的例子吗?那将不胜感激。
猜你喜欢
  • 2021-04-21
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 2020-09-11
  • 2017-04-18
相关资源
最近更新 更多