ฉันจะรับพารามิเตอร์ข้อความค้นหาจาก URL ใน Vue.js ได้อย่างไร


251

ฉันจะดึงพารามิเตอร์การสืบค้นใน Vue.js ได้อย่างไร

http://somesite.com?test=yayเช่น

ไม่สามารถหาวิธีดึงข้อมูลหรือฉันจำเป็นต้องใช้ JS บริสุทธิ์หรือห้องสมุดบางอย่างสำหรับเรื่องนี้?


5
ทำไมการลงคะแนนนี้ถึงลง? ฉันต้องการมันสำหรับ Vue.js หากมีไลบรารี vue หรือสิ่งที่สร้างขึ้นภายในจะเป็นที่ต้องการมากกว่า raw js
Rob

อาจมีบางสิ่งใน Vue Router ที่ทำเช่นนั้นหากคุณกำลังใช้สิ่งนั้น
Joe Clay

54
ไม่มีแม้แต่ใกล้เคียงกับสำเนา vue.jsเป็นเฟรมเวิร์กที่มีตรรกะเฉพาะแตกต่างจาก
vanila

13
วิธีนี้สามารถทำได้โดยไม่ต้อง vue-router
Connor Leech

คำตอบ:


345

ตามเอกสารเส้นทางของวัตถุคุณสามารถเข้าถึง$routeวัตถุจากส่วนประกอบของคุณซึ่งแสดงสิ่งที่คุณต้องการ ในกรณีนี้

//from your component
console.log(this.$route.query.test) // outputs 'yay'

8
ได้! หากเขาไม่ได้ใช้งานvue-routerเกินกว่านี้จะเป็นสิ่งที่ซ้ำซ้อนอย่างแน่นอนเนื่องจากเขาจะต้องใช้วิธีการ JS มาตรฐาน
Jeff

1
ฉันแค่สมมติว่าเพราะผู้ใช้คนเดียวกันโพสต์ก่อนหน้าคำถามเกี่ยวกับ vue-router ฉันจะสร้างแท็ก vue-router ถ้าฉันมีชื่อเสียงที่จะทำเช่นนั้น
Yerko Palma

2
จุดดี! ฉันไปข้างหน้าและสร้างvue-routerแท็กและเพิ่ม
Jeff

ปัญหาคือเอกสารคู่มือ vue พิจารณาว่าการเชื่อมต่อคอมโพเนนต์กับเราเตอร์ไม่เป็นที่พึงปรารถนา พวกเขาแนะนำให้ส่งอุปกรณ์ประกอบฉาก แต่ดูเหมือนว่าจะเป็นไปไม่ได้ที่จะส่งต่อแบบสอบถามแบบไดนามิกเป็นอุปกรณ์ประกอบฉาก ตัวอย่างเช่นในยามก่อนแต่ละคนที่ทำสิ่งที่ชอบ return next({ name: 'login', query:{param1: "foo" }, });ไม่ได้ผล ภายในองค์ประกอบการเข้าสู่ระบบเสาparam1ไม่ได้กำหนด
hraynaud

45

หากไม่มี vue-route ให้แบ่ง URL

var vm = new Vue({
  ....
  created()
  {
    let uri = window.location.href.split('?');
    if (uri.length == 2)
    {
      let vars = uri[1].split('&');
      let getVars = {};
      let tmp = '';
      vars.forEach(function(v){
        tmp = v.split('=');
        if(tmp.length == 2)
        getVars[tmp[0]] = tmp[1];
      });
      console.log(getVars);
      // do 
    }
  },
  updated(){
  },

โซลูชันอื่นhttps://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/search :

var vm = new Vue({
  ....
  created()
  {
    let uri = window.location.search.substring(1); 
    let params = new URLSearchParams(uri);
    console.log(params.get("var_name"));
  },
  updated(){
  },

2
ทำไมคุณถึงแยกlocation.hrefตัวเองเมื่อมีlocation.searchให้พร้อม? developer.mozilla.org/en-US/docs/Web/API/…เช่นการvar querypairs = window.location.search.substr(1).split('&');แยกคู่ชื่อ - ค่าแบบสอบถามด้วย '=' จะไม่ทำงานเสมอไปเนื่องจากคุณสามารถส่งพารามิเตอร์แบบสอบถามที่กำหนดชื่อได้โดยไม่มีค่าเช่นกัน เช่น?par1=15&par2ตอนนี้โค้ดของคุณจะเพิ่มข้อยกเว้นใน par2 เนื่องจากการแยกโดย '=' จะส่งผลให้ tmp มีเพียง 1 องค์ประกอบ
Arthur

1
ขออภัยจะไม่ส่งข้อยกเว้น แต่คุณจะไม่รับ par2 เช่นกัน ในฐานะที่เป็นคุณโดยทั่วไปกำหนดที่จะundefined getVars['par2']
อาเธอร์

วิธีการ GET เป็นสตริง (คู่ชื่อ / ค่า) ใน URL
erajuan

@ ที่ถูกต้องฉันเพิ่มการตรวจสอบความถูกต้องและเพิ่มโซลูชันอื่น ขอบคุณ
erajuan

37

คำตอบโดยละเอียดเพิ่มเติมเพื่อช่วยมือใหม่ของ VueJS:

  • ก่อนกำหนดวัตถุเราเตอร์ของคุณเลือกโหมดที่คุณดูเหมือนว่าเหมาะสม คุณสามารถประกาศเส้นทางของคุณภายในรายการเส้นทาง
  • ถัดไปคุณต้องการให้แอปหลักของคุณรู้ว่ามีเราเตอร์อยู่แล้วดังนั้นให้ประกาศไว้ในการประกาศแอปหลัก
  • สุดท้ายพวกเขา $ instance instance เก็บข้อมูลทั้งหมดเกี่ยวกับเส้นทางปัจจุบัน รหัสจะบันทึกคอนโซลเพียงพารามิเตอร์ที่ส่งผ่านใน URL (* เมาท์จะคล้ายกับ document.ready, .i มันถูกเรียกทันทีที่แอพพร้อม)

และรหัสเอง:

<script src="https://unpkg.com/vue-router"></script>
var router = new VueRouter({
    mode: 'history',
    routes: []
});
var vm =  new Vue({
    router,
    el: '#app',
    mounted: function() {
        q = this.$route.query.q
        console.log(q)
    },
});

7
กรุณาอธิบายมัน
Muhammad Muazzam

ก่อนกำหนดวัตถุเราเตอร์ของคุณเลือกโหมดที่คุณดูเหมือนว่าเหมาะสมคุณสามารถประกาศเส้นทางของคุณภายในรายการเส้นทาง ถัดไปคุณต้องการให้แอปหลักของคุณรู้ว่ามีเราเตอร์อยู่แล้วดังนั้นให้ประกาศภายในแอปประกาศหลัก สุดท้ายพวกเขา $ instance instance เก็บข้อมูลทั้งหมดเกี่ยวกับเส้นทางปัจจุบัน รหัสของฉันจะบันทึกคอนโซลเพียงพารามิเตอร์ที่ส่งผ่านใน URL (* เมาท์จะคล้ายกับ document.ready, .i มันถูกเรียกทันทีที่แอพพร้อม)
Sabyasachi

3
สำหรับมือใหม่ที่ดูไร้เดียงสามากขึ้น: VueRouter ไม่ได้รวมอยู่ใน VueJS core ดังนั้นคุณอาจต้องการรวม VueRouter แยกต่างหาก:<script src="https://unpkg.com/vue-router"></script>
rustyx

2
@Sabyasachi แก้ไขคำตอบของคุณและเพิ่มข้อมูลนั้นภายในโพสต์เอง
Simon Forsberg

1
new Vue({ router, ... })ไม่ใช่ไวยากรณ์ที่ถูกต้อง
Crescent Fresh

17

อีกวิธีหนึ่ง (สมมติว่าคุณกำลังใช้vue-router) คือการแมปแบบสอบถามพารามิเตอร์กับเสาในเราเตอร์ของคุณ จากนั้นคุณสามารถรักษามันเหมือนเสาอื่น ๆ ในรหัสส่วนประกอบของคุณ ตัวอย่างเช่นเพิ่มเส้นทางนี้

{ 
    path: '/mypage', 
    name: 'mypage', 
    component: MyPage, 
    props: (route) => ({ foo: route.query.foo })  
}

จากนั้นในองค์ประกอบของคุณคุณสามารถเพิ่มเสาได้ตามปกติ

props: {
    foo: {
        type: String,
        default: null
    }
},

จากนั้นจะพร้อมใช้งานthis.fooและคุณสามารถทำทุกอย่างที่ต้องการได้ (เช่นตั้งตัวเฝ้าดูเป็นต้น)


มันเยี่ยมมาก ชิ้นส่วนที่หายไปของตัวต่อคือการเริ่มต้น คุณสามารถทำสิ่งนี้ได้: `นี่. $ router.push ({ชื่อ: 'mypage', แบบสอบถาม: {foo: 'bar'}) '
slf

7

ณ วันที่นี้วิธีที่ถูกต้องตามเอกสารการกำหนดเส้นทางแบบไดนามิกคือ:

this.$route.params.yourProperty

แทน

this.$route.query.yourProperty

3
พวกเขาไม่เหมือนกัน! คุณควรใช้queryเพื่อรับแบบสอบถามจาก URL จากเอกสาร: นอกเหนือไปจาก $ route.params วัตถุ $ route ยังแสดงข้อมูลที่เป็นประโยชน์อื่น ๆ เช่น $ route.query (หากมีข้อความค้นหาใน URL)
39432

ขอขอบคุณสำหรับการชี้แจง :)
Marco

2

คุณสามารถใช้ vue-router ฉันมีตัวอย่างด้านล่าง:

url: www.example.com?name=john&lastName=doe

new Vue({
  el: "#app",
  data: {
    name: '',
    lastName: ''
  },
  beforeRouteEnter(to, from, next) {
      if(Object.keys(to.query).length !== 0) { //if the url has query (?query)
        next(vm => {
         vm.name = to.query.name
         vm.lastName = to.query.lastName
       })
    }
    next()
  }
})

หมายเหตุ:ในbeforeRouteEnterฟังก์ชั่นเราไม่สามารถเข้าถึงคุณสมบัติของส่วนประกอบเช่น: this.propertyNameนั่นคือเหตุผลที่ฉันได้ส่งผ่านvmไปยังnextฟังก์ชั่นมันเป็นวิธีที่แนะนำในการเข้าถึงอินสแตนซ์ vue จริงๆvmแล้วมันหมายถึงอินสแตนซ์ vue


2

หาก URL ของคุณมีลักษณะดังนี้:

somesite.com/something/123

โดยที่ '123' เป็นพารามิเตอร์ชื่อ 'id' (url like / something /: id) ลองด้วย:

this.$route.params.id


-6

หากเซิร์ฟเวอร์ของคุณใช้ php คุณสามารถทำได้:

const from = '<?php echo $_GET["from"];?>';

เพิ่งได้ผล


2
คำถามคือทำอย่างไรกับ Vue ไม่ใช่กับ PHP
robertmain
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.