我在更新值时遇到了问题。最初,我从父类获取值放入文本框中,然后,如果我想通过子组件更新表单中的值,它基本上应该设置子组件中的状态,并将更新后的值传递给API。但是现在,当我尝试更改文本框中的值时,它只更改了一个字符,并且没有跟踪所有道具的状态。我该如何解决这个问题呢?我尝试过使用defaultValue,它确实改变了值,但它无法跟踪状态的变化。
PS: updateToApi只是一个示例函数,它使用post将值更新到api中我的示例项目在这里是https://codesandbox.io/s/sad-perlman-ukb68?file=/src/parent.js
#class Parent#
import React from "react";
import "./styles.css";
import Child from "./child";
class Parent extends React.Component {
constructor() {
super();
this.state = {
data: {
username: ["mar"],
name: [null]
}
};
}
updateToApi(data) {
var username: data.username;
var name: data.name;
}
render() {
return (
<Child data={this.state.data} updateToApi={this.updateToApi.bind(this)} />
);
}
}
export default Parent;
##class Child##
import React from "react";
import "./styles.css";
import { Button } from "react-bootstrap";
class Child extends React.Component {
constructor(props) {
super(props);
this.state = {
username: "",
name: ""
};
}
handleSubmit = e => {
e.preventDefault();
};
handleChange = e => {
const data = { ...this.state };
data[e.currentTarget.name] = e.currentTarget.value;
this.setState({ data });
};
render() {
return (
<>
<form onSubmit={this.handleSubmit}>
<label>
Username:
<input
type="text"
name="username"
value={
this.props.data.username !== "undefined"
? this.props.data.username
: this.state.username
}
onChange={this.handleChange}
/>
</label>
<b />
<label>
Name:
<input
type="text"
name="Name"
value={
this.props.data.name !== "undefined"
? this.props.data.name
: this.state.name
}
onChange={this.handleChange}
/>
</label>
<br />
<Button variant="primary" onClick={this.props.updateToApi} />
</form>
</>
);
}
}
export default Child;
发布于 2020-06-03 21:57:15
为什么你有两个不同的状态?您应该完全去掉您的子组件中的状态,并且只使用父组件的状态。将HandleChange函数也放入你的父组件中,并通过props向下传递。
更新
如果您想让输入中的更改可见,您可以将您的子组件中的onchange处理程序更改为
handleChange = e => {
this.setState({
[e.currentTarget.name] : e.currentTarget.value });
};
并将输入值直接转换为this.state.username
不过,我还是很难理解你到底想要做什么。输入字段有两个独立的条件状态太复杂了。想象一下,如果你的应用程序会更复杂一点呢?你已经迷失在调试这些东西上了:
value={ this.props.data.username !== "undefined"
? this.state.username
: this.state.username
}
因此,我强烈建议您重新评估应用程序中的所有数据结构和数据流。你应该在你的应用程序中拥有最少的真理来源。理想情况下是一个。因此,只需在父组件中使用main状态,并向下传递所需的属性。
https://stackoverflow.com/questions/62173890
复制相似问题