前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【React】633- 使用 Hooks 优化 React 组件

【React】633- 使用 Hooks 优化 React 组件

作者头像
pingan8787
发布于 2020-06-24 09:47:46
发布于 2020-06-24 09:47:46
1.3K09
代码可运行
举报
文章被收录于专栏:前端自习课前端自习课
运行总次数:9
代码可运行

需求描述

由于我所在的业务是资讯内容类业务,因而在业务中会经常碰到如下场景:有一个内容列表,列表中需要按照一定的规则插入广告。除了获取广告数据,广告展现和点击后需要有打点上报逻辑。正常来说我们会这么写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React from 'react';export default class extends React.Component {  state = {newsData: [], adData: []};  constructor() { this.getNewsData(); }  getNewsData() {    const newsData = [...];    this.setState({newsData});    this.getAdData(newsData.length / 2); //根据新闻数和插入规则换算广告请求数  }  getAdData() {    const adData = [...];    this.setState({adData});  }  render() {    const {newsData, adData} = this.state;    const comps = [];    for(let i = 0; i < newsData.length; i++) {      // 根据插入规则判断当前新闻卡片后是否要插入广告      comps.push(<NewsCard {...newsData[i]} key={`news-${i}`} />);      if(i % 2) { comps.push(<AdCard {...adData[i/2]} key={`ad-${i}`} />); }    }    return (<div>{comps}</div>);  }}
class AdCard extends React.Component {  componentDidMount() {    observe(this.dom, () => {});  }  onClick = () => {};  onMouseUp = () => {};  onMouseDown = () => {};
  getDOM = dom => this.dom = dom;  render() {    return <div      ref={this.getDOM}      onMouseUp={this.onMouseUp}      onMouseDown={this.onMouseDown}      onClick={this.onClick}    >{this.props.title}</div>  }}

逻辑非常的简单,getNewsData() 拿到资讯列表数据之后计算需要请求的广告数调用 getAdData() 请求广告数据,最后根据插入规则将资讯和内容渲染到列表中。广告使用自定义组件渲染,使用 Intersection Observe API 实现广告曝光打点,监听 DOM 对应的点击时间实现广告点击打点。

如果说只有一个组件是这样的还好说,但是从上图可以看出,我们有大量的内容+广告混排场景。整体的逻辑和刚才说的都是一样的,唯一的区别是不同的列表对应不一样的显现形式。在这种情况下如何设计一个既能将通用逻辑提取,又能满足各个模块的自定义需求的通用模块就成了我们必须考虑的事情了。

React 组件设计模式

在具体讨论方案之前,我们先简单的了解一下常见的 React 组件设计模式。基本上分为以下几种方案:

  • Context 模式
  • 组合组件
  • 继承模式
  • 容器组件和展示组件
  • Render Props
  • Hoc 高阶组件

其中 Context 模式多用来在多层嵌套组件中进行跨组件的数据传递,针对我们当前组件层级不多的情况用处不是非常大,这里就不多表。我们来看看剩下的几个模式各自有什么优缺点,最终来评估下是否能应用到我们的场景中。

组合组件

组合组件是通过模块化组件构建应用的模式,它是 React 模块化开发的基础。除去普通的按照正常的业务功能进行模块拆分,还有就是将配置和逻辑进行解耦的组合组件方式。例如下面的组合方式就是利用类似 Vue 的 slot 方式将配置通过子组件的形式与 <Modal /> 组件进行组合,是的组件配置更优雅。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<Modal>  <Modal.Title>Modal Title</Modal.Title>  <Modal.Content>Modal Content</Modal.Content>  <Modal.Footer> <button>OK</button> </Modal.Footer></Modal>

又如下面的下拉选择组件,通过将 <Select/> 和 <Option> 进行组合,即达到了组件化配置的目的,又达到了通用方法的复用。同时将点击操作在 <Select/> 组件中直接传递下去方便了点击后直接修改选择状态。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export default function(props) {  return React.Children.map(props.children, child =>    React.cloneElement(child, {onClick() { console.log('click') }}  ));}
<Select>  <Option>Click Me!</Option>  <Option>Click Me!</Option></Select>

继承模式

继承模式是使用类继承的方式对组件代码进行复用。在面向对象编程模式中,继承是一种非常简单且通用的代码抽象复用方式。如果大部分逻辑相同,只是一些细节不一致,只要简单的将不一致的地方抽成成员方法,继承的时候复写该成员方法即可达到简单的组件复用。

不过我们知道 JS 中的继承本质上还是通过原型链实现的语法糖,所以在一些场景使用上没有其它语言的继承那么方便,例如无法直接实现多继承,多继承后的跨层级方法调用比较麻烦,适合简单的逻辑复用。另外通过继承方式会将父类中的所有方法都继承过来,不小心的话非常容易继承到不需要的功能。

容器组件和展示组件

展示组件和容器组件是将数据逻辑和渲染逻辑进行拆分从而降低组件复杂度的模式。使用容器组件可以把最开始的代码改写成如下的形式。这样做最大的好处是渲染层可以抽离成无状态组件,它不需要关心数据的获取逻辑,直接通过 props 获取数据渲染即可,针对展示组件能实现很好的复用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class NewsList extends React.Component {  state = {newsData: [], adData: []};  constructor() { this.getNewsData(); }  getNewsData() { this.getAdData(newsData.length / 2) }  getAdData() {}  render() { return <List news={this.state.newsData} ad={this.state.adData} /> }}
function List({news, ad}) {  const {newsData, adData} = this.state;  const comps = [];  for(let i = 0; i < newsData.length; i++) {    comps.push(<NewsCard {...newsData[i]} key={`news-${i}`} />);    if(i % 2) { comps.push(<AdCard {...adData[i/2]} key={`ad-${i}`} />); }  }  return (<div>{comps}</div>);}

但是我们也可以看到即使我们把渲染逻辑拆分出去了,本身组件的数据逻辑还是非常的复杂,没有做到很好的拆分。同时容器组件和展示组件存在耦合关系,所以无法很好的对逻辑组件进行复用。

Render Props

术语 “render prop” 是指一种在 React 组件之间使用一个值为函数的 prop 共享代码的简单技术 via: Render Props

它的本质实际上是通过一个函数 prop 将数据传递到其它组件的方式,所以按照这个逻辑我们又可以将刚才的代码简单的改写一下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class NewsList extends React.Component {  state = {newsData: [], adData: []};  constructor() { this.getNewsData(); }  getNewsData() { this.getAdData(newsData.length / 2) }  getAdData() {}  render() { return this.props.render(this.state) }}function List({news, ad}) {  const {newsData, adData} = this.state;  const comps = [];  for(let i = 0; i < newsData.length; i++) {    comps.push(<NewsCard {...newsData[i]} key={`news-${i}`} />);    if(i % 2) { comps.push(<AdCard {...adData[i/2]} key={`ad-${i}`} />); }  }  return (<div>{comps}</div>);}
<NewsList render={({newsData, adData}) => <List news={newsData} ad={adData} />

可以看到,通过一个函数调用我们将数据逻辑和渲染逻辑进行解耦,解决了之前数据逻辑无法复用的问题。不过通过函数回调的形式将数据传入,如果想要把逻辑拆分(例如资讯数据获取与广告数据获取逻辑拆分)会变得比较麻烦,让我想起了被 callback 支配的恐惧。

同时由于 render 的值为一个匿名函数,每次渲染 <NewsList /> 的时候都会重新生成,而这个匿名函数执行的时候会返回一个 <List /> 组件,这个本质上每次执行也是一个“新”的组件。所以 Render Props 使用不当的话会非常容易造成不必要的重复渲染。

HoC 组件

React 里还有一种使用比较广泛的组件模式就是 HoC 高阶组件设计模式。它是一种基于 React 的组合特性而形成的设计模式,它的本质是参数为组件,返回值为新组件的函数。我们来看看刚才的代码使用 HoC 组件修改后会变成什么样子。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function withNews(Comp) {  return class extends React.Component {    state = {newsData: []};    constructor() { this.getNewsData(); }    render() { return <Comp {...this.props} news={this.state.newsData} /> }  }}function withAd(Comp) {  return class extends React.Component {    state = {adData: []};    componentWillReceiveProps(nextProps) {      if(this.props.news.length) { this.getAdData(); }    }    render() { return <Comp {...this.props} ad={this.state.adData} /> }  }}const ListWithNewsAndAd = withAd(withNews(List));

可以看到这次改动最激动的地方在于我们第一次把数据逻辑进行了拆分,这也是高阶组件的魅力,它不局限于 UI 复用,使得代码复用更加自由(当然 Render Props 也是可以实现的)。

当然这种模式也并不是完美的,它也有它的缺点。我们可以看到它的本质是通过 props 在高阶组件中将多个数据传入到子组件中,非常类似 mixin 的形式。所以它也会有 mixin 的缺点,那就是属性名冲突的问题。由于不同的高阶组件由不同的开发者开发,内部会传递什么样的属性名到子组件中就成了未知数。同时多层组件的嵌套导致组件层级过多,在性能和调试上都会带来问题。

初版实现

了解完这些设计模式之后,我们再回头来看看我们的需求。通过观察了解不同的组件中的共同部分之后,我们可以将这种类型的组件抽象为如下描述“在一个内容列表中按照一定规则插入一定数量的和内容一致的一定样式的广告组件”。在这段描述中存在着三个不定因素:

  • 一定规则:不同的组件插入广告的逻辑是不一样的
  • 一定数量:不同的组件由于资讯内容的不同,插入逻辑的不同导致需要的广告数量也是不一样的
  • 一定样式:不同的组件由于资讯内容样式不同所以广告的样式自然也不相同

除却以上三个因素之外,广告其它的逻辑广告数据的获取以及广告的曝光和点击打点等都是通用的。最后我们将广告组件的逻辑顺着之前了解的设计模式抽离成三个部分:

  • 广告数据的获取:<Mediav.Provider />
  • 广告模块的渲染:<Mediav.Item /> Base 模块
  • 广告模块的插入:由具体业务处理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React from 'react';import Mediav from '@q/mediav';export default class extends React.Component {  state = {newsData: []};  constructor() { this.getNewsData(); }  render() {    const comps = [];    for(let i = 0; i < newsData.length; i++) {      comps.push(<NewsCard {...newsData[i]} key={`news-${i}`} />);      if(i % 2) { comps.push(<AdCard key={`ad-${i}`} />); }    }    return (<Mediav.Provider id="xxx">{comps}</Mediav.Provider>);  }}class AdCard extends Mediav.Item {  render() {    if(!this.props.type) { return null; }    const {title} = this.props;    return (<div ref={this.getDOM} onClick={this.onClick}      onMouseUp={this.onMouseUp} onMouseDown={this.onMouseDown}    >{title}</div>);  }}

通过容器组件 <Mediav.Provider /> 对数据获取逻辑进行封装,通过遍历子组件找到 <Mediav.Item /> 组件的示例个数来告知需要请求的广告数量。请求到广告后通过 Props 注入的形式传入到渲染组件中。而渲染组件 <AdCard /> 继承自 <Mediav.Item />,一方面能告诉容器组件它是广告组件的插槽,同时还能抽离广告曝光打点和点击打点等通用逻辑进行复用。在用户自定义的 <AdCard /> 组件中,我们可以自定义不同模块的广告组件的渲染样式,最终完成了一套广告组件的渲染。

不过这样实现还是有一些不足的地方。广告曝光检测需要依赖原生 DOM,而 Ref 使用 forwardRef() 在组件间传递稍微有点复杂,所以最后采用了继承模式进行公共方法的抽离。子组件继承后自行绑定父类的一些方法即可,在这点上理解起来有点晦涩,看起来总像是绑定了一些“不存在”的方法。

React Hooks

针对上面提出的问题,有没有什么方法可以解决呢?最终我想到了 Hooks 的方案,通过使用 Hooks 改写后能完美的解决这个问题。我们先简单的了解下什么是 Hooks,它允许我们在不编写 class 的情况下使用 state 和 React 生命周期等相关特性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const {useState, useEffect} = React;
function App() {  const [count, setCount] = useState(0);  useEffect(() => {    const interval = setInterval(() => setCount(count + 1), 1000);    return () => clearInterval(interval);  });
  return <span>{count}</span>;}
ReactDOM.render(<App />, document.getElementById('app'));

可以看到,它使用 useState 提供了 state,使用 useEffect 来做一些需要在声明周期中执行的方法。使用 useEffect 代理了原来生命周期的概念后,让代码理解起来更加简单。

当然这不是 Hooks 厉害的地方,它最厉害的地方是支持自定义 Hooks,通过自定义 Hooks 你能对逻辑进行统一的封装。针对一个数据获取的逻辑,我们需要定义 state,然后在初始化的时候去获取数据,当 id 发生变化后我们需要重新获取数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class User extends React.Component {  state = {    user: {}  }
  constructor(...args) {    super(...args);    const {name} = this.props;    this.getUserInfo(name)  }
  componentWillReceiveProps(nextProps) {    if(this.props.name === nextProps.name) {      return;    }    this.getUserInfo(nextProps.name);  }
  async getUserInfo(name) {    const user = await fetch(url, {name});    this.setState({user});  }
  render() {    return <div>{this.state.user.name}</div>  }}

可以看到我们获取用户信息的这个逻辑要实现需要在组件的各种地方写逻辑,代码一多之后非常容易造成需要各种跳行来查看某个数据逻辑的流程。而通过自定义 Hooks 我们能够将实现这个业务逻辑的代码全部整合到一处,最终达到业务逻辑的复用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function useUserInfo(name) {  const [user, setUser] = useState({});  useEffect(() => {    fetch(url, {name}).then(user => setUser(user));  }, [name]);  return user;}
function User({name}) {  const user = useUserInfo(name);  return <div>{user.name}</div>}

我们可以从下面的视频中一窥 Hooks 的魅力,同颜色的表示是同一个业务逻辑,最终同颜色的代码都被归置到一处实现了逻辑的解耦。

via: https://twitter.com/prchdk/status/1056960391543062528

使用 Hooks 改进

那 Hooks 是否能应用于我们的业务场景中呢?通过我们之前的分析我们知道,实际上我们的目的就是为了抽离出广告数据获取以及广告的曝光和点击打点这两个通用的业务逻辑出来。所以 Hooks 针对逻辑的封装正好可以为我们所用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import {useState, useEffect, useRef} from 'react';import {useFetchMediav, useMediavEvent} from '@q/mediav';
function App() {  const [newsData, setNewsData] = useState([]);  const [adData] = useFetchMediav({id: "xxx", length: newsData.length / 2});  useEffect(() => {    const newsData = [...];    setNewsData(newsData);  }, []);
  const comps = [];  for(let i = 0; i < newsData.length; i++) {    comps.push(<NewsCard {...newsData[i]} key={`news-${i}`} />);    if(i % 2) { comps.push(<AdCard data={adData[Math.floor(i/2)]} key={`ad-${i}`} />); }  }  return (<div>{comp}</div>);}
function AdCard({data}) {  const ref = useRef(null);  const bind = useMediavEvent(ref, data);  return (<div className="gg" ref={ref} {...bind}>{data.title}</div>);}

使用 useFetchMediav() 获取广告数据,通过 props 传入到 <AdCard /> 组件中,通过 useMediavEvent() 获取打点相关的方法,并绑定到对应的元素上。使用 Hooks 修改之后的代码不仅复用性提高了,整体代码的逻辑也变的更加可阅读起来。

后记

当然 Hooks 本身也不是没有缺点。为了在无状态的函数组件中创造去有状态的 Hooks,势必是需要通过副作用将每个 Hooks 缓存在组件中的。而我们没有指定 id 之类的东西,React 是如何区分每一个 Hooks 的呢?答案就是通过调用顺序。内部通过数组(链表?)根据调用顺序依次记录。为了遵守这个规则,Hooks 要求我们不能在 if 等会动态执行的地方进行 Hooks 的定义,因为这样有可能会导致 Hooks 执行顺序发生变化。其次 useEffect() 合并了多个生命周期,某些 Effect 需要在哪些生命周期执行以及如何控制其仅在这些生命周期执行,这些都对开发者带来了更大的挑战。稍微处理不当的话,很可能会造成页面的性能问题。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端自习课 微信公众号,前往查看

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

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

评论
登录后参与评论
1 条评论
热度
最新
请问为什么没有比对NCBI,这一步可以省略吗
请问为什么没有比对NCBI,这一步可以省略吗
回复回复点赞举报
推荐阅读
GATK的人类宿主的微生物检测流程PathSeq和在空转上的运用
Download the latest RefSeq accession catalog RefSeq-releaseXX.catalog.gz, where XX is the latest RefSeq release number, at: ftp://ftp.ncbi.nlm.nih.gov/refseq/release/release-catalog/ Download NCBI taxonomy data files dump (no need to extract the archive): ftp://ftp.ncbi.nlm.nih.gov/pub/taxonomy/taxdump.tar.gz Assuming these files are now in your current working directory, build the taxonomy file using PathSeqBuildReferenceTaxonomy:
追风少年i
2023/12/27
8960
GATK的人类宿主的微生物检测流程PathSeq和在空转上的运用
GATK的人类宿主的微生物检测流程PathSeq
PathSeq 是一个 GATK 管道,用于检测取自宿主生物体(例如人类)的短读长深度测序样本中的微生物。比如人类肿瘤测序数据,就可以使用它看看是否有微生物序列! 下图总结了它的工作原理。该管道先对r
生信技能树
2023/09/19
6660
GATK的人类宿主的微生物检测流程PathSeq
单细胞免疫组库数据分析||Seurat整合单细胞转录组与VDJ数据
在做10X单细胞免疫组库分析的是往往是做一部分BCR、TCR做一部分5‘转录组,那么怎样才能把两者结合到一起呢?
生信技能树jimmy
2020/06/05
4.2K0
课前准备----空间转录组微生物检测与分析
SpaceRanger生成的bam文件(10x基因组学)通过GATK PathSeq病原体发现pipeline进行处理,以识别微生物读reads并进行分类学分类。
追风少年i
2024/07/18
940
课前准备----空间转录组微生物检测与分析
微生物组分析 ·​ 进阶
数据分析是相同的,通过一个简单的课程理解其中的原理,就可以推而广之,延伸到其他类型的数据分析,如扩增子,转录组,单细胞分析等
生信宝典
2019/12/11
1.5K0
微生物组分析 ·​ 进阶
scRepertoire||单细胞免疫组库分析:R语言应用(一)
10× Genomics单细胞免疫组库VDJ分析必知必会(https://www.jianshu.com/p/db4831091a5c) 免疫组库数据分析||immunarch教程:快速开始(https://www.jianshu.com/p/9d7711879bf5) 免疫组库数据分析||immunarch教程:克隆型分析(https://www.jianshu.com/p/287f890d7ef4) 免疫组库数据分析||immunarch教程:探索性数据分析(https://www.jianshu.com/p/dd4fcfb63627) 免疫组库数据分析||immunarch教程:载入10X数据(https://www.jianshu.com/p/7379d0a809a8) 免疫组库数据分析||immunarch教程:GeneUsage分析(https://www.jianshu.com/p/0dbdd6733b34) 免疫组库数据分析||immunarch教程:Diversity 分析(https://www.jianshu.com/p/8b846094c092) 免疫组库数据分析||immunarch教程:Clonotype tracking(https://www.jianshu.com/p/79ee2c5871a7) 免疫组库数据分析||immunarch教程:Clonotypes annotation(https://www.jianshu.com/p/effc2ad05f47) 免疫组库数据分析||immunarch教程:Kmer 与 Motif 分析(https://www.jianshu.com/p/f2b7d0153432)
生信技能树jimmy
2020/09/21
5.6K0
scRepertoire||单细胞免疫组库分析:R语言应用(一)
SeekSoulTools — 单细胞转录组学一站式分析工具
SeekSoulTools 是寻因生物自主开发的一套处理单细胞转录组数据的软件,用于识别细胞标签barcode,比对定量,得到可用于下游分析的细胞表达矩阵,之后进行细胞聚类和差异分析,产品不仅支持SeekOne系列试剂盒产出数据,还可通过对barcode的描述,支持各种自定义设计结构。软件使用教程已经写的很好了,这边仅仅是作为知识的搬运工,记录一下测试体验过程。
生信菜鸟团
2024/07/10
4950
SeekSoulTools — 单细胞转录组学一站式分析工具
单细胞空间宏基因组揭秘微生物群对癌症空间和细胞异质性的作用
在癌症患者的肿瘤中,恶性细胞被复杂的非恶性细胞网络所包围,非恶性细胞网络根据其细胞类型和丰度,可能具有促肿瘤或抗肿瘤作用。体外和临床前动物模型表明,肿瘤相关菌群中的细菌在癌症发展、转移、免疫监视和化疗耐药中起作用。此外,33种主要癌症的肿瘤内微生物群中的分子证据,以及显示泛细菌标志物与免疫和上皮细胞靶标共定位的成像数据,都表明了肿瘤内微生物群有大量存在于癌细胞内的“胞内菌”。
追风少年i
2022/11/24
1.1K0
单细胞空间宏基因组揭秘微生物群对癌症空间和细胞异质性的作用
GMSB文章七:微生物整合分析
本文通过多元方差分析和典型相关分析研究微生物(species)、细胞因子(cytokine)和短链脂肪酸(SCFA)之间的相关关系。以下是两种分析的定义:
生信学习者
2024/06/29
1220
肠道微生物组的未来,还要看转录组
近年来,肠道微生物组一直是研究的焦点之一。肠道微生物组不仅在基础研究中揭示了其对人体各器官系统的调节功能,同时在临床研究中也逐渐揭示了与多种疾病之间的紧密联系[1]。尽管人们已经对肠道微生物组的重要性有了深刻的认识,但其具体功能机制仍有大量未知领域需要探索。
生信技能树jimmy
2023/12/05
4190
肠道微生物组的未来,还要看转录组
新冠疫情下的生信分析 | fastv
新冠疫情席卷全球,我们尚不得知病毒的发源地及特效治疗方案。最有效的防控手段还是在疫情爆发的早期做好隔离工作,切断传播途径。例如前些日子的北京,局部爆发后迅速控制到新增0,而对比美利坚每天新增数万… 这其中,离不开快速平行检测技术加持。
生信菜鸟团
2020/07/14
1.7K0
单细胞免疫组库基础介绍
免疫系统中主要包含两类淋巴细胞:B lymphocytes (B cells) 和 T lymphocytes (T cells)。B cells 和 T cells 的区别在于表达的 antigen receptor 的结构(structure),分别是B-cell receptor (BCR) 和 T-cell receptor (TCR)。
生信技能树jimmy
2022/11/24
2K0
单细胞免疫组库基础介绍
245热图展示微生物组的物种和功能丰度或有无、距离矩阵
NGS系列文章包括NGS基础、在线绘图、转录组分析 (Nature重磅综述|关于RNA-seq你想知道的全在这)、ChIP-seq分析 (ChIP-seq基本分析流程)、单细胞测序分析 (重磅综述:三万字长文读懂单细胞RNA测序分析的最佳实践教程)、DNA甲基化分析、重测序分析、GEO数据挖掘(典型医学设计实验GEO数据分析 (step-by-step))、批次效应处理等内容。
生信宝典
2020/09/01
3K0
245热图展示微生物组的物种和功能丰度或有无、距离矩阵
利用计算预测生物学平台开发微生物组创新疗法|BMC128完成首次患者给药
2022年7月26日,开发基于微生物的创新疗法的临床阶段生物制药公司Biomica(也是Evogene的子公司)宣布,其基于微生物的免疫肿瘤学候选药物BMC128的I期临床试验的第一例患者已经完成给药。
智药邦
2022/11/16
2760
利用计算预测生物学平台开发微生物组创新疗法|BMC128完成首次患者给药
不走寻常路的单细胞表达量矩阵读取
但是我看到了一个比较狡猾的数据集(GSE133283),它官网给出来了的文件如下所示:
生信技能树
2024/03/06
5340
不走寻常路的单细胞表达量矩阵读取
工具:MultiCOP微生物组和代谢组关联分析工具
人类健康与微生物群之间的联系,包括在代谢水平上的潜在疾病风险,已得到充分证实。然而,由于涉及的大量数据和它们之间错综复杂的相互作用所造成的分析挑战,理解这种关系背后的确切机制仍然不清楚。我们提出了多元相关追踪(MultiCOP)算法,该算法有效地整合微生物组和代谢组数据,通过相关性追踪和随机投影来揭示微生物与代谢物的相互作用,并找到相关的微生物/代谢物。MultiCOP算法中相关搜索和随机投影的使用使其超越了其他方法的限制。不同于它的同类产品,MultiCOP不依赖于对两个数据集之间的关系的假设,例如线性。此外,它有效地处理多变量数据。我们进行了大量的模拟来评估MultiCOP的性能。此外,我们采用所提出的方法分别探索炎症性肠病患者和慢性缺血性心脏病患者的微生物-代谢物相互作用。
生信学习者
2025/01/13
990
单细胞空间宏基因组揭秘微生物群对癌症空间和细胞异质性的作用2
鉴于肿瘤内菌群在单个肿瘤组织中具有异质性分布,试图确定这种空间分布是否与TME内的不同功能相关(DSP技术),这里当然选择了丰度最高的前几种微生物。
追风少年i
2022/12/14
7370
单细胞空间宏基因组揭秘微生物群对癌症空间和细胞异质性的作用2
前沿综述 | 微生物群落单细胞转录组技术的进展和挑战
单细胞RNA-seq (scRNA-seq)作为一种流行的工具,通过提供单细胞中单核苷酸分辨率的所有转录本的列表来绘制真核细胞状态图。在过去的几年中,scRNA-seq在人和小鼠细胞中广泛应用并取得重大进展。然而,微生物学的绝大多数研究仍然依赖于平均数千甚至数百万个细菌的批量测量。
尐尐呅
2022/04/01
1K0
前沿综述 | 微生物群落单细胞转录组技术的进展和挑战
比较微生物组中的差异分析方法
在微生物组研究中我们常常需要根据某些感兴趣的表型来找到与其相关的特征(比如菌群、OTU、基因家族等等)。但微生物组学的数据结构导致了这必然是一项相当艰巨的任务,因为他们:
生信菜鸟团
2021/12/13
7.2K0
比较微生物组中的差异分析方法
Science: 微生物单细胞、高通量、菌株分辨率,我全都要!| 深度长文
近期,哈佛大学和麻省理工学院的研究团队在微生物群落研究方法学上取得重要突破,发明了微生物高通量单细胞基因组学技术——Microbe-seq。相关成果以研究长文(Research Article)的形式于6月3日在Science上以High-throughput, single-microbe genomics with strain resolution, applied to a human gut microbiome为题发表。
生信技能树jimmy
2022/06/13
9150
Science: 微生物单细胞、高通量、菌株分辨率,我全都要!| 深度长文
推荐阅读
相关推荐
GATK的人类宿主的微生物检测流程PathSeq和在空转上的运用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档