gpt4 book ai didi

javascript - 如何将 redux 状态传递给子路由?

转载 作者:数据小太阳 更新时间:2023-10-29 03:55:39 26 4
gpt4 key购买 nike

我很难理解如何将 redux 与 react-router 一起使用。

索引.js

[...]

// Map Redux state to component props
function mapStateToProps(state) {
return {
cards: state.cards
};
}

// Connected Component:
let ReduxApp = connect(mapStateToProps)(App);

const routes = <Route component={ReduxApp}>
<Route path="/" component={Start}></Route>
<Route path="/show" component={Show}></Route>
</Route>;

ReactDOM.render(
<Provider store={store}>
<Router>{routes}</Router>
</Provider>,
document.getElementById('root')
);

App.js

import React, { Component } from 'react';

export default class App extends React.Component {
render() {
const { children } = this.props;
return (
<div>
Wrapper
{children}
</div>
);
}
}

显示.js

import React, { Component } from 'react';

export default class Show extends React.Component {
constructor(props) {
super(props);
}

render() {
return (
<ul>
{this.props.cards.map(card =>
<li>{card}</li>
)}
</ul>
);
}
}

这抛出

Uncaught TypeError: Cannot read property 'map' of undefined

我找到的唯一解决方案是使用它而不是 {children}:

{this.props.children &&
React.cloneElement(this.props.children, { ...this.props })}

这真的是正确的做法吗?

最佳答案

使用 react-redux

为了将任何状态或 Action 创建者注入(inject)到 React 组件的 props 中,您可以使用来自 react-reduxconnect这是 Redux 的官方 React 绑定(bind)。​​

值得查看connect 的文档here .

作为一个基于问题中指定内容的示例,您将执行如下操作:

import React, { Component } from 'react';
// import required function from react-redux
import { connect } from 'react-redux';

// do not export this class yet
class Show extends React.Component {
// no need to define constructor as it does nothing different from super class

render() {
return (
<ul>
{this.props.cards.map(card =>
<li>{card}</li>
)}
</ul>
);
}
}

// export connect-ed Show Component and inject state.cards into its props.
export default connect(state => ({ cards: state.cards }))(Show);

尽管您必须使用 react-redux 中的 Provider 包装您的根组件或路由器,但为了使其正常工作(这已经存在于您上面的示例中).但为了清楚起见:

import React from 'react';
import ReactDOM from 'react-dom';
import { Router, Route } from 'react-router';

import { createStore } from 'redux';
import { Provider } from 'react-redux';

import reducers from './some/path/to/reducers';

const store = createStore(reducers);

const routes = <Route component={ReduxApp}>
<Route path="/" component={Start}></Route>
<Route path="/show" component={Show}></Route>
</Route>;

ReactDOM.render(
// Either wrap your routing, or your root component with the Provider so that calls to connect have access to your application's state
<Provider store={store}>
<Router>{routes}</Router>
</Provider>,
document.getElementById('root')
);

如果任何组件不需要注入(inject)任何状态或 Action 创建者,那么您可以只导出一个“愚蠢”的 React 组件,并且您的应用程序的任何状态都不会在呈现时暴露给该组件。

关于javascript - 如何将 redux 状态传递给子路由?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33236002/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com