reactjs - 在 React 中表单提交消息
问题描述
我正在尝试显示“您现在订阅了 {SUBSCRIPTION}”的消息。当用户在 React 中提交表单时。我对 React 很陌生,所以我觉得我错过了一些小东西(希望如此)。
到目前为止,我有一些看起来像这样的东西:
constructor(props) {
super(props);
this.state = {
user: {
newsletter: props.newsletter
}
}
}
handleNewsletterInput(event) {
var user = this.state.user;
user.newsletter = event.target.value;
// Update the state object
this.setState({ user: user })
}
handleSubmit(event) {
var user = this.state.user;
user.newsletter = event.target.value;
alert("You are now subscribed to " + { user } + ".")
}
...
render() {
return (
<div>
<h2>Subscribe</h2>
<form onSubmit={this.handleSubmit.bind(this)}>
<label>
<p>Newsletter Type:</p>
<input
id='newsletter'
type='text'
name='newsletter'
value={this.state.user.newsletter}
onChange={this.handleNewsletterInput.bind(this)}
/>
</label>
<button
type='submit'
id='subscribe'
name='subscribe'>
Subscribe
</button>
</form>
</div>
);
...
当我运行它时,我收到一条消息说“您现在订阅了 [object Object]”。我做错了什么,如何让 [object Object] 说出时事通讯的名称?
解决方案
这不是 React 问题。
alert("You are now subscribed to " + { user } + ".")
在这里,您将一个对象与一个字符串连接起来。该对象被强制转换为“[object Object]”字符串,因为任何对象 v.toString() 在默认情况下(除非明确设置)都将其作为内存引用。试试这条线:
alert("You are now subscribed to " + JSON.stringify(user) + ".")
以及如何让 [object Object] 说出时事通讯的名称?
alert("You are now subscribed to " + user.newsletter + ".")
不幸的是,当我这样做时收到一个错误。
alert("You are now subscribed to " + { user.newsletter } + ".")
您在下面问题的评论中提到的这种语法是错误的。{user.newsletter}
不是正确的语法,它既不是对象也不是字符串。
添加后编辑handleNewsletterInput
:
handleNewsletterInput(event) {
var user = this.state.user;
user.newsletter = event.target.value;
// Update the state object
this.setState({ user: user })
}
以上不会更新状态,因为您没有更改user
变量的内存引用。React 不会知道状态已经改变,因为它会进行比较prevState===currentState
,并且它会给出true
, 因为它在同一个内存位置。试试这个:
handleNewsletterInput(event) {
const { user } = this.state;
const updatedUser = {
...user,
newsletter: event.target.value
}
// Update the state object
this.setState({ user: updatedUser })
}
编辑2:您在这里也犯了一个错误-
handleSubmit(event) {
var user = this.state.user;
user.newsletter = event.target.value;
alert("You are now subscribed to " + { user } + ".")
}
这个事件就是提交事件,这里的前两行不需要。
handleSubmit(event) {
// Do something like send form data to backend here.
alert("You are now subscribed to " + this.state.user.newsletter + ".")
}
推荐阅读
- python - 使用坐标计算 numpy 角度
- java - 更改滚动时的背景颜色
- mysql - MySQL 停留在这个查询上
- c++ - 我无法将对象分配给对象数组
- reactjs - React 中的 CSS-In-JS 或在 JavaScript 中合并样式
- python - 如何在收集期间在测试功能之外的 pytest 中访问捕获的 stdout/stderr?
- python - 如何向包含两个系列的图表添加图例?
- ios - 我是否需要始终创建嵌套结构以从 json 响应中的嵌套模型中仅获取一个属性?
- python - 在一个类中调用一个函数在一个单独的类中调用一个函数python
- java - 在二维数组中添加元素