前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在 Vue 中,如何从插槽中发出数据

在 Vue 中,如何从插槽中发出数据

作者头像
前端小智@大迁世界
发布2020-08-11 14:44:14
3K0
发布2020-08-11 14:44:14
举报
文章被收录于专栏:终身学习者终身学习者

作者:Michael Thiessen 译者:前端小智 来源:medium

点赞再看,微信搜索 【大迁世界】 关注这个没有大厂背景,但有着一股向上积极心态人。本文 GitHub https://github.com/qq44924588... 上已经收录,文章的已分类,也整理了很多我的文档,和教程资料。

代码部署后可能存在的BUG没法实时知道,事后为了解决这些BUG,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具 Fundebug。

我们知道使用作用域插槽可以将数据传递到插槽中,但是如何从插槽传回来呢?

将一个方法传递到我们的插槽中,然后在插槽中调用该方法。 我信无法发出事件,因为插槽与父组件共享相同的上下文(或作用域)。

代码语言:javascript
复制
// Parent.vue
<template>
  <Child>
    <template #default="{ clicked }">
      <button @click="clicked">
        Click this button
      </button>
    </template>
  </Child>
</template>
代码语言:javascript
复制
// Child.vue
<template>
  <div>
    <!-- 将“handleClick” 作为 “clicked” 传递到我们的 slot -->
    <slot :clicked="handleClick" />
  </div>
</template>

在本文中,我们将介绍其工作原理,以及:

  • 从插槽到父级的 emit
  • 当一个槽与父组件共享作用域时意味着什么
  • 从插槽到祖父组件的 emit
  • 更深入地了解如何使用方法从插槽通讯回来

从插槽到父级的 emit

现在看一下Parent组件的内容:

代码语言:javascript
复制
// Parent.vue
<template>
  <Child>
    <button @click="">
      Click this button
    </button>
  </Child>
</template>

我们在 Child 组件的插槽内有一个button 。 单击该按钮时,我们要在Parent 组件内部调用一个方法。

如果 button 不在插槽中,而是直接在Parent组件的子组件中,则我们可以访问该组件上的方法:

代码语言:javascript
复制
// Parent.vue
<template>
  <button @click="handleClick">
    Click this button
  </button>
</template>

当该 button 组件位于插槽内时,也是如此:

代码语言:javascript
复制
/ Parent.vue
<template>
  <Child>
    <button @click="handleClick">
      Click this button
    </button>
  </Child>
</template>

之所以可行,是因为该插槽与 Parent 组件共享相同的作用域。

插槽和模板作用域

模板作用域:模板内部的所有内容都可以访问组件上定义的所有内容。

这包括所有元素,所有插槽和所有作用域插槽。

因此,无论该按钮在模板中位于何处,都可以访问handleClick方法。

乍一看,这可能有点奇怪,这也是为什么插槽很难理解的原因之一。插槽最终渲染为Child 组件的子组件,但它不与Child 组件共享作用域。相反,它充当Parent 组件的子组件。

插槽向祖父组件发送数据

如果要从插槽把数据发送到祖父组件,常规的方式是使用的$emit方法:

代码语言:javascript
复制
// Parent.vue
<template>
  <Child>
    <button @click="$emit('click')">
      Click this button
    </button>
  </Child>
</template>

因为该插槽与Parent 组件共享相同的模板作用域,所以在此处调用$emit将从Parent 组件发出事件。

从插槽发回子组件

Child 组件通讯又如何呢?

我们知道如何将数据从子节点传递到槽中

代码语言:javascript
复制
// Child.vue
<template>
  <div>
    <slot :data="data" />
  </div>
</template>

以及如何在作用域内的插槽中使用它:

代码语言:javascript
复制
// Parent.vue
<template>
  <Child>
    <template #default="{ data }">
      {{ data }}
    </template>
  </Child>
</template>

除了传递数据,我们还可以将方法传递到作用域插槽中。 如果我们以正确的方式连接这些方法,则可以使用它来与Child组件通信:

代码语言:javascript
复制
// Parent.vue
<template>
  <Child>
    <template #default="{ clicked }">
      <button @click="clicked">
        Click this button
      </button>
    </template>
  </Child>
</template>
代码语言:javascript
复制
// Child.vue
<template>
  <div>
    <!-- Pass `handleClick` as `clicked` into our slot -->
    <slot :clicked="handleClick" />
  </div>
</template>

每当单击按钮时,就会调用Child组件中的handleClick方法。


代码部署后可能存在的BUG没法实时知道,事后为了解决这些BUG,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具 Fundebug

原文:https://stackoverflow.com/que...

交流

文章每周持续更新,可以微信搜索【大迁世界 】第一时间阅读,回复【福利】有多份前端视频等着你,本文 GitHub https://github.com/qq449245884/xiaozhi 已经收录,欢迎Star。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 从插槽到父级的 emit
  • 插槽和模板作用域
  • 插槽向祖父组件发送数据
  • 从插槽发回子组件
  • 交流
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档