SAAS雲平台搭建札記: (四) AntD For React使用react-router-dom路由接收不同參數頁面不刷新的問題


    在.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路由接收不同參數頁面不刷新的問題

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM