如何将搜索查询从搜索页面追加到 url?
How to append search query to url from search page in react?
我的 header 搜索栏通过在按下按钮时导航到“search?q=”,从搜索页面的 URL 读取参数并处理它们来工作,但是当我从搜索中搜索时URL 页面采用这种形式“search/search?q=”。在这种情况下如何跳过额外的“搜索”?
我试过这个解决方案,但没有用
import React, { useState } from 'react'
import { useLocation, useNavigate } from 'react-router-dom'
import './style.css'
function SearchBar() {
const navigate = useNavigate();
const location = useLocation();
const [input, setInput] = useState('hi');
const search = () =>{
const path = location.pathname
if(path.includes('search'))
navigate('?q='+input)
else
navigate('search?q=' + input)
}
return (
<form class="form-inline">
<input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search" onChange={e=>{setInput(e.target.value)}}/>
<button class="btn btn-outline-success my-2 my-sm-0" type="submit" onClick={search}>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-search" viewBox="0 0 16 16">
<path d="M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z" />
</svg>
</button>
</form>
)
}
export default SearchBar
像这样更改您的代码。我在表单标签上添加了 onSubmit。并在 search()
.
中做了一点改动
此外,我添加了一个 useEffect 以从 url 获取参数。
import React, { useEffect, useState } from "react";
import { useLocation, useNavigate, useParams } from "react-router-dom";
import './style.css'
function SearchBar() {
const navigate = useNavigate();
const location = useLocation();
const params = useParams();
const [input, setInput] = useState("hi");
const search = (e) => {
e.preventDefault();
const path = location.pathname;
if (path === "/search") {
navigate("?q=" + input);
} else {
navigate("search?q=" + input);
}
};
useEffect(() => {
const param = new URL(window.location.href).searchParams.get("q");
if (param) console.log(param);
}, [params]);
return (
<form className="form-inline" onSubmit={search}>
<input
className="form-control mr-sm-2"
type="search"
placeholder="Search"
aria-label="Search"
onChange={(e) => {
setInput(e.target.value);
}}
/>
<button className="btn btn-outline-success my-2 my-sm-0" type="submit">
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
className="bi bi-search"
viewBox="0 0 16 16"
>
<path d="M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z" />
</svg>
</button>
</form>
);
}
export default SearchBar;
我的 header 搜索栏通过在按下按钮时导航到“search?q=”,从搜索页面的 URL 读取参数并处理它们来工作,但是当我从搜索中搜索时URL 页面采用这种形式“search/search?q=”。在这种情况下如何跳过额外的“搜索”?
我试过这个解决方案,但没有用
import React, { useState } from 'react'
import { useLocation, useNavigate } from 'react-router-dom'
import './style.css'
function SearchBar() {
const navigate = useNavigate();
const location = useLocation();
const [input, setInput] = useState('hi');
const search = () =>{
const path = location.pathname
if(path.includes('search'))
navigate('?q='+input)
else
navigate('search?q=' + input)
}
return (
<form class="form-inline">
<input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search" onChange={e=>{setInput(e.target.value)}}/>
<button class="btn btn-outline-success my-2 my-sm-0" type="submit" onClick={search}>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-search" viewBox="0 0 16 16">
<path d="M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z" />
</svg>
</button>
</form>
)
}
export default SearchBar
像这样更改您的代码。我在表单标签上添加了 onSubmit。并在 search()
.
此外,我添加了一个 useEffect 以从 url 获取参数。
import React, { useEffect, useState } from "react";
import { useLocation, useNavigate, useParams } from "react-router-dom";
import './style.css'
function SearchBar() {
const navigate = useNavigate();
const location = useLocation();
const params = useParams();
const [input, setInput] = useState("hi");
const search = (e) => {
e.preventDefault();
const path = location.pathname;
if (path === "/search") {
navigate("?q=" + input);
} else {
navigate("search?q=" + input);
}
};
useEffect(() => {
const param = new URL(window.location.href).searchParams.get("q");
if (param) console.log(param);
}, [params]);
return (
<form className="form-inline" onSubmit={search}>
<input
className="form-control mr-sm-2"
type="search"
placeholder="Search"
aria-label="Search"
onChange={(e) => {
setInput(e.target.value);
}}
/>
<button className="btn btn-outline-success my-2 my-sm-0" type="submit">
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
className="bi bi-search"
viewBox="0 0 16 16"
>
<path d="M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z" />
</svg>
</button>
</form>
);
}
export default SearchBar;