วิธีรับพารามิเตอร์การสืบค้นใน react-router v4.0


91

ฉันใช้ react-router-dom 4.0.0-beta.6 ในโครงการของฉัน ฉันมีรหัสดังต่อไปนี้:

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

และฉันต้องการรับพารามิเตอร์แบบสอบถามในHomePageองค์ประกอบ ฉันพบlocation.searchพารามิเตอร์ที่มีลักษณะเช่นนี้?key=valueดังนั้นจึงไม่มีการแยกวิเคราะห์

วิธีที่ถูกต้องในการรับพารามิเตอร์แบบสอบถามด้วย react-router v4 คืออะไร?

คำตอบ:


184

ความสามารถในการแยกวิเคราะห์สตริงการสืบค้นถูกนำออกจาก V4 เนื่องจากมีการร้องขอในช่วงหลายปีที่ผ่านมาเพื่อสนับสนุนการใช้งานที่แตกต่างกัน ด้วยเหตุนี้ทีมงานจึงตัดสินใจว่าจะเป็นการดีที่สุดสำหรับผู้ใช้ในการตัดสินใจว่าการใช้งานนั้นมีลักษณะอย่างไร เราขอแนะนำให้นำเข้า lib สตริงการสืบค้น นี่คือสิ่งที่ฉันใช้

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

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

คุณยังสามารถใช้new URLSearchParamsถ้าคุณต้องการบางสิ่งบางอย่างที่เป็นของพื้นเมืองและเหมาะกับความต้องการของคุณ

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

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับการตัดสินใจได้ที่นี่


12
อย่าใช้ URLSearchParams โดยไม่มี polyfill ตั้งแต่เดือนมีนาคม 2018 Googlebot ใช้ Chrome 41 ( developers.google.com/search/docs/guides/rendering ) ซึ่งไม่รองรับ URLSearchParams และแอปของคุณจะพังหากใช้ในเส้นทางที่สำคัญ ( caniuse.com/#feat=urlsearchparams )
Joshua Robinson

15

คำตอบที่ได้รับนั้นมั่นคง

หากคุณต้องการใช้โมดูลqsแทนสตริงการสืบค้น (ซึ่งมีความนิยมเท่ากัน) นี่คือไวยากรณ์:

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

ignoreQueryPrefixตัวเลือกที่จะไม่สนใจเครื่องหมายคำถามชั้นนำ


1
ดี. ในเดือนมกราคม 2019 qs มีการดาวน์โหลด 12 ล้านครั้งต่อสัปดาห์เทียบกับ 2.7 ล้านครั้งสำหรับสตริงข้อความค้นหา
oyalhi

8

อีกวิธีหนึ่งที่มีประโยชน์คือการใช้นอกกรอบURLSearchParamsเช่นนี้

  let { search } = useLocation();

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

สะอาดอ่านได้และไม่ต้องใช้โมดูล ข้อมูลเพิ่มเติมด้านล่าง;


6

คำตอบที่ยอมรับใช้งานได้ดี แต่ถ้าคุณไม่ต้องการติดตั้งแพ็คเกจเพิ่มเติมคุณสามารถใช้สิ่งนี้:

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, ' '));
  };

ให้ http://www.google.co.in/?key=value

getUrlParameter('key');

จะกลับมา value


ขอบคุณเพื่อนมาก .. ไลบรารี "สตริงการสืบค้น" ใช้งานไม่ได้สำหรับฉันด้วยเหตุผลบางประการ แต่โซลูชันของคุณใช้งานได้ดี ฉันใช้ "react-dom": "^ 16.0.0", "react-router": "^ 4.2.0", "react-router-dom": "^ 4.2.2" และ "query-string": "^ 5.0.1",
Rohan_Paul

สิ่งนี้จะถือว่าคุณมีพารามิเตอร์เดียวในสตริงการสืบค้นของคุณ OP ขอวิธีรับพารามิเตอร์แบบสอบถามอย่างชัดเจน - และนั่นคือสิ่งที่โมดูล npm กล่าวถึง เปิดนี้เป็นฟังก์ชั่นที่ให้ผลตอบแทนวัตถุของคู่ค่า / คีย์จากสตริงการสืบค้นและที่จะจริงๆมีประโยชน์!
Andy Lorenz

@AndyLorenz สิ่งนี้ยังใช้งานได้เมื่อคุณมีพารามิเตอร์การสืบค้นหลายรายการเรียกใช้ฟังก์ชันที่กำหนดด้วยคีย์ที่คุณต้องการรับค่า วิธีใช่ยังสามารถเปลี่ยนเพื่อให้แผนที่ของค่าคีย์
kartikag01

นั่นจะใช้งานได้ แต่ไม่ใช่ทางออกที่ดี @Kartik_Agarwal (a) จำเป็นต้องมีการดำเนินการหลายครั้งของรหัสเดียวกัน (อาจมีราคาแพง) เป็นหลัก (b) ต้องใช้ตัวแปรแยกกันสำหรับแต่ละพารามิเตอร์ในขณะที่คุณควรเติมออบเจ็กต์ของคู่คีย์ / ค่า (c) ต้องใช้ คุณต้องทราบชื่อพารามิเตอร์ของคุณและตรวจสอบเพิ่มเติมเพื่อดูว่ามีอยู่จริงหรือไม่ ถ้านี่คือรหัสของฉันฉันจะมองหา regex ที่สามารถรับพารามิเตอร์ทั้งหมดซ้ำ ๆ ได้ แต่ฉันต้องยอมรับว่า regexs ทำให้หูของฉันเลือดออก!
Andy Lorenz

5

ฉันกำลังค้นคว้าเกี่ยวกับ params สำหรับ react router v4 และพวกเขาไม่ได้ใช้กับ v4 ไม่เหมือนกับ react router v2 / 3 ฉันจะออกจากฟังก์ชั่นอื่น - อาจมีคนคิดว่ามันเป็นประโยชน์ คุณต้องใช้ es6 หรือจาวาสคริปต์ธรรมดาเท่านั้น

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;
}

นอกจากนี้ฟังก์ชันนี้ยังสามารถปรับปรุงได้


2

เอ๊ะ?

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

ฉันเพิ่งทำสิ่งนี้ดังนั้นไม่จำเป็นต้องเปลี่ยนโครงสร้างโค้ดทั้งหมด (โดยที่คุณใช้แบบสอบถามจากที่เก็บเราเตอร์ redux) หากคุณอัปเดตเพื่อตอบสนองเราเตอร์ v4 หรือสูงกว่าจากเวอร์ชันที่ต่ำกว่า

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


1
ยินดีต้อนรับลิงก์ไปยังโซลูชัน แต่โปรดตรวจสอบให้แน่ใจว่าคำตอบของคุณมีประโยชน์หากไม่มีมัน: เพิ่มบริบทรอบ ๆ ลิงก์เพื่อให้ผู้ใช้เพื่อนของคุณมีความคิดว่ามันคืออะไรและทำไมจึงอยู่ที่นั่นจากนั้นอ้างถึงส่วนที่เกี่ยวข้องที่สุดของเพจ การเชื่อมโยงอีกครั้งในกรณีที่หน้าเป้าหมายไม่พร้อมใช้งาน คำตอบที่มีน้อยกว่าการเชื่อมโยงอาจถูกลบออก
mrun

-1

ง่ายมาก

เพียงแค่ใช้ตะขอ useParams()

ตัวอย่าง:

เราเตอร์ :

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

ในส่วนประกอบของคุณ t:

export default function UserComponent() {

  const { id } = useParams();

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

สิ่งนี้ใช้ไม่ได้กับกรณีการใช้งานที่อธิบายไว้ในคำถาม (อย่างน้อยก็ไม่ใช่กับ React-Router v4: reactrouter.com/web/api/Hooks/useparams ) useParams จะแสดงเฉพาะพารามิเตอร์พา ธ เท่านั้นไม่ใช่พารามิเตอร์การค้นหา
Bennit

-4

โดยไม่ต้องใช้แพ็คเกจใด ๆ :

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

จากนั้นคุณสามารถเข้าถึงพารามิเตอร์ที่เกี่ยวข้องด้วย params.id


3
this.props.match.paramsมีพารามิเตอร์พา ธ คำถามนี้เกี่ยวกับพารามิเตอร์แบบสอบถาม
Hubert
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.