Привет всем, я новичок в NextJS. Я создаю приложение погоды, используя внешние API. Я извлекаю данные из API и представляю их на интерфейсе.
Я извлекаю данные, используя getServerSideProps()
. Но я хочу, чтобы пользователь/клиент ввел city
в поле ввода, а затем щелкнул и, наконец, увидел сведения о погоде в соответствующем городе.
Для этого я определил состояние city
в компоненте, но теперь я хочу, чтобы этот город был доступен в getServerSideProps()
.
Как это сделать?
import Head from "next/head";
import {useState} from 'react';
import Today_highlight from "./components/Today_highlight";
import Weather_Today from "./components/Weather_Today";
import Weather_week from "./components/Weather_week";
export default function Home({ results, results1 }) {
//console.info("res1 = ",results1);
const [city, setCity] = useState('Bhopal');
const handleChangeEvent = (e) => {
setCity(e.target.value);
//console.info(city)
}
const handleSubmit = (e) => {
e.preventDefault();
window.location.reload();
}
return (
<>
<Head>
<title>Weather-Lytics</title>
<meta name = "description" content = "Generated by create next app" />
<link rel = "icon" href = "/favicon.ico" />
</Head>
<div className = "min-h-full bg-red-400 flex flex-col lg:flex-row">
<label htmlFor = "inputcity" className = "w-15">Enter City</label>
<input
type = "email"
className = "form-control w-56 h-8"
id = "inputcity"
value = {city}
placeholder = "Enter city"
onChange = {handleChangeEvent}
/>
<button className = "p-1 bg-slate-600 m-auto p-auto" onSubmit = {handleSubmit}> Click</button>
<div className = "bg-blue-300 w-full lg:w-1/4 lg:h-full">
<Weather_Today results = {results} />
</div>
<div className = "bg-green-500 w-full lg:h-full ">
<div className = "min-h-full flex flex-col">
<div className = "bg-yellow-400 w-full">
<Weather_week results1 = {results1} />
</div>
<div className = "bg-orange-600 w-full">
<Today_highlight results = {results} />
</div>
</div>
</div>
</div>
</>
);
}
export async function getServerSideProps({query}) {
//hereI want to access the city state
//query.term = city;
if (!query.term)
query.term = 'Bhopal'
//api-1
const url = `https://api.openweathermap.org/data/2.5/weather?q=${query.term}&appid=${process.env.NEXT_PUBLIC_API_KEY_1}`;
const res = await fetch(url);
const data = await res.json();
//console.info(data);
//api-2
const url1 = `http://api.openweathermap.org/data/2.5/forecast?q=${query.term}&appid=${process.env.NEXT_PUBLIC_API_KEY_1}`;
const res1 = await fetch(url1);
const data1 = await res1.json();
//console.info(data1);
return {
props: {
results: data,
results1: data1,
},
};
}
handleSubmit
является правильным способом получения данных?Хотя это не ответ на вопрос, который я задал, но эта альтернатива мне помогла
Вы не можете получить доступ к переменной состояния со стороны клиента внутри getServerSideProps
, потому что она работает на сервере. Вы должны передать данные через параметры запроса в getServerSideProps
.
Переменные состояния на стороне клиента недоступны из getServerSideProps
, поскольку они выполняются на сервере. Вы должны передать данные через параметры запроса, чтобы сделать их доступными на стороне сервера.
Чтобы передать city
в качестве параметра запроса, который будет выбран в getServerSideProps
, вы можете использовать router.push
внутри функции handleSubmit
.
const handleSubmit = (e) => {
e.preventDefault();
router.push(`/?term=${city}`);
}
Если вы хотите передать
city
в качестве параметра запроса, который будет выбран вgetServerSideProps
, вы можете сделатьrouter.push(`/?term=${city}`);
внутриhandleSubmit
вместоwindow.location.reload();
.