В настоящее время я создаю простое приложение в React, и я все еще относительно новичок в нем, поэтому я чувствую, что мое решение является простым, и у меня просто пока нет опыта, чтобы увидеть его совсем.
По сути, приложение позволяет пользователю вводить имя любого города в мире, а вывод обновляет компонент часов реального времени React, который находится под входом. Для этого я использую библиотеку часовых поясов города, чтобы получить данные для нужного города пользователя, момент. js, чтобы проанализировать время города в желаемом часовом поясе и, конечно, часы реального времени React для отображения фактического времени на пользователь.
Внутри моей функции loadTime
я извлек свойство часового пояса и передал его в мой метод moment().tz()
для анализа. После того, как я передаю state
в свой setState()
и печатаю обновленное состояние на консоль, оно действительно отображает правильное состояние. Например, пользователь вводит Токио и возвращается ключ / значение timezone: "Asia/Tokyo"
.
Моя проблема в том, что после передачи this.state.timezone
в мой атрибут React Live Clock timezone
и нажатия кнопки «Получить время» мои часы фактически не обновляют состояние и вместо этого остаются текущим временем браузер пользователя.
Я установил, что моя функция loadTime()
работает так, как она должна, поэтому я уверен, что мой компонент Clock не подключен правильно для чтения обновленного состояния timezone
, Другая возможность, как указано в моем вопросе, заключается в том, что я неправильно использую setState()
.
Есть ли что-то, что я здесь пропускаю, или я на правильном пути с неправильным использованием setState()
?
import Moment from 'moment-timezone';
import cityTimezones from 'city-timezones';
import Clock from 'react-live-clock';
let moment = require('moment-timezone');
export default class Search extends Component {
state = {
userLocation: "",
localTime: "",
rows: [],
};
//Methods
loadTime = (searchTerm) => {
const city = cityTimezones.lookupViaCity(searchTerm);
let state = this.state;
if (city.length > 0) {
const timezone = city[0].timezone;
let now = moment().tz(timezone).format('h:mm:ss a');
state.localTime = now;
state.timezone = timezone;
} else {
state.userLocation = "";
state.localTime = "";
};
this.setState(state);
console.log(state);
};
handleChange = (e) => {
let state = this.state;
state[e.target.name] = e.target.value;
this.setState(state);
}
//Create
handleClick = (e) => {
e.preventDefault();
this.loadTime(this.state.userLocation);
};
render () {
let alert = (!this.state.localTime) ? "Please enter location": "";
return (
<div className="search-container-fluid gradient p-3">
<div className="row">
<div className="search-container">
<input onChange={this.handleChange} name="userLocation" type="text"
className="form-control" placeholder="Enter a location" />
<button onClick={this.handleClick} name="search-btn" className="btn btn-search"
type="button" >Get time.</button>
<div className="output-container mt-5">
<Clock ticking={true} format={'hh:mm:ss a'} timezone={this.state.timezone} />
{/* {alert} */}
</div>
</div>
</div>
</div>
)
}
};```