为什么React / Redux表单中的输入会将数字更改为字符串?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么React / Redux表单中的输入会将数字更改为字符串?相关的知识,希望对你有一定的参考价值。
我正在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;
}
};
任何帮助或见解表示赞赏。谢谢!
无论输入类型如何,输入值始终作为字符串发送给您。当您使用input type=“number”
时,它仅帮助浏览器显示数字键盘。
您必须在调用操作之前或在操作本身内部将值强制转换为Int(parseInt)。
更新:由于它是常规表单,您可以在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"
对表单存储数据的方式没有影响。它只对现代浏览器有帮助,它可以显示数字键盘,从而使您的表单更加用户友好。
以上是关于为什么React / Redux表单中的输入会将数字更改为字符串?的主要内容,如果未能解决你的问题,请参考以下文章
无法通过 React 和 Redux 将相同的表单组件用于添加或编辑模式