введение
После периода изучения React разработка React и Vue действительно сильно отличается, но обе они представляют собой интерфейсные фреймворки, основанные на представлениях, управляемых данными, поэтому начать работу не очень сложно.На этот раз я буду использовать React. +Redux для разработки небольшого проекта прогноза погоды. . Адрес источника:GitHub.com/B EI любит пыль…
стек технологий
внешний интерфейс
-
React:Интерфейсный фреймворк для создания интерфейсов
-
Redux:Централизованное управление состоянием React, удобная и быстрая связь между компонентами
-
**Redux-thunk:** часто используемое промежуточное ПО для асинхронных действий с избыточностью, используемое для обработки асинхронных операций, таких как запросы интерфейса.
-
styled-components:Пишите стили CSS с учетом компонентов
-
React-Redux: компонент считывает данные из Redux и отправляет действия в хранилище для обновления данных.
-
antd: библиотека пользовательского интерфейса на основе React.
-
immutable: постоянная структура данных, которая предотвращает неправильное назначение объектов состояния.
сбор информации
- axios: Реализовать запрос интерфейса данных (имитировать данные с помощью локального файла json).
Предварительный просмотр проекта
инициализация страницы
Выберите популярный город
Искать в других городах
реализовать функцию
Получить местный статус в режиме реального времени
При первом открытии страницы для отображения погоды в соответствии с городом, в котором мы находимся, нам нужно получить статус в реальном времени.Здесь я использую AutoNavi Map Web JS API. Во-первых, мы вводим тег сценария входа, который добавляет JS API на страницу в index.html в общей папке;
// key值需在官网上申请
<script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.15&key=申请的key值">
</script>
Мы используем официальный интерфейс для достижения позиционирования в реальном времени.Поскольку информация о погоде должна отображаться в первый раз, мы используем функцию жизненного цикла componentDidMount, чтобы сделать этот запрос:
componentDidMount()
{ // 防止作用域被修改
let _self = this;
if(_self.props.init){
//eslint-disable-next-line
AMap.plugin('AMap.CitySearch', function () {
//eslint-disable-next-line
var citySearch = new AMap.CitySearch()
citySearch.getLocalCity(function (status, result) {
if (status === 'complete' && result.info === 'OK') {
// 查询成功,result即为当前所在城市信息
_self.props.getCity(result.city)
_self.initWeather(_self.props.city)
_self.props.getInit()
}
})
})
}
else{
_self.initWeather(_self.props.city)
}
}
Здесь необходимо принять решение.Если выбор города изменен с других страниц, возврат на эту страницу приведет к повторной загрузке и изменению измененного города, поэтому мы используем идентификатор, чтобы определить, является ли это первой загрузкой.
Кроме того, отметим, что есть яма, React подскажет, что ее невозможно найтиAMapПримерный вопрос. используйте аннотации здесь
//eslint-disable-next-line
Написанный в предыдущей строке каждого вхождения класса AMap, его eslint игнорирует эту строку кода и не сообщает об ошибке
Получить информацию о погоде в городе
Подобно получению информации о местоположении, я все еще использую API, предоставляемый Gaode Map, здесь я прикрепляю официальный сайт,Не удается подключиться. Amapa.com/API/Java SCR…
визуализация данных диаграмм
Чтобы показать тенденцию изменения температуры, я использовал линейную диаграмму графиков для визуализации данных.
код реализации
initEchart(array)
{
let domChart = this.dom;
//eslint-disable-next-line
var myChart = echarts.init(domChart);
let option = null;
option = {
xAxis: {
show: false,
type: "category",
axisLine: {
lineStyle: {
color: "#fff"
}
},
grid:{bottom: "20"}
},
yAxis: {
show: false
},
series: [
{
data: array,
type: "line"
}
]
}
myChart.setOption(option, true);
}
Работа с Redux с помощью react-redux
react-redux — это официальное использование реакции для привязки Redux и размещения провайдера на верхнем уровне, чтобы хранилище могло быть получено следующими компонентами.
<Provider store={store}>
<Router>
<div>
<Route exact path='/' component={MainPage}></Route>
<Route exact path='/search' component={SearchCity}></Route>
</div>
</Router>
</Provider>
В компоненте мы используем connect() для получения состояния или действия отправки в магазине.Используя его характеристики, мы можем легко и удобно реализовать изменение и получение данных, таких как изменение города, исторический поиск и идентификатор решения.
Использование переходника промежуточного слоя
По умолчанию redux использует диспетчеризацию только для одного параметра объекта, функции и промисы запрещены, промежуточное ПО thunk может решить эту проблему, redux-thunk унифицирует вызывающие методы асинхронных и синхронных действий и помещает асинхронный процесс в уровень действия разрешен, и компонент не имеет никакого эффекта.Здесь я сотрудничаю с react-redux, чтобы реализовать операцию обновления данных redux.
Второстепенная страница поиска города
Я реализую функцию поиска города и запроса погоды в городе на вторичной странице, здесь я использую локальный файл json и реализую запрос с помощью axios,
axios.get('/city/citys.json').then((res) =>
{ var tem = []
tem = res.data.citys.filter((item) => item.citysName.includes(value))
if(tem = [])
{
unfound = 'Not Found'
}
callback(tem.slice(0, 10))
loading = false
})
Я использую метод фильтра для условной фильтрации, возвращая данные, содержащие входное значение, и возвращая подсказку, если она пуста. Я использую официальный компонент antd для окна поиска, который был упакован для нас.
<Select
showSearch
value={this.state.value}
placeholder='请输入城市名,快速查询天气信息'
defaultActiveFirstOption='flase'
showArrow='true'
filterOption={false}
onSearch={this.handleSearch}
onChange={this.handleChange}
onBlur={this.handleBlur}
notFoundContent={null}
style={{ width: '75%' }}
bordered='false'
loading={loading}
notFoundContent={unfound} >
{this.state.data.map(d =>
<Option key={d.id}>{d.citysName}</Option>);}
</Select>
Я использую метод handleSearch функции обратного вызова, когда значение текстового поля компонента изменяется, чтобы реализовать запрос интерфейса и отфильтровать содержимое, соответствующее условиям поиска для отображения. И используйте функцию обратного вызова handleChange выбранных параметров (панель отображения), чтобы изменить город штата в редуксе и одновременно перейти на домашнюю страницу, код:
handleSearch = value => {
if (value) {
loading = true
fetch(value, data => this.setState({ data }));
}
else {
this.setState({ data: [] });
}
};
handleBlur = () => unfound = null;
handleChange = value => {
this.state.data.map((item) => {
if (item.id == value) {
let city = item.citysName.split(',')[0]
this.props.changeCity(city)
this.props.history.push('/')
this.setState({ data: [] });
}
})
};
Эпилог
Хотя этот проект всего лишь простой и небольшой, он все же полезен для ваших собственных советов по развитию навыков. В процессе разработки я тоже столкнулся с некоторыми проблемами.Как говорится, процесс решения проблем - это процесс совершенствования собственных способностей. Я думаю это хорошо, каждый может поставить лайк, каждый лайк для меня большая поддержка 😀
Для получения более подробной информации о проекте вы можете посетить мойGithub, вы также можете оставить сообщение для обмена ~