在.net开发员眼里,如果使用MVC,根据路由匹配原则,可以通过各种方式接收参数,比如 /Post/List/1, /Post/List/2,或者 /Post/List?id=1,/Post/List?id=2,后端PostController中的List Action都能接收到id为1或者2的参数,进行相应操作;但是,我们使用Ant Design For React的时候,如果使用react-router-dom作为路由,不管使用哪种参数,点击不同参数页面链接的时候,地址栏里页面参数是变了,但是后台页面居然不刷新,还是维持原先的页面,这是怎么一回事呢,我们来一探究竟。

我们的思路是:在P_Index页面里面使用js获取地址栏参数的方法,获取参数,进行页面渲染,代码如下:

Main.js (主要的框架页面,我们要渲染P_Index)

......
import { BrowserRouter as Router, Switch, Route, Link} from "react-router-dom";
import P_Index from './p/Index';
......
class Main extends React.Component {
......
render() {
return (
<Router>
<Layout>
<Sider collapsible collapsed={this.state.collapsed}>
......
<Switch>
<Route path="/p">
<P_Index></P_Index>
</Route>
.......
</Switch>
</Content>
</Layout>
</Layout>
</Router>
);
}
} export default Main;

/p/Index.js (负责接收参数进行渲染的页面)

import React from 'react';
...... export default class P_Index extends React.Component { //页面参数
pageId = window.location.pathname.split('/')[2];
//pageId = window.location.search.substr(1);

async componentDidMount() {
let data =  await getData(pageId);
this.setState({...data});
} render() {
if(this.state.type){
switch(this.state.type){
case "aaa":
return (
......
);
case "bbb":
return (
.......
);
} }else{
return ('loading')
}
}
}

代码也很简单,页面加载时根据地址栏参数查不同数据,改变state,然后根据获取的数据进行渲染。

但是,我们在地址栏里不管是输入 /p/1 还是 /p/2 或者 /p/3,后面的页面丝毫不变化,都是第一次渲染的页面。页面内打断点,跟踪,发现地址栏改变了页面根本就没有重新渲染。我们又尝试了 /p?1 、/p?2 或者 /p?id=1、/p?id=2,都一样。这可难倒我们了,不管是html、.net WebForm、MVC,地址栏一变,页面不要重新渲染的吗?为什么在react里面就不一样了呢?

(输入不同地址页面内容竟然一样,而参数在第一次加载页面的时候已经拿到了)

抱着这个疑问,我们查询了官方的react-router-dom文档,然后根据文档结合项目,最终找到了解决的方法,摒弃了在页面里使用 window.location.pathname 或者 window.location.search 方式取参数的方法,直接在路由中配置。

改进后的文件如下:

Main.js

......
import { BrowserRouter as Router, Switch, Route, Link, useParams} from "react-router-dom";
import P_Index from './p/Index';
...... function ShowPage () {
let { id } = useParams();
console.log(id);
return <P_Index id={id}></P_Index>;
}; class Main extends React.Component {
......
render() {
return (
<Router>
<Layout>
<Sider collapsible collapsed={this.state.collapsed}>
......
<Switch>
<Route path="/p/:id">
<ShowPage></ShowPage>
</Route>
......
</Switch>
</Content>
</Layout>
</Layout>
</Router>
);
}
} export default Main;

/p/Index.js

import React from 'react';
......
export default class P_Index extends React.Component {
constructor(props) {
super(props);
}
......
componentWillReceiveProps = async (nextProps) => {
const { id } = this.props;
if (id !== nextProps.id) {
let data = await getData(nextProps.id);
this.setState({ ...data });
}
} //页面参数
//pageId = window.location.pathname.split('/')[2];
//pageId = window.location.search.substr(1); async componentDidMount() {
let data = await getData(this.props.id);
this.setState({ ...data });
}
......
render() {
if (this.state.type) {
switch (this.state.type) {
case "aaa":
return (
......
);
case "bbb":
return (
......
);
}
} else {
return ('loading')
}
}
}

我们增加了一个componentWillReceiveProps方法,该方法在每次属性改变时都会执行,这下通过菜单点击,只要地址栏里参数变化,就算是同一个页面,页面也会进行刷新,数据也会发生相应变化。至此,问题完美解决!

SAAS云平台搭建札记系列文章:

SAAS云平台搭建札记: (一)浅论SAAS多租户自助云服务平台的产品、服务和订单

SAAS云平台搭建札记: (二)Linux Unbutu下.Net Core整套运行环境的搭建

SAAS云平台搭建札记: (三) AntDesign + .Net Core WebAPI权限控制、动态菜单的生成

SAAS云平台搭建札记: (四) AntD For React使用react-router-dom路由接收不同参数页面不刷新的问题

SAAS云平台搭建札记: (四) AntD For React使用react-router-dom路由接收不同参数页面不刷新的问题的更多相关文章

  1. SAAS云平台搭建札记: (一) 浅论SAAS多租户自助云服务平台的产品、服务和订单

    最近在做一个多租户的云SAAS软件自助服务平台,途中遇到很多问题,我会将一些心得.体会逐渐分享出来,和大家一起探讨.这是本系列的第一篇文章. 大家知道,要做一个全自助服务的SAAS云平台是比较复杂的, ...

  2. SAAS云平台搭建札记: (二) Linux Ubutu下.Net Core整套运行环境的搭建

    最近做的项目,由于预算有限,公司决定不采购Windows服务器,而采购基于Linux的服务器. 一般的VPS服务器,如果使用Windows系统,那么Windows Server2012\2016安装好 ...

  3. SAAS云平台搭建札记: (三) AntDesign + .Net Core WebAPI权限控制、动态菜单的生成

    我们知道,当下最火的前端框架,非蚂蚁金服的AntDesign莫属,这个框架不仅在国内非常有名,在国外GitHub上React前端框架也排名第一.而且这个框架涵盖了React.Vue.Angular等多 ...

  4. Redis之高可用、集群、云平台搭建

    原文:Redis之高可用.集群.云平台搭建 文章大纲 一.基础知识学习二.Redis常见的几种架构及优缺点总结三.Redis之Redis Sentinel(哨兵)实战四.Redis之Redis Clu ...

  5. Redis之高可用、集群、云平台搭建(非原创)

    文章大纲 一.基础知识学习二.Redis常见的几种架构及优缺点总结三.Redis之Redis Sentinel(哨兵)实战四.Redis之Redis Cluster(分布式集群)实战五.Java之Je ...

  6. 接口自动化平台搭建(四),自动化项目Jenkins持续集成

    一.Jenkins的优点 1.传统网站部署流程   一般网站部署的流程 这边是完整流程而不是简化的流程 需求分析—原型设计—开发代码—内网部署-提交测试—确认上线—备份数据—外网更新-最终测试 ,如果 ...

  7. 轻松搭建Windows8云平台开发环境

    原文:轻松搭建Windows8云平台开发环境 Windows Store应用是基于Windows 8操作系统的新一代Windows应用程序,其开发平台以及运行模式和以往传统平台略有不同.为了帮助更多开 ...

  8. 搭建自己的XenServer+CloudStack云平台,提供IaaS服务(一)环境搭建

    目标 搭建一个完整的基于XenServer和CloudStack的虚拟化平台,提供IaaS服务. 搭建三台安装了XenServer的服务器 搭建一台安装了CloudStack的服务器用以管理云平台 搭 ...

  9. SAP CX Upscale Commerce : SAP全新推出的电商云平台

    大家好,我是Andy Chen,是SAP成都研究院年轻的SAP CX Upscale Commerce (后面将会以Upscale简称)开发团队的一名产品经理.CX的全称是Customer Exper ...

随机推荐

  1. SpringBoot2.x中的AOP机制总结(附带demo)

    寄语:刚开始学aop的时候是大三吧,老师讲的不好,我也没学好,导致现在才有个较为清晰的认知,那个时候只知道有aop, 根部不明白aop的作用,时至今日,任然觉得aop难以咀嚼,奈何平时不用面试要用,特 ...

  2. React Context 理解和使用

    写在前面 ​ 鉴于笔者学习此内容章节 React官方文档 时感到阅读理解抽象困难,所以决定根据文档理解写一篇自己对Context的理解,文章附带示例,以为更易于理解学习.更多内容请参考 React官方 ...

  3. springboot启动抛出javax.websocket.server.ServerContainer not available

    问题描述:spring boot接入websocket时,启动报错:javax.websocket.server.ServerContainer not available <dependenc ...

  4. 从零开始使用 webpack5 搭建 react 项目

    本文的示例项目源码可以点击 这里 获取 一.前言 webpack5 也已经发布一段时间了,其模块联邦.bundle 缓存等新特性值得在项目中进行使用.经过笔者在公司实际项目中的升级结果来看,其提升效果 ...

  5. 最近没事DIY了个6通道航模遥控器

    在网上买了个外壳,挖空后换成自己的电路版. 开机后图: 液晶屏是320x240的,没有合适的贴纸,直接就这么用了 遥控器的内部电路有点乱哈,没办法,低成本就只能全靠跳线了 还好都能正常工作. 接收器也 ...

  6. SENet详解及Keras复现代码

    转: SENet详解及Keras复现代码 论文地址:https://arxiv.org/pdf/1709.01507.pdf 代码地址:https://github.com/hujie-frank/S ...

  7. 10. vue之webpack打包详解

    一.什么是webpack webpack官网给出的定义是 本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler).当 webpack 处理应 ...

  8. 剑指 Offer 44. 数字序列中某一位的数字 + 找规律 + 数位

    剑指 Offer 44. 数字序列中某一位的数字 Offer_44 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author Wale ...

  9. Python-tkinter-window

    示例代码讲解 1.加载tkinter模块 2.创建一个窗口 3.设置窗口的主题 4.开始窗口的事件循环 import tkinter 2 win = tkinter.Tk() 3 win.title( ...

  10. PTA 中序输出叶子结点

    6-8 中序输出叶子结点 (10 分)   本题要求实现一个函数,按照中序遍历的顺序输出给定二叉树的叶结点. 函数接口定义: void InorderPrintLeaves( BiTree T); T ...