React Redux:动作创建者不调用reducer

ken*_*edy 5 javascript action reducers reactjs redux

我的动作创建者没有调用我的减速器.任何帮助都感激不尽.

types.js

export const SELECTED_FOOD = 'selected_food';
Run Code Online (Sandbox Code Playgroud)

index.js(动作创建者/动作)

import {
  SELECTED_FOOD
} from './types';

export function selectedFood({data}) {
console.log('SELECTED_FOOD **********************',data);
  return({
    type: SELECTED_FOOD,
    payload: data
  });
}
Run Code Online (Sandbox Code Playgroud)

来自操作创建者的console.log的输出

Object {_id: "18240", description: "Croissants, apple", score: 0.75, fields: Object}
Run Code Online (Sandbox Code Playgroud)

selected_food_reducer.js

import {
SELECTED_FOOD

} from '../actions/types';

export default function(state = [], action) {
 switch(action.type) {
  case SELECTED_FOOD:
    console.log('Selected Food Reducer *************', state);
    return  action.payload ;
}

return state;
}
Run Code Online (Sandbox Code Playgroud)

EDIT组件无法调用调度.

我应该在我的初始帖子中添加这个,看起来调用dispatch有什么问题.ESLint在第3行标记了已定义但从未使用过的调度.

import React from 'react';
import { connect } from 'react-redux';
import { dispatch } from 'react-redux';
import { selectedFood } from '../actions/index';

class TableRow extends React.Component {
  render() {
    const {
      data
    } = this.props;


    console.log('PROPS TableRow', this.props);

    const row = data.map((data) =>
    <tr onClick={() => selectedFood({data})}>
      <td key={data.description}>{data.description}</td>
      <td key={data.id}>{data.fields.nutrients[0].amountPer100G}</td>
      <td key={data.id}>{data.fields.nutrients[1].amountPer100G}</td>
      <td key={data.id}>{data.fields.nutrients[4].amountPer100G}</td>
    </tr>
    );
    return (
      <tbody>{row}</tbody>
    );
  }
}

const  mapStateToProps = (state) => {
  return {
    selectedFood: state.selectedFood
  }
}


const mapDispatchToProps = (dispatch) => {
  console.log('IN mapDispatchToProps')
  return {
    onClick: ({data}) => {
      dispatch(selectedFood({data}))
    }
  }
}

export default connect(mapStateToProps, mapDispatchToProp)(TableRow);
Run Code Online (Sandbox Code Playgroud)

ale*_*zyk 12

动作创建者不会调用减速器.它就是它,仅此而已,它创建了一个动作 - 即具有动作类型的对象和该动作的有效负载.

您需要调度一个动作,强制redux调用reducer,这就是您使用action action的地方,即:

import { Dispatch } from "redux";
import { selectedFood } from "./actions";
Dispatch(selectedFood({type:"hamburger"}));
Run Code Online (Sandbox Code Playgroud)

应该调用reducer,但是大多数情况下你不会Dispatch直接调用,而是mapDispatchToProps用你的反应组件连接到redux存储的方法.

有大量的示例如何react-redux使用上面的地图功能,所以我建议阅读它,并阅读redux如何工作.

======更新问题后编辑=========

所以首先不使用从导入调度,ESLint正确告诉它,你不需要导入,因为:

const mapDispatchToProps = (dispatch) => {
  console.log('IN mapDispatchToProps')
  return {
    onClick: ({data}) => {
      dispatch(selectedFood({data}))
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

你不是只dispatch从你import的论证中调用它,而是通过函数传递给你mapDispatchToPropsconnect.

然后这是完全错误的:

<tr onClick={() => selectedFood({data})}>
Run Code Online (Sandbox Code Playgroud)

您导入了一个动作创建者,该动作创建者在单击表行时被调用,即动作定义由动作创建者创建,就是这样.您的代码完全符合您的要求.

mapDispatchToProps函数执行名称建议 - 它将调度函数映射到组件的props.

所以它应该是:

<tr onClick={() => this.props.onClick({data})}>
Run Code Online (Sandbox Code Playgroud)

那应该派遣行动和工作.

但是强烈建议学习一些课程或阅读更多react,redux并且react-redux,因为你的代码示例和问题本身就表明,你只是试图让某些东西起作用,没有基本的理解它是如何工作的,甚至是javascript如何工作.对不起该评论,但这就是它的样子.