序言
前面中常用的每日任务之一是获得url里的主要参数。可是好像很多人不知道,现在也有一个 API 用以解决立即嵌入到电脑浏览器里的查询参数,它称之为URLSearchParams
。在这篇文章中,我们将要快速体验一下 API,看一下应用查询参数有多么非常容易。
应用URLSearchParams
URLSearchParams
期待获得一串查询参数(有或者没有原始的?
)。假如你有一个完整的 URL,你想要从这当中分析查询参数,你能应用location.search
来获取他们:
// URL: juejin.com/filter?size=M&colour=red&sleeves=short
location.search //=> ?size=M&colour=red&sleeves=short
const url = new URL("https://juejin.com/filter?filter?size=M&colour=red&sleeves=short")
url.search //=> ?size=M&colour=red&sleeves=short
我们目前能将location.search
传达给URLSearchParams
对象:
const params = new URLSearchParams(location.search)
查询参数
我们可以用has
查询存不存在特定查询参数:
params.has('size') // => true
params.has('button-style') // => false
假如可以从查询参数中读选值,可以用get
。假如不存有查询参数,你将回到null
。
params.get('size') // => 'M'
params.get('button-style') // => null
与其说应用has
查验,然后用get
获得值,比不上应用get
查验值是不是并不是null
。
get
vsgetAll
get
有一个问题你应注意。查询参数可能会有好几个值:
// URL: juejin.com/filter?size=M&size=L
这是一个彻底高效的 URL。当我们将要它传达给URLSearchParams
时,他会了解size
有好几个值
get
将只回到查询参数的第一个值。如果你想这所有的一切,你需要用到getAll
它一直回到一个二维数组:
// URL: juejin.com/filter?size=M&size=L
const params = new URLSearchParams(location.search)
params.get('size') //=> 'M'
params.getAll('size') //=> ['M', 'L']
迭代更新主要参数
大家可以通过几类各种方式赋值全部主要参数。第一个如果采用for of
。再度防备主要参数会取好几个值,他们会有2次!
// URL: juejin.com/filter?size=M&size=L&colour=red
const params = new URLSearchParams(location.search)
for (let p of params) {
console.log(p)
}
// => ['size', 'M']
// => ['size', 'L']
// => ['colour', 'red']
您也可以应用.keys()
获取参数中的所有键的迭代器,或使用.values()
获得所有值:
// URL: juejin.com/filter?size=M&size=L&colour=red
const params = new URLSearchParams(location.search)
console.log([...params.keys()]) // => ['size', 'size', 'colour']
console.log([...params.values()]) // => ['M', 'L', 'red']
console.log([...params.entries()]) // => [['size', 'M'], ['size', 'L'], ['colour', 'red']]
改动主要参数
最先需要注意的是,这所有的一切方式都是会更改已有的URLSearchParams
目标,而非回到一个新目标。
您可以使用.delete()
删掉查询参数。
假如生活中有好几个,这将会删掉它所有值:
// URL: juejin.com/filter?size=M&size=L&colour=red
const params = new URLSearchParams(location.search)
params.delete('size')
console.log([...params.keys()]) // => ['colour']
我们可以用.append()
加上一个新的键/值对。若该值已经出现,append
将额外新值:
// URL: juejin.com/filter?size=M&colour=red
const params = new URLSearchParams(location.search)
params.append('size', 'L')
console.log([...params.keys()]) // => ['size', 'size', 'colour']
console.log([...params.values()]) // => ['M', 'L', 'red']
console.log([...params.entries()]) // => [['size', 'M'], ['size', 'L'], ['colour', 'red']]
如果你想要为基本参数一个新值并删除全部别的目前值,你能应用.set
来做到这一点:
// URL: juejin.com/filter?size=M&colour=red
const params = new URLSearchParams(location.search)
params.set('size', 'L')
console.log([...params.keys()]) // => ['size', 'colour']
console.log([...params.values()]) // => ['L', 'red']
console.log([...params.entries()]) // => [['size', 'L'], ['colour', 'red']]
取回来 URL
进行这所有的一切查询参数的载入和系统重装后,你可能期待将其作为 URL 拉到,便于你可以在电脑浏览器中升级 URL。因此,仅需启用.toString()
:
// URL:juejin.com/filter?size=M&colour=red
const params = new URLSearchParams(location.search)
params.set('size', 'L')
params.delete('colour')
console.log(params.toString()) // => 'size=L'
一定要注意,
toString
不能在开始加上?
,因而必须确保在需要的时候还记得加上它。
结果
URLSearchParams
是一个非常棒的 API,您可以使用它去清晰地升级您 URL 的查询参数,而不用担心一切额外库来分析查询参数,或是最后把它们变换回字符串数组。我建议您下一次必须进行一些查询参数分析或升级时进行它!