1. 程式人生 > >React-router(5)params 路由傳參

React-router(5)params 路由傳參

5、引數

參考 4.params.js

React路由取引數,有兩種:

  1. ?a=1 :這種屬於 search 字串,在 location.search 裡取值;
  2. /a/123 :這種需要從 match.params裡取值;

但無論哪種,路由獲取到的值,是跳轉後的那一刻的值,而不是實時更新的最新值。

具體來說:

  1. 假如 Link 標籤跳轉路徑實時繫結輸入框的一個值(假如值是 abc),這個值作為引數傳遞;
  2. 點選跳轉後,子元件讀取到當前傳的值 abc
  3. 此時修改【1】中輸入框的值為 def
  4. 請問子元件讀取到的值此時是多少?abc 還是 def
  5. 答案是 abc
  6. 原因是當前路徑是 abc
    ,這個值讀取到的是當前路徑的值,而不是將要跳轉的路徑的值,因此不是實時更新的(顯然,也不應該是實時更新的);

手動修改位址列的 url:

  1. 假如手動修改 url 為 ggg,那麼請問讀取到的值是多少?
  2. 我還真去試了一下。答案是除非你修改後,按回車跳轉路徑,會讀取到最新的;
  3. 否則,依然保持為修改前 abc
  4. 即使你重新觸發 render 方法(比如修改 state 來實現),依然獲取到的是 abc ,而不是 ggg

獲取最新值:

  1. 如果你想要獲取到新值,那麼請重新點選跳轉(綁定了新的 url 的 Link 標籤)即可;
  2. 重新跳轉後(假如跳轉到同一個頁面),url 改變了,那麼元件會重新載入麼?
  3. 答案是否定的,如果跳轉到同一個元件,僅是引數改變,那麼元件是不會重新載入的,即元件內的資料保持之前不變,只有傳遞的引數改變了(生命週期函式也不會重新執行);

比較特殊的,有關生命週期:

  1. 元件的生命週期函式,只會在第一次掛載的時候執行,如果前後跳轉是同一個元件,那麼該元件的生命週期函式不會重複執行;
  2. 但 state 的生命週期,會多次執行(只要父元件的 state 改變了,子元件的相關函式會被執行);
  3. 由於路由資訊是通過 props 傳值的,因此也會多次觸發;
  4. 不過沒有影響,傳的值依然是舊值(因為路由資訊沒變);
  5. 但假如你在 state 生命週期函式裡做了一些什麼事情,可能需要注意一下會不會帶來不良影響(雖然一般不會);

示例:

【例行引入和子元件】

import React from "react";
import {HashRouter as Router, Link, Route} from 'react-router-dom'

const First = props => <div>
    第一個元件讀取引數(location.search) {props.location.search}
</div>

const Second = props => <div>
    第二個元件讀取引數(match.params.myParams) {props.match.params.myParams}
</div>

【父元件,負責配置路由和傳值】

class RoutingNested extends React.Component {
    constructor() {
        super()
        this.state = {
            firstNumber: 0,
            secondNumber: 0
        }
        this.changeFirst = this.changeFirst.bind(this)
        this.changeSecond = this.changeSecond.bind(this)
    }

    render() {
        return <div>
            <h3>4、React-router 傳參</h3>
            <h3>請在對應的跳轉標籤裡,輸入你想要傳的值</h3>
            <Router>
                <div>
                    <li>
                        <Link to={`${this.props.match.url}/1?a=${this.state.firstNumber}`}
                              onClick={() => {
                                  console.log('Link 標籤(跳轉到/1)的 onClick 事件', this.props.location)
                              }}>
                            示例1
                        </Link>
                        <input type="text" value={this.state.firstNumber} onChange={this.changeFirst}/>
                    </li>
                    <li>
                        <Link to={`${this.props.match.url}/2/${this.state.secondNumber}`}
                              onClick={() => {
                                  console.log('Link 標籤(跳轉到/2)的 onClick 事件', this.props.location)
                              }}>
                            示例2
                        </Link>
                        <input type="text" value={this.state.secondNumber} onChange={this.changeSecond}/>
                    </li>
                    <hr/>

                    <Route path={`${this.props.match.url}/1`} component={First}/>
                    <Route path={`${this.props.match.url}/2/:myParams`} component={Second}/>
                </div>
            </Router>
        </div>
    }

    changeFirst(e) {
        this.setState({
            firstNumber: e.target.value
        })
    }

    changeSecond(e) {
        this.setState({
            secondNumber: e.target.value
        })
    }
}

相關推薦

React-router5params 路由

5、引數 參考 4.params.js React路由取引數,有兩種: ?a=1 :這種屬於 search 字串,在 location.search 裡取值; /a/123 :這種需

Vue-router4路由、命名路由 和 程式設計式導航

路由傳參 案例:現在需要展示一個電影列表頁,點選每一部電影,會跳轉到該部電影詳情頁(跳轉時攜帶type和id) 程式碼實現(未攜帶type): index.js import Vue from 'vue' // 1. 匯入和安裝 import VueRouter from 'vue-ro

Vue-router5路由導航守衛

app.vue <template> <div> <h1>App根元件---路由導航守衛</h1> <!-- 路由的佔位符 --> <router-view></router-view>

React-router8Link 標籤 to 屬性為物件時路由資訊

8、Link 標籤 to 屬性為物件時(路由資訊傳值) 參考 6.routeInfo.js 在元件裡,每個元件的路由資料,都是各自獨立的。 在之前分析中,已知: match 屬性的值,儲存的是該 Route 標籤的路由; location

React Navigation 的使用基礎部分路由

原文連結還記得我們之前說過"我們講引數的時候會詳細說明"嗎?是的,就是現在。現在我們知道怎樣建立一個包含若干路由的棧導航器,還知道了在路由之間跳轉,現在讓我們來看看跳轉時怎樣向路由傳遞資料。有兩點:可以將引數放進物件中,作為navigation.navigate的第二個引數來

React-router11路由配置

11、路由配置 參考 9.routeConfigTable.js 簡單來說,就是有一個物件,如下: const RouteConfig = [ { path: 'first', component:

我的一個React路由巢狀多級路由路由之旅

在上一篇react路由之旅中,我們簡單地配置了react,進行了react路由及相關知識的學習,引入以及實現一個區域性跳轉的功能,接下來就是深入學習路由的巢狀以及傳參,這是工作中主要用要的。 我的react已經配置了redux(見我的redux之旅),所以這是在引入的外掛裡做的演示。 從App元件跳轉到New

vue.js路由vue-router——簡單路由基礎

styles mounted num 前言 vue.js ren main.c -s col 前言 vue.js除了擁有組件開發體系之外,還有自己的路由vue-router。在沒有使用路由之前,我們頁面的跳轉要麽是後臺進行管控,要麽是用a標簽寫鏈接。使用vue-rout

Vue-router1路由基礎

1. 使用 <component>標籤實現元件切換   <component> 是Vue提供的;有一個is屬性,is的作用就是顯示指定的元件      <template> <div> <h1>App根元件

一個 Yii + vue 專案5vue路由、yii驗證碼

有了一個簡單的驗證方法,於是需要寫一個前端頁面,首先在 vue src/ 建一個單頁面 login.vue <template> <div id="app"> <form> <div>

spring boot 學習筆記 5 檔案上

一、配置  新增依賴包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</

React-router10登入攔截

10、登入攔截 參考 8.needLogin.js 登入攔截說起來比較高大上,其實很簡單。 需要元件: 登入功能元件; 受保護元件(需要登入後才能訪問); 受保護元件的父元件(可選

React學習-- React原始碼5diff演算法

diff作為VirtualDOM的加速器,其演算法上的改進優化是React整個介面渲染的基礎和效能的保障。 diff會幫助我們就散出VirtualDOM中真正變化的部分,並只針對該部分進行原生DOM操作,而不是渲染整個頁面。從而保證了每次操作更新後頁面的高效渲

Linux驅動開發7——驅動模組

標頭檔案在include/linux/moduleparam.h 傳遞單個引數:module_param(name,type,perm) - name:模組引數的名稱 - type: 模組引數的資料型別(支援int long short uint ulong ushort型

原生ajax使用筆記- - -post方法

原生Ajax的post帶引數方法使用步驟: 1.建立一個核心物件XMLHttpRequest 2.編寫一個回撥函式 3.編寫請求方式和請求路徑(open操作) 4.編寫請求頭 5.傳送請求(send操作) 例子:模擬註冊使用者名稱,若填入的使用者名稱不存在,則提示可以使用;否

執行緒詳解,detach()大坑,成員函式做執行緒函式

陷阱1:子執行緒傳遞引數避免使用指標 先來看一段程式碼: 程式碼乍一看好像沒有什麼問題,執行有時也能成功,但是卻隱含了一個很大的bug。 通過除錯:變數i的地址:0x0076e384 {1},變數mvar和mvary的地址:0x003bfe40 {1},可以看

linux核心探索3--系統呼叫()

踩坑啊啊啊啊啊啊!!! 目錄 10、測試 核心版本: 開始: 1、編寫sys.c /usr/src/linux-4.18.11/kernel/sys.c 新增: #include <linux/linkage.

java呼叫批檔案.bat並動態

java程式碼: package test; import java.io.IOException; public class TestMain { public static void main(String [] args) { try { Proc

flask學習筆記:URL、URL反轉、重定向

1、URL傳參 對一個固定頁面下傳入url引數。需要給定一個id,並且使用<id>傳參,這樣才能返回一個值。 #-*- coding:utf-8 -*- from flask import Flask app = Flask(__name__) @app.

react-router不同組件之間傳遞路由

react router 不同組件 圖解: 代碼: // less require (‘./static/less/index.less‘) // 核心 var React = require(‘react‘) var ReactDom = require(‘react-dom‘) var Rea