[vue3进阶] 6.slot插槽3——作用域插槽

[vue3进阶] 6.slot插槽3——作用域插槽,第1张

作用域插槽——又是一个抽象的名字,那我用简单的语言解释一下

当父组件里写的插槽的内容需要使用子组件里的数据时,这时候就要用作用域插槽这个功能

可能你还是没明白,不过没关系,咱们还是通过写一个小例子来学习

我们现在有一个子组件,叫heroList,顾名思义就是要显示一个英雄列表,

咱们快速的把它写出来,都是以前学过的内容

然后在Appvue里面使用它

显示结果是

然后需求变复杂了,在使用这个组件时,需要把名字渲染到不同的标签里

或者

这时,我们想到可以把li里面写一个slot,然后里面的标签从父组件使用slot插入进来就可以了

Appvue里面修改

发现h2标签倒是有了,但是名字没了

因为根本没有在h2里面放内容啊

然后把item放进去

发现仍然不行,因为item是heroList组件里面数据,在Appvue不能直接使用,即使是在slot里面

那vue还是提前准备好了这个问题的解决方案了,提供了在父组件中使用子组件数据的语法

先修改heroList子组件

给slot标签绑定了一个属性,名字叫做heroName,绑定的值就是item,

heroName这个名字是我们自己起的,你可以起你喜欢的名字,后面用时候对应上就行了,

item就是我们循环出来的英雄的名字了

第二步修改父组件Appvue

这里复杂一点,咱们一点一点解释

1更上节课一样,我们的slot内容先用一个template标签包住

2也是使用v-slot,它等于一个值slotProps,slotProps这个名字你也可以随你喜欢起,它表示一个对象,这个对象里存着子组件要在父组件里使用的数据,

3slotProps这个对象里存放我们在子组件里定义的heroName这个值,把它绑定到h2中

这样列表就显示出来了

我们上面没有给子组件的slot起名字,使用时也没有名字

其实和

是一样的

如果给slot起一个名,修改heroList

那么在使用时,必须指定名字,修改Appvue

根据我们之前学习的简写,可以写成

插槽的内容就说这么多了,肯定有初学的小伙伴表示,插槽的语法这么多,记不住啊,

我还是要强调一下写法什么的不要死记,记不住也没关系,知道有这么个功能就行了,

等需要时,再到官网去查就行

还有像作用域插槽,在工作中用的地方并不多,

主要集中在表格、列表使用第三方ui库展示时,比如element-ui,到时候再去看官网例子也不晚

用一张图展示SingleCellExperiment的结构:

SingleCellExperiment对象中每一个数据代表一个分离的slot(来源于S4对象)。假如我们将SingleCellExperiment比作一艘货船,那么slot可以理解为单个的装载不同货物的boxes,比如有的专门存放数值类型的矩阵,另外一些则单独存放数据框。

在本次学习中,我们讨论可以获得哪些slot,他们的特定格式,我们怎样与他们进行交互。

厉害的人可能早就发现了SingleCellExperiment与SummarizedExperiment对象是一样。

如果只创建一个基本的SingleCellExperiment对象,我们只需要赋值assay 数据槽就可以了(上图中的蓝色框框)。这个slot包含了主要的数据如:counts 矩阵。我们来随便生成一个具有三个细胞和10个基因的count矩阵进行测试。

现在,我们可以开始创建SingleCellExperiment对象了,并将数据命名:counts

我们可以直接在命令行输入sce来查看初步的主要信息。

有两种方法可以获取counts值:

assays数据槽非常强大的原因是它可以存储主要数据的不同格式。这在这个时候非常有用:我想保存原始count矩阵,还想保存标准化后的normalized 版本。现在我们使用scater包来计算标准化并log转换后的数据。

在做单细胞数据分析的时候,你可能已经注意到了我们每次都是对同一个对象如sce进行赋值,那为什么原有数据没有被覆盖掉呢?

sce中此时多了一个assays,原始的counts并没有被覆盖掉。这也是为什么SingleCellExperiment对象特殊的地方,每次返回结果包含了原来的结果,新的结果是增加在对象中而不是替换。

与counts相似,我们也可以使用同样的方法取标化后的值

查看对象中包含的所有assay

上面的功能告诉我们,我们可以自动添加assay到sce对象中,但是更多的时候是使用我们自己的计算方式,但是这个时候返回的并不是SingleCellExperiment对象,不能将结果自动添加到assay中。这个时候想将新计算的结果添加进去怎么办呢?

使用以下方法

为了注释SingleCellExperiment对象,我们需要增加以下metadata来描述我们的主要数据的列,比如实验的样本或者细胞类型描述。这个数据就保存在colData数据槽中,通常是一个dataframe或者DataFrame,行为细胞,列为对应的元数据如治疗信息,批次信息。

现在,让我们往sce中添加一些细胞信息在colData slot中。

可以使用两种方式将细胞信息添加到sce对象中去

提取colData信息

scater 的 addPerCellQC() 可以自动计算一些细胞指标并添加到colData数据槽中

手动添加更多colData信息

使用colData取子集

存储feature水平的注释为rowData数据槽,rowData是一个DataFrame,行对应基因,保存的信息如:转录本长度,基因名。还有一个rowRanges数据槽保存GRanges或GRangesList对象的基因组坐标。rowRanges保存基因的染色体,起始位置,终止位置。

这两个数据槽可以使用rowRanges()和rowData()获取。

在此处,sce中的rowRanges数据槽没有保存信息,运行会返回一个空值。

在rowData中添加信息

与colData相似,rowData在创建SingleCellExperiment对象的时候就已经初始化保存在对象中。具体还要取决于物种,比对和定量使用的注释信息等。

如,使用Ensembl ID,我们可能会使用 AnnotationHub 资源获得Ensembl注释对象并提取基因body信息保存在我们的SingleCellExperiment对象的rowRanges中。

如何在基因/feature水平提取子集?类似于行 *** 作。

还有一些数据信息不适合存储在colData或者rowData里面,那么可以保存在metadata数据槽中。

它可以是任何你想放的信息。

比如,我们有一些高变基因像保存在sce的slot中,我们就可以加入到metadata中。

我们还可以简单的通过$添加更多信息

总结前面的,我们了解了SingleCellExperiment中的assays,colData,rowData/rowRanges以及metadata数据槽。

这些slots实际上继承自它的parent:SummarizedExperiment。

那么SingleCellExperiment对象还有一些自己的特有的数据槽(slots)。

reducedDims数据槽保存通过PCA或t-SNE降维后的数据,行对应primary data数据的列即cells,列代表维度。由于这个数据槽以list形式保存数据,对同一个数据集,我们可以保存多个PCA/t-SNE/etc。

下面,我们使用来在scater包的runPCA()计算PCA

同样,使用runTSNE()计算t-SNE。

我们可以使用reducedDims(sce)查看sce的降维数据列表,注意与reducedDim()的区别。

同样,可以手动添加对象到reducedDims()数据槽中。

使用 uwot 包的umap()函数,生成UMAP坐标保存到reducedDims中去。

这个地方可以保存如 spike-in等的信息。

如果我们有可选的feature信息,我们可以保存在 SingleCellExperiment中。

然后使用altExp()保存在sce对象中

提取

取子集

所有的SummarizedExperiment对象都可以保存在Experiments中,甚至是SingleCellExperiment。

sizeFactors()返回每一个细胞的标化因子组成的数值型向量,用于后续的标准化。

一般是自动生成。

如,使用 scran 包生成。

手动添加

colLabels()函数返回每个细胞标签的因子或向量,通常与非监督聚类的分组信息相关。

SingleCellExperiment对象为单细胞相关的包提供了一个基石,生于一个包,可以为许多包的输入。

后续,我们将使用SingleCellExperiment作为后续基本数据结构。

至此,再回头看看开始的那张图吧!

突然有了种,能随心所欲的感觉!

书还是看少了啊!

答第一问:

没错,不仅有 row 和 $index ,而且还有 column

如图。

遇到问题多查文档。

网页链接

答第二问:

写一个按钮,绑定一个可以consolelog()的方法即可。

一、具体步骤

1、点击我的电脑。

2、在右上方的搜索栏中输入“mygame”。

3、找到该文件夹后,点击进入。

4、在该文件夹中找到名称为“skyrim”的文件夹并点击进入。

5、在这个文件夹当中找到命名为“cme”的文件夹,并点击进入。

6、在该文件夹中继续找到名称为“save”的文件夹,并点击进入。

7、将你的“slot”数据点击导入到该文件夹中即可。

什么是插槽?

在vue中通过slot可以向组件中指定位置插入内容。

插槽的通俗理解就是是“占坑”,在组件模板中占好了位置,当使用该组件标签时候,组件标签里面的内容就会自动填坑(替换组件模板中<slot>位置),当插槽也就是坑<slot name=”mySlot”>有命名时,组件标签中使用属性slot=”mySlot”的元素就会替换该对应位置内容。

首先是单个插槽,单个插槽是vue的官方叫法,但是其实也可以叫它默认插槽,或者与具名插槽相对,我们可以叫它匿名插槽。因为它不用设置name属性。

单个插槽可以放在组件任意位置, 但是一个组件有且只能有一个单个插槽 ,相对应的,具名插槽就可以有很多个。

匿名插槽没有name属性,所以是匿名插槽,那么,插槽加了name属性,就变成了具名插槽。具名插槽可以在一个组件中出现N次,出现在不同的位置。下面的例子,就是一个有两个具名插槽和单个插槽的组件,这三个插槽被父组件用同一套css样式显示了出来,不同的是内容上略有区别。

匿名插槽和具名插槽都是在父组件中定义内容与样式,子组件只是负责放在哪。但是如果子组件提供数据,那这样的话需要子组件的<slot>把数据传递给父组件,父组件只需要提供样式即可。

在 260 中,我们为具名插槽和作用域插槽引入了一个新的统一的语法 (即 v-slot 指令)。它取代了 slot 和 slot-scope 这两个目前已被废弃但未被移除且仍在 文档中 的 attribute。

vue的自定义指令可以很好地或者说以更好的方式实现这个需求。

其中thisel还会告知自定义指令所在的元素,并在元素(每次)渲染前调用指令函数。

<script>

Vuecomponent('v-scoped',{

update:function(_scoped){

thiseltextContent=_scoped+thiseltextContent;

}

});

</script>

<style v-scoped="'body>'">

a{color:blue;}

</style>

有些功能确实需要在实际使用后才“看得到”文档中的相关阐述,死磕文档并不是好做法。当然,这要结合带着问题再回过头来看文档。先通读一遍文档,并时刻不认为“都看过了、没有需要的东西”是非常重要的。

以上就是关于[vue3进阶] 6.slot插槽3——作用域插槽全部的内容,包括:[vue3进阶] 6.slot插槽3——作用域插槽、OSCA教程1 | SingleCellExperiment对象、这个里面的scop到底是个什么东西啊,scope.row是获取一行的全部数据,我看还有scope.index的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/9787736.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存