/
githubmirror
/
redux
Обзор
Документация
Войти
/
githubmirror
/
redux
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
examples/async/src/containers/App.js
100 строк
2 KB
Tim Dorr
Format the examples
20 мар 2024, 19:52
Не верифицирован
20 мар 2024, 19:52
3085048
Код
Авторство
О чём код?
import React, { Component } from 'react' import PropTypes from 'prop-types' import { connect } from 'react-redux' import { selectSubreddit, fetchPostsIfNeeded, invalidateSubreddit } from '../actions' import Picker from '../components/Picker' import Posts from '../components/Posts' class App extends Component { static propTypes = { selectedSubreddit: PropTypes.string.isRequired, posts: PropTypes.array.isRequired, isFetching: PropTypes.bool.isRequired, lastUpdated: PropTypes.number, dispatch: PropTypes.func.isRequired } componentDidMount() { const { dispatch, selectedSubreddit } = this.props dispatch(fetchPostsIfNeeded(selectedSubreddit)) } componentDidUpdate(prevProps) { if (prevProps.selectedSubreddit !== this.props.selectedSubreddit) { const { dispatch, selectedSubreddit } = this.props dispatch(fetchPostsIfNeeded(selectedSubreddit)) } } handleChange = nextSubreddit => { this.props.dispatch(selectSubreddit(nextSubreddit)) } handleRefreshClick = e => { e.preventDefault() const { dispatch, selectedSubreddit } = this.props dispatch(invalidateSubreddit(selectedSubreddit)) dispatch(fetchPostsIfNeeded(selectedSubreddit)) } render() { const { selectedSubreddit, posts, isFetching, lastUpdated } = this.props const isEmpty = posts.length === 0 return ( <div> <Picker value={selectedSubreddit} onChange={this.handleChange} options={['reactjs', 'frontend']} /> <p> {lastUpdated && ( <span> Last updated at {new Date(lastUpdated).toLocaleTimeString()}.{' '} </span> )} {!isFetching && ( <button onClick={this.handleRefreshClick}>Refresh</button> )} </p> {isEmpty ? ( isFetching ? ( <h2>Loading...</h2> ) : ( <h2>Empty.</h2> ) ) : ( <div style={{ opacity: isFetching ? 0.5 : 1 }}> <Posts posts={posts} /> </div> )} </div> ) } } const mapStateToProps = state => { const { selectedSubreddit, postsBySubreddit } = state const { isFetching, lastUpdated, items: posts } = postsBySubreddit[selectedSubreddit] || { isFetching: true, items: [] } return { selectedSubreddit, posts, isFetching, lastUpdated } } export default connect(mapStateToProps)(App)