Cách lấy tham số truy vấn trong react-router v4


87

Tôi đang sử dụng react-router-dom 4.0.0-beta.6 trong dự án của mình. Tôi có một mã như sau:

<Route exact path="/home" component={HomePage}/>

Và tôi muốn nhận các tham số truy vấn trong HomePagethành phần. Tôi đã tìm thấy location.searchtham số, trông giống như sau ?key=value:, vì vậy nó chưa được phân tích.

Cách phù hợp để nhận các tham số truy vấn với react-router v4 là gì?

Câu trả lời:


181

Khả năng phân tích cú pháp các chuỗi truy vấn đã bị loại bỏ khỏi V4 vì đã có nhiều yêu cầu trong nhiều năm để hỗ trợ triển khai khác nhau. Cùng với đó, nhóm quyết định tốt nhất là người dùng nên quyết định việc triển khai đó trông như thế nào. Chúng tôi khuyên bạn nên nhập một chuỗi truy vấn lib. Đây là cái mà tôi sử dụng

const queryString = require('query-string');

const parsed = queryString.parse(props.location.search);

Bạn cũng có thể sử dụng new URLSearchParamsnếu bạn muốn thứ gì đó có nguồn gốc và nó phù hợp với nhu cầu của bạn

const params = new URLSearchParams(props.location.search);
const foo = params.get('foo'); // bar

Bạn có thể đọc thêm về quyết định tại đây


12
Không sử dụng URLSearchParams mà không có polyfill. Kể từ tháng 3 năm 2018, Googlebot sử dụng Chrome 41 ( Develop.google.com/search/docs/guides/rendering ) không hỗ trợ URLSearchParams và ứng dụng của bạn sẽ bị hỏng nếu được sử dụng trong một đường dẫn quan trọng ( caniuse.com/#feat=urlsearchparams ).
Joshua Robinson

12

Câu trả lời được đưa ra là chắc chắn.

Nếu bạn muốn sử dụng mô-đun qs thay vì chuỗi truy vấn (chúng có mức độ phổ biến ngang nhau), đây là cú pháp:

const query = qs.parse(props.location.search, {
  ignoreQueryPrefix: true
})

Các ignoreQueryPrefix lựa chọn là để bỏ qua những dấu hỏi hàng đầu.


1
Đẹp. vào tháng 1 năm 2019, qs có 12 triệu lượt tải xuống hàng tuần so với 2,7 triệu đối với chuỗi truy vấn.
oyalhi

6

Câu trả lời được chấp nhận hoạt động tốt nhưng nếu bạn không muốn cài đặt thêm gói, bạn có thể sử dụng:

getUrlParameter = (name) => {
    name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
    let regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
    let results = regex.exec(window.location.search);
    return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
  };

Được http://www.google.co.in/?key=value

getUrlParameter('key');

sẽ trở lại value


Cảm ơn bạn rất nhiều .. thư viện "chuỗi truy vấn" không hoạt động với tôi vì một số lý do, nhưng giải pháp của bạn hoạt động như một sự quyến rũ. Tôi đang sử dụng "react-dom": "^ 16.0.0", "react-router": "^ 4.2.0", "react-router-dom": "^ 4.2.2" và "query-string": "^ 5.0.1",
Rohan_Paul

điều này chỉ giả sử bạn có một tham số duy nhất trong chuỗi truy vấn của mình. OP yêu cầu rõ ràng về cách lấy các tham số truy vấn - và đó là những gì các mô-đun npm được đề cập làm. Biến điều này thành một hàm trả về một đối tượng của các cặp khóa / giá trị từ chuỗi truy vấn và điều đó sẽ thực sự hữu ích!
Andy Lorenz

@AndyLorenz điều này thậm chí hoạt động khi bạn có nhiều tham số truy vấn, hãy gọi hàm đã cho với khóa có giá trị mà bạn muốn nhận. Phương thức Yes cũng có thể được chuyển đổi để đưa ra bản đồ các giá trị chính.
kartikag01

điều đó sẽ hoạt động nhưng không phải là một giải pháp tốt @Kartik_Agarwal. (a) Nó sẽ yêu cầu nhiều lần thực thi mã cơ bản giống nhau (có thể đắt tiền), (b) các biến riêng biệt sẽ cần được sử dụng cho mỗi tham số, trong khi lý tưởng là bạn nên điền vào một đối tượng của các cặp khóa / giá trị, (c) nó yêu cầu bạn biết tên tham số của mình và kiểm tra thêm để xem chúng có tồn tại hay không. Nếu đây là mã của tôi, tôi sẽ tìm kiếm một regex có thể chọn lặp đi lặp lại tất cả các tham số, nhưng tôi phải thừa nhận regex khiến tai tôi chảy máu!
Andy Lorenz

6

Một cách tiếp cận hữu ích khác có thể là sử dụng bên ngoài hộp URLSearchParamsnhư thế này;

  let { search } = useLocation();

   const query = new URLSearchParams(search);
   const paramField = query.get('field');
   const paramValue = query.get('value');

Sạch sẽ, dễ đọc và không yêu cầu mô-đun. Thông tin thêm bên dưới;


5

Tôi đang nghiên cứu về các thông số cho bộ định tuyến phản ứng v4 và họ không sử dụng nó cho bộ định tuyến v4, không giống như bộ định tuyến phản ứng v2 / 3. Tôi sẽ để lại một chức năng khác - có thể ai đó sẽ thấy nó hữu ích. Bạn chỉ cần es6 hoặc javascript đơn giản.

function parseQueryParams(query) {
  //You get a '?key=asdfghjkl1234567890&val=123&val2&val3=other'
  const queryArray = query.split('?')[1].split('&');
  let queryParams = {};
  for (let i = 0; i < queryArray.length; i++) {
    const [key, val] = queryArray[i].split('=');
    queryParams[key] = val ? val : true;
  }
  /* queryParams = 
     {
      key:"asdfghjkl1234567890",
      val:"123",
      val2:true,
      val3:"other"
     }
  */
  return queryParams;
}

Ngoài ra, chức năng này có thể được cải thiện


2

Hở?

queryfie(string){
    return string
        .slice(1)
        .split('&')
        .map(q => q.split('='))
        .reduce((a, c) => { a[c[0]] = c[1]; return a; }, {});
}

queryfie(this.props.location.search);

0

Tôi chỉ thực hiện điều này vì vậy không cần phải thay đổi toàn bộ cấu trúc mã (nơi bạn sử dụng truy vấn từ cửa hàng bộ định tuyến redux) nếu bạn cập nhật lên bộ định tuyến react v4 hoặc cao hơn từ phiên bản thấp hơn.

https://github.com/saltas888/react-router-query-middleware


1
Liên kết đến một giải pháp được hoan nghênh, nhưng hãy đảm bảo rằng câu trả lời của bạn hữu ích nếu không có nó: thêm ngữ cảnh xung quanh liên kết để những người dùng đồng nghiệp của bạn sẽ biết nó là gì và tại sao nó ở đó, sau đó trích dẫn phần có liên quan nhất của trang bạn ' đang liên kết lại trong trường hợp trang đích không có sẵn. Các câu trả lời ít hơn một liên kết có thể bị xóa .
mrun 23/03/18

0

Rất dễ

chỉ sử dụng móc useParams()

Thí dụ:

Bộ định tuyến :

<Route path="/user/:id" component={UserComponent} />

Trong các thành phần của bạn t:

export default function UserComponent() {

  const { id } = useParams();

  return (
    <>{id}</>
  );
}

Điều này không hoạt động đối với trường hợp sử dụng được mô tả trong câu hỏi (ít nhất là không với React-Router v4: reactrouter.com/web/api/Hooks/useparams ) useParams chỉ hiển thị các tham số đường dẫn, không hiển thị các tham số tìm kiếm.
Bennit

-4

Không cần bất kỳ gói nào:

const params = JSON.parse(JSON.stringify(this.props.match.params));

Sau đó, bạn có thể tiếp cận các thông số liên quan với params.id


3
this.props.match.paramschứa tham số đường dẫn, câu hỏi này là về tham số truy vấn.
Hubert
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.