Javascript 如何使用react redux配置mapDispatchToProps?
下面是我的容器代码:Javascript 如何使用react redux配置mapDispatchToProps?,javascript,reactjs,redux,react-redux,redux-thunk,Javascript,Reactjs,Redux,React Redux,Redux Thunk,下面是我的容器代码: import React, { Component } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import { fetchMovies } from './actions'; export class Container extends Component { componentDidMount() { t
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import { fetchMovies } from './actions';
export class Container extends Component {
componentDidMount() {
this.props.fetchMovies();
}
}
const mapStateToProps = state => {
return {
movies: state.movies,
};
};
function mapDispatchToProps(dispatch) {
return {
fetchMovies: bindActionCreators({fetchMovies}, dispatch),
};
}
export default connect(
mapStateToProps,
mapDispatchToProps
)(Container);
export const fetchMovies = () => dispatch => {
console.log('fetchMovies called');
// const movieResponse = fetchAPI(apiUrl);
// console.log('movieResponse => ', JSON.stringify(movieResponse));
dispatch({ type: actionTypes.FETCH_MOVIES, payload: [] });
};
import { createStore, applyMiddleware } from 'redux';
import { composeWithDevTools } from 'redux-devtools-extension';
import thunk from 'redux-thunk';
import rootReducer from '../rootReducer';
const middlewares = [thunk];
const store = createStore(
rootReducer,
composeWithDevTools(applyMiddleware(...middlewares))
);
export default store;
"prop-types": "^15.7.2",
"react": "^16.8.6",
"react-bootstrap": "^1.0.0-beta.11",
"react-dom": "^16.8.6",
"react-flexbox-grid": "^2.1.2",
"react-redux": "^7.1.0",
"react-router": "^5.0.1",
"react-router-dom": "^5.0.1",
"react-scripts": "3.0.1",
"redux": "^4.0.4",
"redux-actions": "^2.6.5",
"redux-promise-middleware": "^6.1.1",
"redux-thunk": "^2.3.0",
行动:
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import { fetchMovies } from './actions';
export class Container extends Component {
componentDidMount() {
this.props.fetchMovies();
}
}
const mapStateToProps = state => {
return {
movies: state.movies,
};
};
function mapDispatchToProps(dispatch) {
return {
fetchMovies: bindActionCreators({fetchMovies}, dispatch),
};
}
export default connect(
mapStateToProps,
mapDispatchToProps
)(Container);
export const fetchMovies = () => dispatch => {
console.log('fetchMovies called');
// const movieResponse = fetchAPI(apiUrl);
// console.log('movieResponse => ', JSON.stringify(movieResponse));
dispatch({ type: actionTypes.FETCH_MOVIES, payload: [] });
};
import { createStore, applyMiddleware } from 'redux';
import { composeWithDevTools } from 'redux-devtools-extension';
import thunk from 'redux-thunk';
import rootReducer from '../rootReducer';
const middlewares = [thunk];
const store = createStore(
rootReducer,
composeWithDevTools(applyMiddleware(...middlewares))
);
export default store;
"prop-types": "^15.7.2",
"react": "^16.8.6",
"react-bootstrap": "^1.0.0-beta.11",
"react-dom": "^16.8.6",
"react-flexbox-grid": "^2.1.2",
"react-redux": "^7.1.0",
"react-router": "^5.0.1",
"react-router-dom": "^5.0.1",
"react-scripts": "3.0.1",
"redux": "^4.0.4",
"redux-actions": "^2.6.5",
"redux-promise-middleware": "^6.1.1",
"redux-thunk": "^2.3.0",
商店:
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import { fetchMovies } from './actions';
export class Container extends Component {
componentDidMount() {
this.props.fetchMovies();
}
}
const mapStateToProps = state => {
return {
movies: state.movies,
};
};
function mapDispatchToProps(dispatch) {
return {
fetchMovies: bindActionCreators({fetchMovies}, dispatch),
};
}
export default connect(
mapStateToProps,
mapDispatchToProps
)(Container);
export const fetchMovies = () => dispatch => {
console.log('fetchMovies called');
// const movieResponse = fetchAPI(apiUrl);
// console.log('movieResponse => ', JSON.stringify(movieResponse));
dispatch({ type: actionTypes.FETCH_MOVIES, payload: [] });
};
import { createStore, applyMiddleware } from 'redux';
import { composeWithDevTools } from 'redux-devtools-extension';
import thunk from 'redux-thunk';
import rootReducer from '../rootReducer';
const middlewares = [thunk];
const store = createStore(
rootReducer,
composeWithDevTools(applyMiddleware(...middlewares))
);
export default store;
"prop-types": "^15.7.2",
"react": "^16.8.6",
"react-bootstrap": "^1.0.0-beta.11",
"react-dom": "^16.8.6",
"react-flexbox-grid": "^2.1.2",
"react-redux": "^7.1.0",
"react-router": "^5.0.1",
"react-router-dom": "^5.0.1",
"react-scripts": "3.0.1",
"redux": "^4.0.4",
"redux-actions": "^2.6.5",
"redux-promise-middleware": "^6.1.1",
"redux-thunk": "^2.3.0",
依赖项版本:
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import { fetchMovies } from './actions';
export class Container extends Component {
componentDidMount() {
this.props.fetchMovies();
}
}
const mapStateToProps = state => {
return {
movies: state.movies,
};
};
function mapDispatchToProps(dispatch) {
return {
fetchMovies: bindActionCreators({fetchMovies}, dispatch),
};
}
export default connect(
mapStateToProps,
mapDispatchToProps
)(Container);
export const fetchMovies = () => dispatch => {
console.log('fetchMovies called');
// const movieResponse = fetchAPI(apiUrl);
// console.log('movieResponse => ', JSON.stringify(movieResponse));
dispatch({ type: actionTypes.FETCH_MOVIES, payload: [] });
};
import { createStore, applyMiddleware } from 'redux';
import { composeWithDevTools } from 'redux-devtools-extension';
import thunk from 'redux-thunk';
import rootReducer from '../rootReducer';
const middlewares = [thunk];
const store = createStore(
rootReducer,
composeWithDevTools(applyMiddleware(...middlewares))
);
export default store;
"prop-types": "^15.7.2",
"react": "^16.8.6",
"react-bootstrap": "^1.0.0-beta.11",
"react-dom": "^16.8.6",
"react-flexbox-grid": "^2.1.2",
"react-redux": "^7.1.0",
"react-router": "^5.0.1",
"react-router-dom": "^5.0.1",
"react-scripts": "3.0.1",
"redux": "^4.0.4",
"redux-actions": "^2.6.5",
"redux-promise-middleware": "^6.1.1",
"redux-thunk": "^2.3.0",
获取错误:
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import { fetchMovies } from './actions';
export class Container extends Component {
componentDidMount() {
this.props.fetchMovies();
}
}
const mapStateToProps = state => {
return {
movies: state.movies,
};
};
function mapDispatchToProps(dispatch) {
return {
fetchMovies: bindActionCreators({fetchMovies}, dispatch),
};
}
export default connect(
mapStateToProps,
mapDispatchToProps
)(Container);
export const fetchMovies = () => dispatch => {
console.log('fetchMovies called');
// const movieResponse = fetchAPI(apiUrl);
// console.log('movieResponse => ', JSON.stringify(movieResponse));
dispatch({ type: actionTypes.FETCH_MOVIES, payload: [] });
};
import { createStore, applyMiddleware } from 'redux';
import { composeWithDevTools } from 'redux-devtools-extension';
import thunk from 'redux-thunk';
import rootReducer from '../rootReducer';
const middlewares = [thunk];
const store = createStore(
rootReducer,
composeWithDevTools(applyMiddleware(...middlewares))
);
export default store;
"prop-types": "^15.7.2",
"react": "^16.8.6",
"react-bootstrap": "^1.0.0-beta.11",
"react-dom": "^16.8.6",
"react-flexbox-grid": "^2.1.2",
"react-redux": "^7.1.0",
"react-router": "^5.0.1",
"react-router-dom": "^5.0.1",
"react-scripts": "3.0.1",
"redux": "^4.0.4",
"redux-actions": "^2.6.5",
"redux-promise-middleware": "^6.1.1",
"redux-thunk": "^2.3.0",
TypeError:this.props.fetchMovies不是一个函数
我使用的是16.8的最新版本。这就是原因吗?或者我在配置中遗漏了什么?您使用bindActionCreators时出错了。它将对象作为第一个参数。对象的属性是动作创建者本身
并像mapDispatchToProps一样返回一个对象
这可能有用
function mapDispatchToProps(dispatch) {
return bindActionCreators({ fetchMovies }, dispatch)
}
或者您可能根本不使用bindActionCreators
function mapDispatchToProps(dispatch) {
fetchMovies: () => fetchMovies(dispatch)
}
使用bindActionCreators函数时存在轻微的不匹配。像这样试试
const matchDispatchToProps = dispatch => bindActionCreators({
fetchMovies
}, dispatch)
我不使用mapDispatchToProps,我直接使用它,它可以完美地工作
export default connect(
mapStateToProps,
{ fetchMovies }
)(Container);
你可以用两种方法
const mapDispatchToProps = (dispatch) => ({
fetchMovies: () => dispatch(fetchMovies())
})
或
另外,请确保您正在导入连接的
容器
import Container from './container'
而不是
import { Container } from './container'
进一步查看您的代码,您的操作不是一个纯函数,因此它导致了另一个错误。下面是代码的快速示例您需要这样称呼它:
this.props.actions.fetchMovies()
您可能还需要更新mapDispatchToProps方法。我们这样称呼我们的:
const actions = {
fetchMovies: fetchMoviesActionFunction, // or whatever your function is called here
};
const mapDispatchToProps = dispatch => ({ actions: bindActionCreators(actions, dispatch) });
我会走另一条路。我上次与thunk合作已经有一段时间了,但我没有使用类似的方法。看看这种方法是否适合你
export class Container extends Component {
componentDidMount() {
this.props.dispatch(fetchMovies());
}
}
const mapStateToProps = state => {
return {
movies: state.movies,
};
};
export default connect(
mapStateToProps
)(Container);
我甚至也试过了,仍然是同一个问题。我已经用MapDispatchForPropsory的完整代码更新了答案,说:不走运:(我也试过,但仍然不走运:(如果我使用这个。props。fetchMovies()的话,组件中确实挂载了),它抛出了相同的错误。我想知道使用最新的react版本是否是问题所在?请尝试此
fetchMovies:bindActionCreators(fetchMovies,dispatch),
我有相同的代码,稍后更新为object,运气不好:(IIRC bindActionCreators使用dispatch包装函数,因此您将调度它2次。请尝试:export-const-fetchMovies=()=>{return{type:actionTypes.FETCH_-MOVIES,payload:[]};};第二个参数是dispatch only,我认为我在操作中没有做错任何事情。任何备选答案plz?需要工作代码,已经尝试了所有这些,但不幸的是没有工作。这应该可以工作,除非你没有导入连接的容器。你能告诉我如何使用容器吗?应该是从导入容器…
而不是导入{Container}从…
它在发布的问题中,你可以参考问题吗?不,不是。我在问你如何使用你的容器。例如:你的app.js
,它有。
对,你没有导入连接的redux容器,也不会有任何来自redux
的道具。请查看我的更新答案,谢谢演示。这个例子是有Saga还是没有?如何使用Saga?我不想让任何试图回答的人失望,因此我这边投了+1票。但我的问题仍然需要解决,在与提供的演示链接进行比较后联系我(查看我的个人资料),我将尝试解释如何使用Saga。