I built a react-redux app that fetches a list of Reviews from a Rails API - I really want to add the ability to sort that list of reviews in alphabetically ascending/descending order, but I'm not sure where to start.
Do I need to add how I want to sort this list to the state and then add a new action in order to do this? Or is there a simpler way to just add this to the component that shows the list of Reviews?
I'd love exact code examples if possible because I'm really stumped on how to start this and where I can accomplish this.
./components/reviews/ReviewsList.js
import React from 'react'
import { connect } from 'react-redux'
import { Link } from 'react-router-dom'
const ReviewList = props => {
const reviewCards = props.reviews.length > 0 ?
props.reviews.map(r => (
<div>
<br></br>
<p key={r.id}><Link className="App-link" to={`/app/v1/reviews/${r.id}`}>{r.attributes.title}</Link>
</p>
</div>)) :
null
return reviewCards
}
const mapStateToProps = state => {
return {
reviews: state.reviews.reviews
}
}
export default connect(mapStateToProps)(ReviewList)
App.js
import React from 'react';
import './App.css';
import ReviewsContainer from './containers/ReviewsContainer';
import ReviewList from './components/reviews/ReviewList'
import NewReviewForm from './components/reviews/NewReviewForm'
import Review from './components/reviews/Review'
import Header from './components/Header'
import Home from './components/Home'
import Footer from './components/Footer'
import { Switch, Route, withRouter } from 'react-router-dom'
import { connect } from 'react-redux';
class App extends React.Component {
render(){
const { reviews } = this.props
return (
<div className="App">
<Header />
<ReviewsContainer />
<Switch>
{/* Route renders appropriate components with the link path */}
<Route exact path='/' component={Home}></Route>
<Route exact path='/app/v1/reviews' component={ReviewList}></Route>
<Route exact path='/app/v1/reviews/new' component={NewReviewForm}/>
<Route exact path='/app/v1/reviews/:id' render={props => {
const review = reviews.find(review => review.id === props.match.params.id )
return <Review review={review} {...props}/>
}
// above renders the specific Review URL to the appropriate selection -
}/>
</Switch>
<br></br>
<Footer />
</div>
);
}
}
const mapStateToProps = state => {
return ({
reviews: state.reviews.reviews
})
}
export default withRouter(connect(mapStateToProps)(App))
store.js
import { createStore, applyMiddleware, compose, combineReducers } from 'redux'
import reviews from './reducers/reviewReducer'
import newReviewForm from './reducers/newReviewForm'
import thunk from 'redux-thunk'
const reducers = combineReducers({
reviews,
newReviewForm
})
const composeEnhancer = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
const store = createStore(reducers, composeEnhancer(applyMiddleware(thunk)))
export default store
Let me know if you'd like to see other code as well.