在.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. 6. vue组件详解(一)

    主要内容: 1. 组件的基本使用 2. 全局组件和局部组件 3. 父组件和子组件 4. 组件语法糖的写法 5. 组件data关联的写法 6. 父子组件的通信 组件系统是 Vue 的一个重要概念,因为它 ...

  2. Go的map

    目录 map 一.map的创建 1.map的类型 2.定义并初始化 二.给map添加元素 三.获取map的元素 四.删除map的元素 五.获取map的长度 六.map的类型 七.map的相等性 八.循 ...

  3. mysql索引的性能分析

    [前言]上一篇博客介绍了InnoDB引擎的索引机制,主要围绕B+树的建立,目录项记录里主键和页号,到页目录下的二分法定位数据:二级索引里的主键和索引列,及其回表操作.这一篇分析一下索引的性能,围绕如何 ...

  4. 女朋友看了会生气的回答 URI和URL有什么区别?

    URL是什么 URL 代表着是统一资源定位符(Uniform Resource Locator).作用是为了告诉使用者 某个资源在 Web 上的地址.这个资源可以是一个 HTML 页面,一个 CSS ...

  5. 阅读源码,HashMap回顾

    目录 回顾 HashMap简介 类签名 常量 变量 构造方法 tableSizeFor方法 添加元素 putVal方法 获取元素 getNode方法 总结 本文一是总结前面两种集合,补充一些遗漏,再者 ...

  6. Office2013安装教程(附安装包+激活工具)

    office2013中文版是微软推出的新一代office办公软件,重点加强了云服务项目,Office2013[☜借你手指用下]采用了全新的Merto界面,使用户更加专注于内容,配合Windows 8的 ...

  7. 『笔记』2-SAT

    前置 \(SAT\) 是适定性( \(Satisfiability\) )问题的简称.一般形式为 \(k \ -\) 适定性问题,简称 \(k-SAT\) .而当 \(k>2\) 时该问题为 \ ...

  8. 漫漫Java路1—基础知识2—注释和命名规则

    ## 注释 1. 单行注释 ```java //这是一个注释 ``` 2. 多行注释 ```java /* 这是一个注释 */ ``` 3. 文档注释 ```java /** * * * */ ``` ...

  9. Go语言|类型转换和类型别名

    类型转换 同类型之间的转换 Go语言中只有强制类型转换,没有隐式类型转换.该语法只能在两个类型之间支持相互转换的时候使用. import "fmt" func main() { v ...

  10. LAB1 启动操作系统

    从机器上电到运行OS发生了什么? 在电脑主板上有一个Flash块,存放了BIOS的可执行代码.它是ROM,断电不会丢掉数据.在机器上电的时候,CPU要求内存控制器从0地址读取数据(程序第一条指令)的时 ...