【问题标题】:Why does input in React/Redux form change a number into a string?为什么 React/Redux 表单中的输入会将数字变为字符串?
【发布时间】:2018-11-03 17:24:20
【问题描述】:

我正在用 React 和 Redux 构建一个表单。当我在表单中键入时,输赢的输入会将输入的数字更改为字符串。表单没有保存,因为数据类型应该是数字。我不希望数字在输入到表单时变成字符串。

我认为问题可能出在我的handleOnChange 的表单上。

class TeamForm extends Component {
   handleOnChange = event => {
      const { name, value } = event.target;

      const currentTeamFormData = Object.assign({}, 
      this.props.teamFormData, {
        [name]: value
        });
      this.props.updateTeamFormData(currentTeamFormData);
  };

   handleOnSubmit = event => {
       event.preventDefault();
       this.props.createTeam(this.props.teamFormData);
   };

    render() {
        const { name, wins, losses, logo_url } = this.props.teamFormData;
        return (
          <div className="teamForm">
            <h1>Add a team to the League</h1>
            <form onSubmit={this.handleOnSubmit}>
              <div>
                <label htmlFor="name">Name:</label>
                <input
                  type="text"
                  onChange={this.handleOnChange}
                  name="name"
                  value={name}
                />
              </div>
              <div>
                <label htmlFor="wins">Wins:</label>
                <input
                  type="number"
                  onChange={this.handleOnChange}
                  name="wins"
                  value={wins}
                />
              </div>
              <div>
                <label htmlFor="losses">Losses:</label>
                <input
                  type="number"
                  onChange={this.handleOnChange}
                  name="losses"
                  value={losses}
                />
              </div>
              <div>
                <label htmlFor="logo_url">Logo url:</label>
                <input
                  type="text"
                  onChange={this.handleOnChange}
                  name="logo_url"
                  value={logo_url}
                />
              </div>

              <button type="submit">Add Team</button>
            </form>
          </div>
      );
    }
}

下面是与更新表单相关的动作创建者和缩减者。

    export const updateTeamFormData = teamFormData => {
      debugger;
      return {
        type: "UPDATED_DATA",
        teamFormData
      };
    };

    export const resetTeamForm = () => {
      return {
        type: "RESET_TEAM_FORM"
      };
    };


    const initialState = {
       name: "",
       wins: 0,
       losses: 0,
       logo_url: ""
    };

   export default (state = initialState, action) => {
      switch (action.type) {
        case "UPDATED_DATA":
          return action.teamFormData;

        case "RESET_TEAM_FORM":
          return initialState;

        default:
          return state;
      }
   };

感谢任何帮助或见解。谢谢!

【问题讨论】:

    标签: reactjs redux react-redux


    【解决方案1】:

    无论输入类型如何,输入值始终以字符串形式发送给您。 当您使用input type="number" 时,它只会帮助浏览器显示一个数字键盘。

    您必须在调用您的操作之前或在操作本身内部将值转换为 Int parseInt(myValue)

    【讨论】:

      【解决方案2】:

      更新:由于它是常规形式,您可以在 handleOnChange 事件监听器中处理它:

      handleOnChange = event => {
          const { name, value, type } = event.target;
      
          const currentTeamFormData = Object.assign({}, this.props.teamFormData, {
            [name]: type === "number" ? parseInt(value, 10) : value
          });
      
          this.props.updateTeamFormData(currentTeamFormData);    
      };
      

      在这里我检查了input.type,以便handleOnChange 可以保持足够抽象/通用,但您可以使用任何其他技术来区分数字类型输入(甚至甚至创建单独的处理程序)。思路是看它是否是数字类型,如果是,使用parseInt将其转换为数字。

      这是更新后的sandbox(注意我使用setState 来演示核心概念,但这不是必须使用的;您可以像现在一样使用您的redux 操作)。

      旧答案;留在这里留给后人

      Redux 表单为此提供了一个parse 函数:

      <input
          type="number"
          onChange={this.handleOnChange}
          name="wins"
          value={wins}
          parse={value => parseInt(value, 10)}
      />
      

      请注意,type="number"form 存储数据的方式没有影响。它仅对可以显示数字键盘的现代浏览器有帮助,从而使您的表单更加用户友好。

      【讨论】:

      • 解析行没有解析传入值的数字。对此有何其他建议?
      • 确实如此:imgur.com/a/oTge5xB。查看添加parseInt 后存储的值如何更改为数字。这是沙盒:codesandbox.io/s/x31n2v7r0w
      • 我没有使用 redux-form。我在哪里将parseInt 应用于我当前的表单输入。
      • 好吧,你把它标记为 redux-form! :) 查看我的更新。
      猜你喜欢
      • 1970-01-01
      • 2019-07-29
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      • 2016-06-21
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      相关资源
      最近更新 更多