如何使用 rails 后端在 react-redux 中获取表单提交值?

How to get Form submit value in react-redux with rails backend?

我有一个 Rails 后端,其中包含成分列表。我正在尝试使用搜索栏(表单)输入成分 ID 以查找合适的成分。 当我单击表单的提交按钮时,我想要调度函数 getIngredient,以 ID 作为参数,但是使用我尝试过的方法,我没有得到应该是 ID 的东西;它是未定义的,或者只是 "an event"。我只是简单地看到了错误消息,所以我没有更多的细节。它只是刷新状态,清除错误消息。

我试过使用 onSubmit={() => getIngredient(id)} 形式的值,然后 returns 作为事件对象。 onSubmit={() => this.props.getIngredient(id)} 它 returns 未定义。简单地表述为 onSubmit={getIngredient(id)} 也没有用。

我有console.logged一切,我发现它在getIngredient(id)中命中派发动作时出错,因为id未定义。

我使用的 getIngredients 方法有效,但在尝试仅获取一种成分时我遇到了麻烦。我已经阅读了我能找到的关于 redux、react-redux 的所有内容,甚至重新选择以尝试针对该问题,但我已经碰壁了。

IngredientForm.js分量:

        <form onSubmit={(id) => getIngredient(id)}>
          <label value="Find Ingredient">
            <input type="text" placeholder="Search By Id" />
          </label>
          <input type="submit" value="Find Ingredient" />
        </form>

const mapDispatchToProps = { getIngredient }

const mapStateToProps = (state, props) => {
  const id = props.id;
  return {
    ingredients: state.ingredients.filter(ingredient => ingredient.id === id)
  };
};

在 actions.js 中调度操作创建者:

export function getIngredient(id) {
  return dispatch => {
        console.log("trying to get id to show up =>", id)
    dispatch(getIngredientRequest(id));
    return fetch(`v1/ingredients`)
      .catch(error => console.log(error))
      .then(response => response.json())
      .then(json => dispatch(getIngredientSuccess(json)))
      .catch(error => console.log(error));
  }
}

操作:

export function getIngredientRequest(id) {
  return { type: GET_INGREDIENT_REQUEST, id };
}

reducer.js

function rootReducer(state = initialState, action) {
  console.log(action.type);
  switch (action.type) {
    case "GET_INGREDIENTS_SUCCESS":
      return { ...state, ingredients: action.json.ingredients }
    case "GET_INGREDIENTS_REQUEST":
      console.log('Ingredients request received')
      return
    case "HIDE_INGREDIENTS":
      console.log('Ingredients are being hidden')
      return { ...state, ingredients: [] }
    case "GET_INGREDIENT_REQUEST":
      console.log('One Ingredient request received:', "id:", action.id)
      return
    case "GET_INGREDIENT_SUCCESS":
    console.log('GET_INGREDIENT_SUCCESS')
      return {
                ...state,
                ingredients: action.json.ingredients.filter(i => i.id)
            }
    default:
      return state
  }
}

服务器端window输出:

Processing by StaticController#index as HTML
  Parameters: {"page"=>"ingredients"}
  Rendering static/index.html.erb within layouts/application
  Rendered static/index.html.erb within layouts/application (0.9ms)
Completed 200 OK in 9ms (Views: 7.9ms | ActiveRecord: 0.0ms)```

那是因为在 React Synthetic Events 中 - 就像 onSubmit - 回调中的第一个参数始终是 Event 对象。 我建议您使用受控输入。这意味着您将 id 值保留在组件的状态中并将该值分配给输入。每当用户键入新 ID 时,您都会更新状态并将新值分配给输入。

class Form extends React.Component {
 state = {
  id: ""
 };

 handleInputChange = event => {
  this.setState({ id: event.target.value });
 };

 render() {
  return (
   <form
    onSubmit={(event) => {
     event.preventDefault();
     getIngredient(this.state.id);
    }}
   >
    <label value="Find Ingredient">
     <input
      type="text"
      placeholder="Search By Id"
      onChange={this.handleInputChange}
      value={this.state.id}
     />
    </label>
    <input type="submit" value="Find Ingredient" />
   </form>
  );
 }
}