You need to enable JavaScript to run this app. React中如何实现JS动态生成div点击跳转带参数路由并传参
优惠活动
大模型
产品
解决方案
定价
更多

React中如何实现JS动态生成div点击跳转带参数路由并传参

实现方案

第一步:配置Home组件跳转逻辑

你当前的路由写法对应react-router v5版本,直接通过<Route>挂载的组件默认会自带路由相关属性,如果在Home组件中能正常拿到this.props.history可直接使用,拿不到的话就用withRouter高阶组件包裹导出:

// Home组件文件底部导出代码
import { withRouter } from 'react-router-dom'
export default withRouter(Home)

之后修改你的printCampaigns方法,解决循环闭包问题+绑定跳转逻辑:

async printCampaigns(){
    const totalSupply = 5
    const mainDiv = document.getElementById("myID")
    // 把var改成let解决循环闭包问题
    for(let i = 0;i<totalSupply;i++){
        const _div = document.createElement('div')
        // 给div绑定对应id
        _div.id = i
        // 绑定点击跳转逻辑
        _div.onclick = () => {
            this.props.history.push(`/campaign/${_div.id}`)
        }
        mainDiv.appendChild(_div)
    }
}

如果调用printCampaigns时出现this指向undefined的问题,需要在构造函数里绑定this,或者把方法改成箭头函数写法:

// 构造函数绑定写法
constructor(props) {
  super(props)
  this.printCampaigns = this.printCampaigns.bind(this)
}

// 箭头函数写法,直接替换原方法定义即可
printCampaigns = async () => {
  // 原有逻辑不变
}

第二步:Campaign组件获取路径id参数

和Home组件逻辑一致,如果是直接挂载在Route上的组件,直接通过路由props就能拿到参数:

class Campaign extends Component{
  componentDidMount() {
    // 直接获取路径中的id参数
    const id = this.props.match.params.id
    console.log('获取到的id为', id)
  }
}
// 拿不到参数的话同样用withRouter包裹导出即可
export default withRouter(Campaign)

React规范优化建议

不建议直接操作DOM创建元素,你可以把列表数据存在state中,在render方法里直接渲染元素,可维护性更高:

class Home extends Component{
  state = {
    totalSupply: 5
  }
  goToCampaign = (id) => {
    this.props.history.push(`/campaign/${id}`)
  }
  render() {
    return (
      <div id="myID">
        {Array.from({length: this.state.totalSupply}).map((_, index) => (
          <div key={index} onClick={() => this.goToCampaign(index)}>
            {/* 元素自定义内容 */}
          </div>
        ))}
      </div>
    )
  }
}

内容的提问来源于stack exchange,提问作者Jyu Viole Grace

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 08:18:03