【发布时间】:2018-02-09 13:38:21
【问题描述】:
我制作了这个示例应用程序来学习如何一起使用 react-router-dom 和 redux,一切正常,除了,我看不到如何访问组件内的 props?
所有代码都在这里https://gist.github.com/kristiannissen/b9a9ef1904eb40af9c305e06af4cf0fc
入口文件 index.js
import { render } from 'react-dom'
import React from 'react'
import { Provider } from 'react-redux'
import { ConnectedRouter } from 'react-router-redux'
import App from './app'
import { store, history } from './store'
render(
<Provider store={ store }>
<App />
</Provider>, document.getElementById('app'))
App.js
import { bindActionCreators } from 'redux'
import { connect } from 'react-redux'
import Main from './main'
import * as projectActions from './actions/project'
const mapStateToProps = (state) => {
return {
project: state.project
}
}
const mapDispatchToProps = (dispatch) => {
return bindActionCreators({
...projectActions
}, dispatch)
}
const App = connect(mapStateToProps,
mapDispatchToProps)(Main)
export default App
main.js
import React from 'react'
import {
BrowserRouter as Router,
Route,
Link
} from 'react-router-dom'
import {
combineReducers,
createStore,
compose,
applyMiddleware
} from 'redux'
import {
ConnectedRouter,
routerReducer,
routerMiddleware
} from 'react-router-redux'
import {
history,
store
} from './store'
const Home = ({ match }) => (
<div>Home</div>
)
const Tacos = ({ match }) => (
<div>
Tacos to order:
<Link to={`${match.url}/plain`}>Plain</Link>
<Link to={`${match.url}/cheese`}>Cheese</Link>
<Link to={`${match.url}/chipotle`}>Chipotle</Link>
<div>
<Route path={`${match.url}/:kind`} component={ Taco } />
</div>
</div>
)
const Taco = ({ match }) => (
<div>You ordered {match.params.kind}</div>
)
const Main = (props) => (
<ConnectedRouter history={ history }>
<div>
<Link to="/">Home</Link>
|
<Link to="/tacos">Tacos</Link>
<div>
<Route path="/" component={ Home } {...props}/>
<Route path="/tacos" component={ Tacos } {...props}/>
</div>
</div>
</ConnectedRouter>
)
export default Main
store.js
import createHistory from 'history/createHashHistory'
import {
createStore,
compose,
applyMiddleware
} from 'redux'
import {
routerMiddleware
} from 'react-router-redux'
import rootReducer from './reducers/index'
import { project } from './data'
const initialState = {
project
}
export const history = createHistory()
export const store = createStore(rootReducer,
initialState, compose(
applyMiddleware(routerMiddleware(history))
))
我认为这些是设置中最重要的文件。我的问题是,如何从 Taco 组件内部访问我在操作中拥有的 props.newProject() 函数?使用 React 开发人员工具,我可以看到我的路由器可以访问 props.newProject() 但它不存在于 Taco 级别。
我应该使用 {...props} 将 props 传递给 Taco 组件还是有更聪明的方法?
我使用了https://github.com/ReactTraining/react-router/tree/master/packages/react-router-redux 和https://reacttraining.com/react-router/web/example/preventing-transitions 作为参考。
【问题讨论】:
-
如果你想在组件中使用一个动作,那基本上就是
connect的用途。您已经在为App执行此操作,如果您还希望使用该组件中的操作,则需要对Taco组件执行相同操作。 -
@MarioF 看起来怎么样?我想访问的每个组件的 connect()(Taco) 等等?这似乎需要做很多额外的工作
-
我的意思是您可以连接组件并从状态中获取所需的属性,或者连接父组件并将信息作为道具传递给子组件
标签: reactjs react-router react-redux