You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中导入tree.js节点label值并动态作为id prop传递给View组件的方法

实现方案

步骤1:导出treeData并提取可用id列表

首先修改tree.js文件,在末尾添加导出语句,方便其他文件引入:

// tree.js 末尾新增
export default treeData

如果需要对传入的id做合法性校验,可以新增一个提取所有有效id的工具函数:

// 可以直接加在tree.js里,也可以单独放在工具文件中
export const getAllValidIds = (data) => {
  const ids = []
  Object.values(data).forEach(firstLevel => {
    if (firstLevel.nodes) {
      Object.values(firstLevel.nodes).forEach(secondLevel => {
        ids.push(secondLevel.label)
      })
    }
  })
  return ids
}

步骤2:修改路由配置,支持动态id参数

你当前的路由没有携带参数,我们需要把id放到路由路径中,既可以实现动态传值,刷新页面也不会丢失参数:

// Nav.js 顶部先引入tree.js的内容,注意替换为你实际的文件相对路径
import treeData, { getAllValidIds } from './tree.js'
import { Redirect } from 'react-router-dom'
const validIds = getAllValidIds(treeData)

// 修改Route部分的代码
function NAV() {
  return (
    <Router>
      <Navbar />
      <Switch>
        <Route path='/' exact component={Home} />
        {/* 新增id动态参数 */}
        <Route 
          path='/jbrowse/:id' 
          render={(props) => {
            const currentId = props.match.params.id
            // 校验id合法性,避免传入不存在的id导致加载报错
            if (!validIds.includes(currentId)) {
              return <Redirect to='/' />
            }
            return <View {...props} id={currentId} />
          }} 
        />
      </Switch>
    </Router>
  )
}

步骤3:树节点点击跳转配置

在你渲染树形结构的组件中,给每个二级节点绑定点击跳转事件即可,以react-router v5的useHistory hook为例:

import { useHistory } from 'react-router-dom'

function YourTreeComponent() {
  const history = useHistory()
  // 二级节点点击触发的函数,入参为节点的label值
  const handleNodeClick = (nodeLabel) => {
    history.push(`/jbrowse/${nodeLabel}`)
  }
  // 其余树形结构渲染逻辑
}

如果你用的是第三方UI库的树形组件(比如antd的Tree),只需要在组件的onSelect/onClick回调中拿到对应节点的label值,调用上面的跳转逻辑即可。

步骤4:优化View组件(可选)

建议给View组件加错误捕获逻辑,避免文件缺失导致页面直接崩溃,同时修改参考序列track的id避免不同物种数据缓存冲突:

function View(props) {
  try {
    const fasta= require(`../genome_data/${props.id}.fna`)  
    const fai= require(`../genome_data/${props.id}.fna.fai`)
    const gff= require(`../genome_data/${props.id}.sorted.gff.gz`)
    const gfftbi = require(`../genome_data/${props.id}.sorted.gff.gz.tbi`)
    const ssrbw = require(`../genome_data/${props.id}.bw`)

    const assembly ={
      name: `${props.id}`,
      sequence: {
        type: 'ReferenceSequenceTrack',
        // 替换为和当前id绑定的值,避免不同物种缓存冲突
        trackId: `${props.id}-ReferenceSequenceTrack`,
        adapter: {
          type: 'IndexedFastaAdapter',
          fastaLocation: { uri: fasta },
          faiLocation: { uri: fai },
        },
      },
      aliases: [props.id],
    }
    // 其余组件逻辑
  } catch (err) {
    return <div>当前物种基因组数据加载失败,请检查对应文件是否存在</div>
  }
}

内容的提问来源于stack exchange,提问作者AU_97_CB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 12:15:08