gpt4 book ai didi

javascript - OnChange 不在 setState 上保存写入的输入值

转载 作者:行者123 更新时间:2023-11-30 19:52:08 24 4
gpt4 key购买 nike

这似乎是一个愚蠢的问题,所以我提前道歉。

我有一个包含多个输入的页面,目前,出于某种原因,我无法只获取输入中写入的新值,因此我可以更新状态并发送此新数据。在我看来 onChange 函数有问题,因为我可以获得以前的状态,但不能获得我在状态上保存的新值。

编辑:提交按钮在输入表单之外。

代码如下:

constructor(props) {
super(props)

this.state = {
editMode: false,
data: {
designation: '',
address: '',
description: ''
}
}
}

componentDidMount = () => {
const dataInfo = data.get('url here');//fetching data here

const data = {
designation: dataInfo.designation ,
address: dataInfo.address,
description: dataInfo.description
}

this.setState({
data: data
})
}

handleInput = (e) => {
let value = e.target.value;
let name = e.target.name;

this.setState(
prevState => ({
data: {
...prevState.data,
[name]: value
}
})
);
}

handleFormSubmit = (e) => {
e.preventDefault();

const { data } = this.state;

console.log('hey', data.designation);

this.setState({
editMode: false
})
}

render() {

{!this.state.editMode
? <button onClick={() => this.setState({ editMode: true })}>edit</button>
: <div>
<button
className={styles.buttonMargin}
onClick={() => this.setState({ editMode: false })}>cancel</button>
<button onClick={this.handleFormSubmit}>Guardar</button>
</div>
}

<div>
{this.state.editMode
? <form onSubmit={this.handleFormSubmit}>
<input
type='text'
placeholder='Nome do Campo'
name='designation'
onChange={this.handleInput}
defaultValue={this.state.data.designation}
/>
</form>
: <p> {this.state.data.designation} </p> }
</div>
}
}

最佳答案

我会推荐一些更改,我在这里有您的代码的工作版本:https://stackblitz.com/edit/react-vmeuxc

将您的函数绑定(bind)到构造函数内部将允许您稍后编写单元测试,并在需要时从组件外部访问这些函数。

根据我的经验,使用 e.currentTarget.value 比使用 e.target.value 更稳定 Difference between e.target and e.currentTarget

我不明白为什么要将 this.state 分配给 handleFormSubmit 中的常量,所以我删除了它。

您缺少一些标记,例如表单上的提交按钮和未处于编辑模式时的编辑按钮。我也不明白为什么你在 render 语句的末尾有随机的 this.setState({ editMode: false }) ,所以我删除了它,因为它不是没必要。

拥有这样的辅助函数将有助于检查新值的现有值。

  compareData(currentData, newData) {
if(currentData === 'undefined' || (newData && currentData !== newData)) {
return newData;
} else {
return false;
}
}

这是您的代码的完全清理版本。 注意:我不得不创建一个虚拟的 dataInfo 对象,因为我无权访问您的 API。

  constructor(props) {
super(props);
this.compareData = this.compareData.bind(this);
this.handleInput = this.handleInput.bind(this);
this.handleFormSubmit = this.handleFormSubmit.bind(this);
this.state = {
editMode: false,
data: {
designation: '',
address: '',
description: ''
}
}
}

componentDidMount = () => {
const dataInfo = {
designation: 'test designation',
address: 'test address',
description: 'test description'
};
// const dataInfo = data.get('url here'); //fetching data here
const data = {
designation: dataInfo.designation ,
address: dataInfo.address,
description: dataInfo.description
}

this.setState({
data: data
})
}

compareData(currentData, newData) {
if(currentData === 'undefined' || (newData && currentData !== newData)) {
return newData;
} else {
return false;
}
}

handleInput(e) {
let value = e.currentTarget.value;
let name = e.currentTarget.name;

if(this.compareData(this.state.data[name], value)) {
this.setState({
data: {
...this.state.data,
[name]: value
}
});
}

console.log(this.state);
}

handleFormSubmit(e) {
e.preventDefault();

this.setState({
editMode: false
});
}

render() {
return (
<div>
{!this.state.editMode ? (
<button onClick={() => this.setState({ editMode: true })}>edit</button>
) : (
<div>
<button onClick={() => this.setState({ editMode: false })}>cancel</button>
<button onClick={this.handleFormSubmit}>Guardar</button>
</div>
)}

{this.state.editMode ? (
<form>
<input
type='text'
placeholder='Nome do Campo'
name='designation'
onChange={this.handleInput}
defaultValue={this.state.data.designation}
/>
</form>
) : (
<p> {this.state.data.designation} </p>
)}
</div>
)
}

关于javascript - OnChange 不在 setState 上保存写入的输入值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54368468/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com