スマートコンポーネント内からアクションをディスパッチしようとしています。 mapDispatchToProps
とthis.props.dispatch(actions.getApplications(1))
を使用しようとしましたが、どちらもアクションをprops
にバインドしていません。
私のmapStateToProps
が含まれていないためかどうかわかりませんか?含めようとしましたが、うまくいきませんでした。
任意の助けをいただければ幸いです、私は以下のコードブロックの長さについて謝罪します。
import classNames from 'classnames';
import SidebarMixin from 'global/jsx/sidebar_component';
import Header from 'common/header';
import Sidebar from 'common/sidebar';
import Footer from 'common/footer';
import AppCard from 'routes/components/appCard';
import { getApplications } from 'redux/actions/appActions';
import { connect } from 'react-redux'
import { bindActionCreators } from 'redux'
import actions from 'redux/actions';
import { VisibilityFilters } from 'redux/actions/actionTypes';
class ApplicationContainer extends React.Component {
constructor(props){
super(props)
this.state = {
applicants: []
}
this.onDbLoad = this.onDbLoad.bind(this)
}
onDbLoad(){
console.log(this.props.dispatch)
// this.props.getApplications(1)
}
render() {
return (
<Col sm={12} md={4} lg={4}>
<PanelContainer style={panelStyle}>
<Panel>
<PanelBody >
<Grid>
<Row>
{ this.onDbLoad() }
</Row>
</Grid>
</PanelBody>
</Panel>
</PanelContainer>
</Col>
)}
}
function mapDispatchToProps(dispatch){
return bindActionCreators({ getApplications: getApplications },dispatch)
}
export default connect(null, mapDispatchToProps)(ApplicationContainer);
@SidebarMixin
export default class extends React.Component {
render() {
const app = ['Some text', 'More Text', 'Even More Text'];
var classes = classNames({
'container-open': this.props.open
})
return (
<Container id='container' className={classes}>
<Sidebar />
<Header />
<Container id='body'>
<Grid>
<Row>
<ApplicationContainer />
</Row>
</Grid>
</Container>
<Footer />
</Container>
)}
}
Reduxによる here でのFAQ質問、this.props.dispatch
はdefaultで利用できますdoは、独自のmapDispatchToProps
関数を提供しません。 doがmapDispatchToProps
関数を提供する場合、あなたはdispatch
という名前のプロップを自分で返す責任があります:
const mapDispatchToProps = dispatch => ({
...other methods,
dispatch // ← Add this
})
export default connect(null, mapDispatchToProps)(Component)
または、Reduxの bindActionCreators
ユーティリティを使用して、アクション作成者が事前にバインドされていることを確認し、コンポーネントでthis.props.dispatch
を使用することを心配する必要がありません。
質問で述べたように、mapDispatchToProps
はconnect
の-second引数である必要があります。
実行する状態マッピングがない場合は、null
を最初の引数として渡すことができます。
export default connect(null, mapDispatchToProps)(ApplicationContainer);
これを行うと、this.props.getApplications
がバインドされます。
コメントによると、this.props.dispatch
INSTEADのバインディングアクションにアクセスする場合は、マッパーを渡さずにconnect()
を呼び出すだけで、デフォルトの動作によりdispatch
が挿入されます。
バインドされたアクションクリエーターとthis.props.dispatch
の両方を使用する場合は、dispatch
に渡すオブジェクトにもmapDispatchToProps
を追加する必要があります。 dispatch: action => action
のようなもの。または、すべてをルートキー(actions
など)の下に置くわけではないので、次のようにすることができます。
function mapDispatchToProps(dispatch) {
let actions = bindActionCreators({ getApplications });
return { ...actions, dispatch };
}