Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Vuejs 3如何将变量传递给槽内的所有元素

Vuejs 3如何将变量传递给槽内的所有元素
EN

Stack Overflow用户
提问于 2022-07-12 10:38:02
回答 3查看 928关注 0票数 1

我正在使用VueJs 3创建一个动态表组件,这涉及到向插槽内的所有子组件发送向下循环索引变量

组件的使用情况如下

代码语言:javascript
运行
AI代码解释
复制
<template>
  <h1>my table</h1>
  <MyTable
    :source="[
      { fname: 'Jhon', lname: 'Smith' },
      { fname: 'Arthur', lname: 'Cromer' },
    ]"
  >
    <MyTableColumn cellTitle="First Name" cellValue="fname"></MyTableColumn>
    <MyTableColumn cellTitle="Last Name" cellValue="lname"></MyTableColumn>
  </MyTable>
</template>

上面展示了我试图实现的目标,您可以在其中设置表数据源(数组)和任意数量的列,其中每个列接受一个标题和单元格值。

我不知道如何将迭代索引(v-for索引)向下发送到槽内的所有组件。

这里是MyTable.vue模板

代码语言:javascript
运行
AI代码解释
复制
<template>
  <table>
    <tr v-for="(row, index) in $props.source" :key="index">
      {{
        (currentRow = index)
      }}
      <slot></slot>
    </tr>
  </table>
</template>

我试过范围槽,但没有帮助。并尝试了提供/注入技术,方法是从MyTable.vue提供索引,并在每个MyTableColumn.vue实例中注入索引,但这并没有像预期的那样工作,因为注入的变量总是有最后一个索引。不确定它是否需要使用呈现函数。

在过去的几天里,我一直试图在没有运气的情况下找到解决方案。

在这里,您可以访问具有意外行为的完整代码演示程序。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-07-15 14:09:26

使用作用域槽和相关样板代码的替代方法是在呈现函数中向子节点添加支持,这是通过修改code对象来完成的,类似于这个答案

MyTable可以有一组有限的组件,这些组件可以作为其子组件使用,并且可以得到特殊的处理,例如MyTableColumn

代码语言:javascript
运行
AI代码解释
复制
() => {
  const tableChildren = slots.default?.() || [];
  const tableColumns = tableChildren.filter(vnode => vnode.type === MyTableColumn);
  const tableHeaders = tableColumns.map(vnode => vnode.props.cellTitle);

  return h('table', {}, [
    h('tr', {}, [
      ...tableHeaders.map(header => h('td', {}, header)),
    ]),
    ...props.source.map((row, index) => {
      return h('tr', {}, [
        ...tableColumns.map(vnode => {
          const name = vnode.props.cellValue

          return {
            ...vnode,
            props: {
              ...vnode.props,
              index,
              value: row[name]
            }
          };
        })
      ])
    })
  ...

这里,在呈现之前,额外的indexvalue支持被添加到MyTableColumn vnodes中。

这可以通过完全不呈现MyTableColumn来改变,只需向MyTable提供关于列的必要信息,并为它们提供可选的自定义布局。这种方法在React生态系统中比较流行,但在Primevue DataTable中也可以看到。可以看出,Column组件没有模板,因此没有呈现。

票数 1
EN

Stack Overflow用户

发布于 2022-07-12 12:00:24

渲染行

您可以使用作用域槽将数据从MyTable.vue传递给它的插槽子节点:

  1. MyTable.vue中,将indexrow的值绑定到<slot>
代码语言:javascript
运行
AI代码解释
复制
<tr v-for="(row, index) in $props.source" :key="index">
  <slot :index="index" :row="row"></slot>
</tr>
  1. App.vue中,通过<template>上的v-slot访问MyTable.vue的插槽道具,并将它们绑定到MyTableColumn的道具上:
代码语言:javascript
运行
AI代码解释
复制
<MyTable
  :source="[
    { fname: 'Jhon', lname: 'Smith' },
    { fname: 'Arthur', lname: 'Cromer' },
  ]"
>
                           
  <template v-slot="{ index, row }">
                                                           
    <MyTableColumn cellTitle="First Name" :index="index" :cellValue="row.fname"></MyTableColumn>
                                                           
    <MyTableColumn cellTitle="Last Name" :index="index" :cellValue="row.lname"></MyTableColumn>
  </template>
</MyTable>

呈现标头

  1. MyTable.vue中,添加一个headers支柱以包含列标题数组,并将它们呈现在表主体之上:
代码语言:javascript
运行
AI代码解释
复制
defineProps({
  headers: Array,
})
代码语言:javascript
运行
AI代码解释
复制
<table>
  <tr>
    <td v-for="header in headers">{{ header }}</td>
  </tr>
  <!-- table body... -->
</table>
  1. App.vue中,将所需的列标题绑定到<MyTable>.headers
代码语言:javascript
运行
AI代码解释
复制
<MyTable :headers="['First Name', 'Last Name']">

演示

票数 4
EN

Stack Overflow用户

发布于 2022-07-12 13:24:47

让我们从一个简单的插槽示例开始:

代码语言:javascript
运行
AI代码解释
复制
<template>
  content which always renders
  <slot name="slotName" :foo="'bar'">
    content to be rendered if slot is not present
  </slot>
  some more content which always renders
</template>

考虑到上面的时隙组件,以下标记:

代码语言:javascript
运行
AI代码解释
复制
<Slotted>
  <template #slotName="{foo}">
    replacement content for slot - {{ foo }}
  </template>
</Slotted>

会产生

代码语言:javascript
运行
AI代码解释
复制
content which always renders
  replacement content for slot - bar
some more content which always renders

,而<Slotted />将产生:

代码语言:javascript
运行
AI代码解释
复制
content which always renders
  content to be rendered if slot is not present
some more content which always renders

将上述内容实现到一个表中,我们将呈现的列定义为字段,并为每个字段的单元格定义一个槽,为每个字段的标头定义一个槽。它们是动态的。

若要替换任何列单元格或列标题,请为该列的单元格提供模板。在默认内容中,为所有单元格(#cell)嵌套一个通用槽,为所有标头(#header)嵌套一个。如果提供,将用于没有指定模板的任何单元格(或标头)。如果未提供,则默认内容。

代码:

Table.vue

代码语言:javascript
运行
AI代码解释
复制
<template>
  <table>
    <thead>
      <tr>
        <th v-for="{label, key} in fields" :key="key">
          <slot :name="`header(${key})`"
                v-bind="{ label, propName: key }">
            <slot name="header">
              {{ label }}
            </slot>
          </slot>
        </th>
      </tr>
    </thead>
    <tbody>
      <tr v-for="(item, index) in rows" :key="index">
        <td v-for="field in fields" :key="field.key">
          <slot :name="`cell(${field.key})`"
                v-bind="{ 
                  item, 
                  index, 
                  value: item[field.key],
                  field
                }">
            <slot name="cell"
                  v-bind="{ 
                    item, 
                    index, 
                    value: item[field.key],
                    field
                  }">
              {{ item[field.key] }}
            </slot>
          </slot>
        </td>
      </tr>
    </tbody>
  </table>
</template>

将其用作:

代码语言:javascript
运行
AI代码解释
复制
  <Table :rows="rows" :fields="fields">
    <template #cell(fname)="{ value, index }">
      <span style="color: red" v-text="`${index} - ${value}" />
    </template>
    <template #header(fname)="{ label }">
      <span style="color: blue" v-text="label" />
    </template>
    <template #header="{ label }">
      <!-- applies to all header cells which don't have 
           a #header({key}) template provided.
           The ones which do (eg: `#header(fname)`) override this. -->
      <span :style="{fontStyle: 'italic'}" v-text="label" />
    </template>

  </Table>

工作实例

这种方法的优点在于,现在您可以使用这个<Table />来呈现任何项,而不必更改<Table />组件。您只需提供应该呈现默认内容以外的内容的插槽。

注意:每个插槽内的,您可以访问绑定到插槽范围的任何内容。在本例中,{ item, index, value, field }表示单元格,{ label, key }表示标头单元格。很明显,你不局限于这些。你可以把你想要的东西绑在他们身上。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72956962

复制
相关文章
掩模直方图
算法:掩模图像,也称掩膜图像,借鉴于PCB制版过程,似一块玻璃板,玻璃板上白色区域是透明的,黑色区域是不透明的。掩膜有方形掩膜和圆形掩膜等。掩模运算是将该玻璃板覆盖在原始图像透过玻璃板显示出来的部分就是掩模运算的结果图像。掩膜图像应用在感兴趣区、图像屏蔽、图像合成、结构特征提取、特殊形状图像提取等领域。
裴来凡
2022/05/28
4720
掩模直方图
掩模直方图均衡化
算法:掩模图像,也称掩膜图像,借鉴于PCB制版过程,似一块玻璃板,玻璃板上白色区域是透明的,黑色区域是不透明的。掩膜有方形掩膜和圆形掩膜等。掩模运算是将该玻璃板覆盖在原始图像透过玻璃板显示出来的部分就是掩模运算的结果图像。掩膜图像应用在感兴趣区、图像屏蔽、图像合成、结构特征提取、特殊形状图像提取等领域。
裴来凡
2022/05/28
3590
掩模直方图均衡化
以太坊 Iban 地址
中国广东省深圳市龙华新区民治街道溪山美地 518131 +86 13113668890 <netkiller@msn.com>
netkiller old
2018/06/14
2.8K1
以太坊 Iban 地址
以太坊中的iban概念解析
简单地说,以太坊中的iban账号是以太坊为了和传统的银行系统对接而引入的概念, web3.js中提供了以太坊地址和iban地址之间的转换方法。 iban:国际银行账号 iban这个概念源于传统的银行系统,其英文全称为International Bank Account Number, 即国际银行帐号。iban的作用是为全球任意一家银行中的任意一个账户 生成一个全球唯一的账号,以便进行跨行交易。一个iban账号看起来像这样: XE7338O073KYGTWWZN0F2WZ0R8PX5ZPPZS iban地址
用户1408045
2018/06/04
1.7K0
芯片制造之掩模领域中的术语
本文记录芯片制造中的掩模部分术语。 A 名词 解释 AAPSM/Levenson Alternating Aperture Phase Shift Mask (see also Levenson) an etched quartz reticle which incorporates a light blocking layer of chrome or moly silicide coupled with etched quartz trenches, to create alternating 0
为为为什么
2023/02/21
1.3K0
芯片制造之掩模领域中的术语
CVPR 2020丨MaskFlownet:基于可学习遮挡掩模的非对称特征匹配
编者按:在光流预测任务中,形变带来的歧义与无效信息会干扰特征匹配的结果。在这篇 CVPR 2020 Oral 论文中,微软亚洲研究院提出了一种可学习遮挡掩模的非对称特征匹配模块 ,它可以被轻松结合到端到端的基础网络中,无需任何额外数据和计算开销就可以学习到遮挡区域,从而显著改进光流预测的结果。
CV君
2020/05/26
1.3K0
CVPR 2020丨MaskFlownet:基于可学习遮挡掩模的非对称特征匹配
Python的正则表达式_python正则表达式例子
https://github.com/ziishaned/learn-regex/ https://regex101.com/ 在线练习
全栈程序员站长
2022/09/30
6300
jmeter的正则表达式提取器_正则表达式提取
在一个线程组中,B请求需要使用A请求返回的数据,也就是常说的关联,将上一个请求的响应结果作为下一个请求的参数,则需要对A请求的响应报文使用后置处理器,其中最方便最常用的就是正则表达式提取器了。
全栈程序员站长
2022/10/01
4.1K0
jmeter的正则表达式提取器_正则表达式提取
超详细的正则表达式(上:正则表达式语法)
正则表达式定义正则表达式语法,又称规则表达式。(英语: ,在代码中常简写为regex、regexp或RE),正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。一句话说就是匹配有规律的东西
宜轩
2022/12/26
9220
详细的正则表达式
只能输入数字:"^[0-9]*$"。 只能输入n位的数字:"^\d{n}$"。 只能输入至少n位的数字:"^\d{n,}$"。 只能输入m~n位的数字:。"^\d{m,n}$" 只能输入零和非零开头的
Dawnzhang
2018/10/18
6270
简单的正则表达式
特殊字符 ^ $ * ? + {2} {2,} {2,5} | [] [^] [a-z] . \s \S \w \W [\u4E00-\u9FA5] () \d 常用的6个re中的函数
听城
2018/04/27
1.5K0
linux的正则表达式
正则表达式 (Regular Expression, RE, 或称为常规表示法)是透过一些特殊字符的排列,用以搜寻/取代/删除一列或多列 文字字符串,简单的说,正则表达式就是用在字符串的处理上面的一项『表示式』。正则表达式并不是一个工具程序,而是一个字符串处理的标准依据,如果您想要以正则表达式的方式处理字符串,就得要使用支持正则表达式的工具程序 才行,这类的工具程序很多,例如 vi, sed, awk 等等。
小柒吃地瓜
2020/04/22
1.3K0
PHP基础编程之鬼斧神工的正则表达式-正则表达式初探+常用的正则表达式函数
很多小伙伴在学习php中,正则表达式是一道过不去的坎,初学者在看到正则表达式的复杂符号时,总会一头雾水,丈二的和尚摸不着头脑,冷月在刚刚开始学习正则表达式时也是一头懵。不过,冷月会用由浅入深的讲解正则表达式的基础和简单实战,相信大家看完这篇文章时,会有一定的收获。废话不多说,开启正则表达式的学习吧!let's go!
学长冷月
2020/08/02
6700
js 邮箱正则表达式_匹配邮箱的正则表达式
一个正则表达式就是由普通字符(a~z)以及特殊字符(称为元字符)组成的文字模式。 该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。 语法:
全栈程序员站长
2022/09/29
5.7K0
js 邮箱正则表达式_匹配邮箱的正则表达式
零零信安-D&D数据泄露报警日报【第44期】
2022.11.14共发现匿名网络资讯信息35,333条;最近7天共发现匿名网络资讯信息470,357条,同比增长-1.5%;最近30天共发现匿名网络资讯信息2,308,458 条。
零零信安
2022/11/15
3180
有趣的正则表达式
听到正则表达式,大家一定不会陌生。工作项目中也经常使用正则表达式来校验文本的是否匹配规则。通常都会直接上网找寻各种格式输入的正则匹配式。比如电话/邮件等等。
deep_sadness
2018/08/30
7980
有趣的正则表达式
常用的正则表达式
正则表达式用于字符串处理、表单验证等场合,实用高效。现将一些常用的表达式收集于此,以备不时之需。
崔笑颜
2020/12/22
9050
正则表达式的使用
preg_filter 执行正则表达式搜索和替换 preg_grep 返回匹配模式的数组条目 preg_last_error 返回最后一个正则执行产生的错误代码 preg_match_all 执行一个全局正则表达式匹配 preg_match 执行一个正则表达式匹配 preg_quote 转义正则表达式字符 preg_replace_callback_array 执行一个正则表达式搜索并且使用一个回调函数进行替换 preg_replace_callback 执行一个正则表达式搜索并且使用一个回调进行替换 preg_replace 执行一个正则表达式的搜索和替换 preg_split 通过一个正则表达式分隔字符串
ianzhi
2019/07/31
9360
书写高效的正则表达式,正则表达式性能优化方法
影响 NFA 类正则表达式(常见语言:GNU Emacs,Java,ergp,less,more,.NET语言,PCRE library,Perl,PHP,Python,Ruby,sed,vi ) 其实主要是它的“回溯”,减少“回溯”次数(减少循环查找同一个字符次数),是提高性能的主要方法。
Yangsh888
2022/03/28
3290
jmeter的正则表达式提取器_正则表达式详解
关于JMeter的使用,花费大量精力写了JMeter的一系列文章,有图有案例,一方面总结起来作为备忘,一方面希望能给初学者一些帮助。觉得有所帮助的朋友,请点个赞,对于疏漏之处也欢迎指教。
全栈程序员站长
2022/10/01
4.3K0
jmeter的正则表达式提取器_正则表达式详解

相似问题

使用PHP switch语句执行多个case

60

Ruby case switch语句,执行每个case

21

使用多个case的多个Switch语句?

51

case/switch语句

11

java switch case语句会对负的int值执行多个case吗?

60
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文