use*_*074 13 javascript reactjs
我有一个动态形式作为通过基于类的组件生成的功能组件。我要设置重置按钮,以清除输入字段值并将状态设置为null数组。
完整的代码在这里可用:https: //codesandbox.io/s/beautiful-archimedes-o1ygt
我想要一个重置按钮,清除所有输入值并将Itemvalues数组初始化为null。即使我将值设置为null,也不会清除输入字段。
但是,我面临的问题是,由于它是动态表单和功能组件,因此对于每个单独的表单字段都没有预定义的状态,因此很难将值设置为null。有人可以帮忙吗,我长期以来一直坚持
这是一个codeandbox,向您展示如何重置项目:https ://codesandbox.io/s/romantic-heisenberg-93qi7
我还为您提供了有关如何使其与API数据配合使用的注释,请参阅内部的注释 onChangeText()
问题是输入不像您推论的那样受状态控制。我们应该为您API中的每个项目创建一个更新的对象,并为其提供value支持。
import React from "react";
import ReactDOM from "react-dom";
import Cart from "./Cart";
import "./styles.css";
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
Items: [],
itemvalues: [{}]
};
this.onChangeText = this.onChangeText.bind(this);
this.getItems = this.getItems.bind(this);
this.handleReset = this.handleReset.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
this.findFieldIndex = this.findFieldIndex.bind(this);
this.trimText = this.trimText.bind(this);
}
getItems = () => {
/*if the data is coming from an API, store it in an array then .map() over it.
we can add a value prop to the object like:
so you can do something like:
const newItems = [...apiData].map((item) => {
return {
...item,
value: ""
}
})
this.setState({
Items: newItems
})
*/
this.setState({
Items: [
{
name: "item1",
description: "item1",
group: "groupA",
dtype: "str",
value: ""
},
{
name: "item2",
description: "item2",
group: "groupA",
dtype: "str",
value: ""
},
{
name: "item3",
description: "item3",
group: "groupB",
dtype: "str",
value: ""
},
{
name: "item4",
description: "item4",
group: "groupB",
dtype: "str",
value: ""
}
]
});
};
onChangeText = e => {
const updatedItems = [...this.state.Items].map(item => {
if (item.name === e.target.name) {
return {
...item,
value: e.target.value
};
} else {
return item;
}
});
const updatedItemValues = [...updatedItems].reduce((obj, curr) => {
if (!obj[curr.group]) {
obj[curr.group] = [];
}
obj[curr.group] = [...obj[curr.group], { [curr.name]: curr.value }];
return obj;
}, {});
this.setState({
...this.state,
Items: updatedItems,
itemvalues: updatedItemValues
});
};
findFieldIndex = (array, name) => {
return array.findIndex(item => item[name] !== undefined);
};
trimText(str) {
return str.trim();
}
handleReset = () => {
const resetedItems = [...this.state.Items].map(item => {
return {
...item,
value: ""
};
});
this.setState(
{
...this.state,
Items: resetedItems,
itemvalues: []
},
() => console.log(this.state)
);
};
handleSubmit = () => {
console.log(this.state.itemvalues);
};
render() {
return (
<div>
{
<Cart
Items={this.state.Items}
getItems={this.getItems}
handleSubmit={this.handleSubmit}
handleReset={this.handleReset}
onChangeText={this.onChangeText}
/>
}
</div>
);
}
}
Run Code Online (Sandbox Code Playgroud)
import React, { useEffect } from "react";
import Form from "./Form";
const Cart = props => {
useEffect(() => {
props.getItems(props.Items);
}, []);
return (
<div>
<Form Items={props.Items} onChangeText={props.onChangeText} />
<button onClick={props.handleSubmit}>Submit</button>
<button onClick={props.handleReset}>Reset</button>
</div>
);
};
export default Cart;
Run Code Online (Sandbox Code Playgroud)
推车组件可以保持大致相同,我们不需要在传递props.items到useEffect()依赖。
import React from "react";
const Form = props => {
return (
<div>
{props.Items.map(item => {
return (
<input
name={item.name}
placeholder={item.description}
data-type={item.dtype}
data-group={item.group}
onChange={e => props.onChangeText(e)}
value={item.value}
/>
);
})}
</div>
);
};
export default Form;
Run Code Online (Sandbox Code Playgroud)
现在在Formcomponent中,我们为每个输入提供一个值prop,该值prop连接到我们的最高父component-state的项目。
这几乎是您重置值所需的全部。
| 归档时间: |
|
| 查看次数: |
675 次 |
| 最近记录: |