REDUX
Bạn cũng có thể sử dụng react-router-redux
cái nào có goBack()
và push()
.
Đây là một gói lấy mẫu cho điều đó:
Trong điểm vào của ứng dụng, bạn cần ConnectedRouter
và một kết nối đôi khi phức tạp để kết nối là history
đối tượng. Phần mềm trung gian Redux lắng nghe các thay đổi lịch sử:
import React from 'react'
import { render } from 'react-dom'
import { ApolloProvider } from 'react-apollo'
import { Provider } from 'react-redux'
import { ConnectedRouter } from 'react-router-redux'
import client from './components/apolloClient'
import store, { history } from './store'
import Routes from './Routes'
import './index.css'
render(
<ApolloProvider client={client}>
<Provider store={store}>
<ConnectedRouter history={history}>
<Routes />
</ConnectedRouter>
</Provider>
</ApolloProvider>,
document.getElementById('root'),
)
Tôi sẽ chỉ cho bạn một cách để kết nối history
. Lưu ý cách lịch sử được nhập vào cửa hàng và cũng được xuất dưới dạng một tệp đơn để nó có thể được sử dụng trong điểm nhập của ứng dụng:
import { createStore, applyMiddleware, compose } from 'redux'
import { routerMiddleware } from 'react-router-redux'
import thunk from 'redux-thunk'
import createHistory from 'history/createBrowserHistory'
import rootReducer from './reducers'
export const history = createHistory()
const initialState = {}
const enhancers = []
const middleware = [thunk, routerMiddleware(history)]
if (process.env.NODE_ENV === 'development') {
const { devToolsExtension } = window
if (typeof devToolsExtension === 'function') {
enhancers.push(devToolsExtension())
}
}
const composedEnhancers = compose(applyMiddleware(...middleware), ...enhancers)
const store = createStore(rootReducer, initialState, composedEnhancers)
export default store
Khối ví dụ trên cho thấy cách tải các trình react-router-redux
trợ giúp phần mềm trung gian hoàn tất quá trình thiết lập.
Tôi nghĩ rằng phần tiếp theo này là hoàn toàn bổ sung, nhưng tôi sẽ bao gồm nó chỉ trong trường hợp ai đó trong tương lai tìm thấy lợi ích:
import { combineReducers } from 'redux'
import { routerReducer as routing } from 'react-router-redux'
export default combineReducers({
routing, form,
})
Tôi sử dụng routerReducer
mọi lúc vì nó cho phép tôi buộc tải lại các Thành phần mà thường không do shouldComponentUpdate
. Ví dụ rõ ràng là khi bạn có một Thanh điều hướng được cho là cập nhật khi người dùng nhấn một NavLink
nút. Nếu bạn đi theo con đường đó, bạn sẽ biết rằng phương pháp kết nối của Redux sử dụng shouldComponentUpdate
. Với routerReducer
, bạn có thể sử dụng mapStateToProps
để ánh xạ các thay đổi định tuyến vào Thanh điều hướng và điều này sẽ kích hoạt nó cập nhật khi đối tượng lịch sử thay đổi.
Như thế này:
const mapStateToProps = ({ routing }) => ({ routing })
export default connect(mapStateToProps)(Nav)
Thứ lỗi cho tôi khi tôi thêm một số từ khóa bổ sung cho mọi người: nếu thành phần của bạn không cập nhật đúng cách, hãy điều tra shouldComponentUpdate
bằng cách xóa chức năng kết nối và xem liệu nó có khắc phục được sự cố không. Nếu vậy, hãy kéo vào routerReducer
và thành phần sẽ cập nhật đúng cách khi URL thay đổi.
Tóm lại, sau khi làm tất cả những điều đó, bạn có thể gọi điện goBack()
hoặc push()
bất cứ lúc nào bạn muốn!
Hãy thử ngay bây giờ trong một số thành phần ngẫu nhiên:
- Nhập vào
connect()
- Bạn thậm chí không cần
mapStateToProps
hoặcmapDispatchToProps
- Nhập trong goBack và đẩy từ
react-router-redux
- Gọi
this.props.dispatch(goBack())
- Gọi
this.props.dispatch(push('/sandwich'))
- Trải nghiệm cảm xúc tích cực
Nếu bạn cần thêm mẫu, hãy xem: https://www.npmjs.com/package/react-router-redux