VueJS 插槽:为啥通过父插槽传入的子方法不起作用?

Posted

技术标签:

【中文标题】VueJS 插槽:为啥通过父插槽传入的子方法不起作用?【英文标题】:VueJS slots: Why child method passed in via slot from parent doesn't work?VueJS 插槽:为什么通过父插槽传入的子方法不起作用? 【发布时间】:2019-07-17 21:14:47 【问题描述】:

我有一个简单的 vue codesandbox demo.

在这个演示中,我通过父组件的槽将方法传递给子组件(在子组件中定义)。但是,当单击附加此方法的按钮时,该方法不会执行。

我想知道为什么通过插槽(从父级)传递子方法不起作用。我对这背后的逻辑更感兴趣。

App.vue

<template>
  <div id="app">
    <img  src="./assets/logo.png" />
    <user>
      <button @click="changeName('Don')">Change Name</button>
    </user>
  </div>
</template>

<script>
import user from "./components/user";

export default 
  name: "App",
  components: 
    user
  ,
  data: function() 
    return 
      msg: "Name is Bond.. James Bond"
    ;
  
;
</script>

User.vue

<template>
  <div class="wrapper">
    <h2>My name is "myName"</h2>
    <slot></slot>
  </div>
</template>

<script>
export default 

  data()  
    return 
      myName: 'Bond'
    
  ,

  methods: 
    changeName: function(newName)
      this.myName = newName
    
  
;
</script>

谢谢。

【问题讨论】:

【参考方案1】:

如果调用父级中的方法,还需要定义父级中的方法。这与插槽与否无关。

模板中调用的任何方法都只引用该组件的实例。这是不需要引用 this 的副产品。

在您的示例中,要让父级访问 myName,请使用 scoped slot 并将设置器或子实例传递给插槽父级。或者向插槽父级提供点击方法。

这与为什么不向子级发送事件密切相关。请参阅Emit event from content in slot to parent 了解更多信息。

【讨论】:

【参考方案2】:

如果您想将数据传递给 children,请使用 props。如果您想将数据传递给 parent,请使用 emit

【讨论】:

您能否详细说明您的答案,请参阅如何回答问题***.com/help/how-to-answer

以上是关于VueJS 插槽:为啥通过父插槽传入的子方法不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

Vue JS - 在插槽中改变传递的道具

插槽分发内容

slot

Vuejs之Component slot 插槽详解

如何在 vuejs 2.5.x 中正确使用插槽范围?

vue slot插槽的使用