【问题标题】:Accessing props from component when using react-router-dom and redux使用 react-router-dom 和 redux 时从组件访问 props
【发布时间】: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-reduxhttps://reacttraining.com/react-router/web/example/preventing-transitions 作为参考。

【问题讨论】:

  • 如果你想在组件中使用一个动作,那基本上就是connect 的用途。您已经在为App 执行此操作,如果您还希望使用该组件中的操作,则需要对Taco 组件执行相同操作。
  • @MarioF 看起来怎么样?我想访问的每个组件的 connect()(Taco) 等等?这似乎需要做很多额外的工作
  • 我的意思是您可以连接组件并从状态中获取所需的属性,或者连接父组件并将信息作为道具传递给子组件

标签: reactjs react-router react-redux


【解决方案1】:

一种方法是将您的组件(如Taco)连接到redux 存储单独(使用connect),然后使用mapStateToPropsmapDispatchToProps 仅公开相关的状态和相关的函数(比如调用dispatch(someNewAction()) 到组件的函数。

因此,您将拥有一个 &lt;TacoContainer /&gt; 组件(连接到 redux 存储),而 那个 将是您在路由中指定的组件。

这样组件本身就知道它应该如何与商店交互。然后将组件作为一个独立的东西使用变得更容易,因为它已经知道所有(或大部分)棘手的细节,所以每次使用它时都不需要传递大量的 props 和 dispatch 方法。 (如果需要,你仍然可以从外部传递额外的道具。)

【讨论】:

  • 看起来这是使用 react-router-dom 和 redux 时采用的方法
猜你喜欢
  • 1970-01-01
  • 2017-10-04
  • 2017-09-14
  • 2018-02-25
  • 2016-08-18
  • 2019-07-14
  • 2021-05-14
  • 2017-09-20
  • 2018-10-28
相关资源
最近更新 更多