react router 父子路由如何通信

发布于 2022-09-11 17:42:51 字数 2461 浏览 14 评论 0

问题描述

应该是父组件和子路由<Route>的通信问题:
Home 组件中有一个子<Route>指向city组件,如果让子<Route>里的方法更改 Home 组件的 state?

如果不用 redux 之类的状态管理工具可以实现吗?

相关代码

// Home 组件
import React, { Component } from 'react';
import { BrowserRouter as Router, Route, Link, withRouter } from "react-router-dom";
import { fpost } from '../../assets/lib/fetch'
import api from '../../assets/utils/api'
import './Home.scss'

import City from '../city/City'

class Home extends Component {
    constructor(props) {
        super(props);
        
        this.state = {
            date: new Date(),
            searchDay: '2019-02-12', 
            showDay: '02月12日', 
            depCity: { //出发
                name: '上海',
                showName: '上海',
                station: ''
            },
            desCity: { //到达
                name: '苏州',
                showName: '苏州',
                station: ''
            }
        };
    }
    
    //进入城市选择出发城市
    btnChoseDep = () => {
        this.props.history.push("/index/city");
    }

    //进入城市选择到达城市
    btnChoseDes = () => {
        this.props.history.push({
            pathname : '/index/city',
            state : {
                cname: this.state.depCity.name,
                cid: this.state.depCity.id
            }
        })
    }

    render() {
        return (
            <div className="Home">
                {/* 出发城市、到达城市 */}
                <section className="cityArea flex_box flex_align_center">
                    <dl className="depture flex_1">
                        <dt>出发城市/车站</dt>
                        <dd onClick={this.btnChoseDep}>{this.state.depCity.showName + this.state.depCity.station}</dd>
                    </dl>
                    <span className="exchange iconf color">&#xe62c;</span>
                    <dl className="destination flex_1">
                        <dt className="r">到达城市/车站</dt>
                        <dd onClick={this.btnChoseDes} className="r">{this.state.desCity.showName + this.state.desCity.station}</dd>
                    </dl>
                </section>
                
                {/* 嵌套路由 City组件 */}
                <Route path={`${this.props.match.path}/city`} component={City}></Route>
            </div>
        );
    }
}

export default withRouter(Home);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

总攻大人 2022-09-18 17:42:51

不能!!!!!

埋情葬爱 2022-09-18 17:42:51

可以吧,在Home里写一个方法,然后通过

    this.props.history.push({
        pathname : '/index/city',
        state : {
            func: func, //方法
            
        }
    })

或者在Route的时候传进去

<Route 
    path={`${this.props.match.path}/city`} 
    render={props => <City {...props} func={this.func}
/>></Route>

前提是Home不卸载,我看你代码应该也不会卸载

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文