我已经连接了一个简单的React组件(映射一个简单的数组/状态).为了避免引用store 的上下文,我想要一种直接从props 获取"分派"的方法.我见过其他人使用这种方法,但由于某种原因无法使用:)

下面是我目前使用的每个npm依赖项的版本

"react": "0.14.3",
"react-redux": "^4.0.0",
"react-router": "1.0.1",
"redux": "^3.0.4",
"redux-thunk": "^1.0.2"

下面是组件w/connect方法

class Users extends React.Component {
    render() {
        const { people } = this.props;
        return (
            <div>
                <div>{this.props.children}</div>
                <button onClick={() => { this.props.dispatch({type: ActionTypes.ADD_USER, id: 4}); }}>Add User</button>
            </div>
        );
    }
};

function mapStateToProps(state) {
    return { people: state.people };
}

export default connect(mapStateToProps, {
    fetchUsers
})(Users);

如果你需要看减速机(没有什么令人兴奋的,但它在这里)

const initialState = {
    people: []
};

export default function(state=initialState, action) {
    if (action.type === ActionTypes.ADD_USER) {
        let newPeople = state.people.concat([{id: action.id, name: 'wat'}]);
        return {people: newPeople};
    }
    return state;
};

如果你想知道我的路由是如何配置的

const createStoreWithMiddleware = applyMiddleware(
      thunk
)(createStore);

const store = createStoreWithMiddleware(reducers);

var Route = (
  <Provider store={store}>
    <Router history={createBrowserHistory()}>
      {Routes}
    </Router>
  </Provider>
);

update

看起来,如果我在connect中省略了我自己的分派(目前我正在向fetchUsers展示),我将获得免费分派(只是不确定这是否是带有异步操作的安装程序通常的工作方式).人们是混搭呢,还是全部混搭?

[mapDispatchToProps]

推荐答案

默认情况下,mapDispatchToProps只是dispatch => ({ dispatch })

如果将自定义函数传递给mapDispatchToProps,则可以对该函数执行任何操作

// inject onClick
function mapDispatchToProps(dispatch) {
  return {
    onClick: () => dispatch(increment())
  };
}

// inject onClick *and* dispatch
function mapDispatchToProps(dispatch) {
  return {
    dispatch,
    onClick: () => dispatch(increment())
  };
}

为了节省一些时间,Redux提供了bindActionCreators()个选项,让您可以:

// injects onPlusClick, onMinusClick
function mapDispatchToProps(dispatch) {
  return {
    onPlusClick: () => dispatch(increment()),
    onMinusClick: () => dispatch(decrement())
  };
}

对此:

import { bindActionCreators } from 'redux';

// injects onPlusClick, onMinusClick
function mapDispatchToProps(dispatch) {
  return bindActionCreators({
    onPlusClick: increment,
    onMinusClick: decrement
  }, dispatch);
}

当props 名称与动作创建者名称匹配时,甚至更短:

// injects increment and decrement
function mapDispatchToProps(dispatch) {
  return bindActionCreators({ increment, decrement }, dispatch);
}

如果您愿意,可以手动添加dispatch:

// injects increment, decrement, and dispatch itself
function mapDispatchToProps(dispatch) {
  return {
    ...bindActionCreators({ increment, decrement }), // es7 spread syntax
    dispatch
  };
}

对于你是否应该这样做没有官方建议.connect()通常是Redux-aware和Redux-unaware组件之间的边界.这就是为什么我们通常觉得注入both个绑定动作创作者和dispatch个绑定动作创作者是没有意义的.但如果你觉得有必要这么做,请随意.

最后,你现在使用的模式是一种比拨打bindActionCreators还短的快捷方式.当您只需返回bindActionCreators时,可以省略调用,而不是执行以下操作:

// injects increment and decrement
function mapDispatchToProps(dispatch) {
  return bindActionCreators({ increment, decrement }, dispatch);
}

export default connect(
  mapStateToProps,
  mapDispatchToProps
)(App);

可以这样写

export default connect(
  mapStateToProps,
  { increment, decrement } // injects increment and decrement
)(App);

然而,当你想要更定制的东西时,比如通过dispatch,你就必须放弃这个漂亮的简短语法.

Reactjs相关问答推荐

我无法对NextJ中的动态元素应用内部/内联风格

呈现组件元素(MAP)中的问题

从app.js导航,这是在BrowserRouter包装之外

如何在react组件中使用formik进行验证

基本react 应用程序正在触发两次Use Effect

如何在NextJS中仅在刷新页面和页面淡出页面过渡时添加全屏加载器

为什么react日历时间轴项Renderprops 不能与useState挂钩一起使用?

将 useRef 与 useImperativeHandle 一起使用时,React 不会重新渲染

获取 不能显示为 的后代.错误,但不太确定如何构建我的代码以避免此警告

为什么 useEffect 的初始化对于加载 localStorage 不起作用?

如何将 DocuSign 控制台界面嵌入到 React 应用中

BrowserRouter改变了URL但没有链接到页面

基于 React/NextJS Timer 的文本淡入/淡出不起作用

使用新数据更新时,React 不更新具有过滤功能的深层嵌套对象数组中的变量状态

将复杂状态和 setState 传递给更简单的 api

如何通过单击多个选项中的特定项目在模态上呈现不同的标题?

如何定制 React 热 toastr ?

react 路由dom没有路由匹配位置错误/在路由中制作组件

网格项不缩小以适应包含的可滚动列表

你如何使用 refs 访问 React 中映射子项的值?