![[vue3进阶] 6.slot插槽3——作用域插槽,第1张 [vue3进阶] 6.slot插槽3——作用域插槽,第1张](/aiimages/%5Bvue3%E8%BF%9B%E9%98%B6%5D+6.slot%E6%8F%92%E6%A7%BD3%E2%80%94%E2%80%94%E4%BD%9C%E7%94%A8%E5%9F%9F%E6%8F%92%E6%A7%BD.png)
作用域插槽——又是一个抽象的名字,那我用简单的语言解释一下
当父组件里写的插槽的内容需要使用子组件里的数据时,这时候就要用作用域插槽这个功能
可能你还是没明白,不过没关系,咱们还是通过写一个小例子来学习
我们现在有一个子组件,叫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的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)