NextJS — Обновление URL-адреса по запросу на получение SSR выполнено

#reactjs #next.js #server-side-rendering

#реагирует на #next.js #рендеринг на стороне сервера

Вопрос:

Как я могу визуализировать динамический компонент маршрутизатора и не изменять URL-адрес?

У меня есть компонент searchInput, где я использую его в нескольких местах проекта

 const SearchInput = (props) =gt;{  const [value, setValue] = useState('');   const submit = () =gt;{  //How can I render the dynamic component and when the SSR fetch request is done update the URL   const router = useRouter();  return router.push(`/search/${value}`); //this way is chaning the URL :(  }  return (  lt;gt;  lt;input value={value} onChange={(e)=gt;setValue(e.target.value)} /gt;   lt;button onClick={}gt;Searchlt;/buttongt;  lt;/gt;  ) } export default SearchInput;  

Это вложенный динамический маршрутизатор SSR выглядит следующим образом

страницы/поиск/[Значение поиска].js

 export const search = async (searchValue) =gt; {  //this request retun a URL that needs to be shown in the browser  //How can I change the URL here?   const users = await axios.post(`/API/search`, {search: searchValue}).then(({data}) =gt; {  return data  })  return users } const SearchResult = ({downloads}) =gt;{   return (  lt;gt;  lt;SearchInput /gt;  lt;sectiongt;  {downloads.map((row)=gt;{  return lt;h1gt;{row.title}lt;/h1gt;  })}  lt;/sectiongt;    lt;/gt;  ) } export default SearchResult;  export const getServerSideProps = async (context) =gt; {  const { searchValue } = context.query;  const res = await search(searchValue);  return {  props: {  downloads: res,  url: res.link  }  } }  

Поскольку я использую рендеринг на стороне сервера, поэтому мне интересно, как я могу сначала получить запрос, а затем изменить URL-адрес?

Текущий подход работает, но сначала он изменяет URL-адрес, а затем отображает вложенный компонент. Чего я хочу добиться, так это сначала отобразить компонент SSR и получить запрос, а затем изменить URL-адрес. возможно ли это?

Ответ №1:

 const SearchInput = () =gt;{  const [value, setValue] = useState('');  const router = useRouter();   return (  lt;gt;  lt;input value={value} onChange={(e)=gt;setValue(e.target.value)} /gt;   lt;button onClick={()=gt; router.push(`/search/${value}`)}gt;Searchlt;/buttongt;  lt;/gt;  ) } export default SearchInput;  

выбор динамического маршрута :

 const SearchResult = ({searchData}) =gt;{   return (  lt;gt;  lt;SearchInput /gt;  lt;sectiongt;  {searchData.map((row)=gt;{  return lt;h1gt;{row.title}lt;/h1gt;  })}  lt;/sectiongt;    lt;/gt;  ) }   export const getServerSideProps = async (context) =gt; {  const { searchValue } = context.query;  const search = await axios.post(`/API/search`, {search: searchValue})  \ you can use fetch   const searchData = await search.json();  return {  props: {  searchData  }  } } export default SearchResult;