Javascript 无法在“反应”输入字段中键入
当前,“我的输入”字段的默认值为1。如果我尝试在输入字段中键入内容,则不会发生任何更改Javascript 无法在“反应”输入字段中键入,javascript,reactjs,typescript,react-native,react-props,Javascript,Reactjs,Typescript,React Native,React Props,当前,“我的输入”字段的默认值为1。如果我尝试在输入字段中键入内容,则不会发生任何更改 interface Orders { order_graph_1: number; order_graph_2: number; } interface MyProps extends Orders { setOrders: (...args: any) => void; // function which takes args...?? } interfac
interface Orders {
order_graph_1: number;
order_graph_2: number;
}
interface MyProps extends Orders {
setOrders: (...args: any) => void; // function which takes args...??
}
interface MyState extends Orders {
//otherProperty: string;
}
class Setup extends React.Component<MyProps, MyState>{
state = {
order_graph_1: this.props.order_graph_1,
order_graph_2: this.props.order_graph_2
};
// needs to be an arrow function to access `this` properly
// could use ( event: React.ChangeEvent<HTMLInputElement>)
// could avoid the assertion by passing the name as an argument
setOrders = (event: any) => {
this.setState((prevState) => ({
...prevState,
[event.target.name]: parseInt(event.target.value)
}));
};
render(){
return(
<div className="row">
<div className="col-6">
<p className="text-center">Order of first model: </p>
<div className="w-100 d-flex justify-content-center">
<input className="text-center" name="order_graph_1" type="number" value={this.props.order_graph_1} onChange={this.setOrders.bind(this)} min="1" max="10"/>
</div>
</div>
</div>
);
}
}
export default Setup;
每次我尝试键入输入字段时,我都会看到控制台中打印hello,但输入字段的值仍然没有改变
编辑:
这是一个JS代码():
类回归设置扩展了React.Component{
建造师(道具){
超级(道具);
这个。订单={
“order_graph_1”:this.props.order_graph_1,
“order_graph_2”:this.props.order_graph_2
};
}
设置命令(事件){
this.orders[event.target.name]=parseInt(event.target.value);
this.props.setOrders(Object.values(this.orders));
}
render(){
返回(
第一款车型的订单:
第二种型号的订单:
);
}
}
导出默认回归设置;
更改输入值时,图形上的一条线会根据该值进行更改。我不得不把这个代码改成Typescript。这就是我现在拥有的
interface Orders {
order_graph_1: number;
order_graph_2: number;
}
interface MyProps extends Orders {
setOrders: (...args: any) => void; // function which takes args...??
}
interface MyState extends Orders {
//otherProperty: string;
}
class Setup extends React.Component<MyProps, MyState>{
state = {
// it is best not to derive state from props
order_graph_1: this.props.order_graph_1,
order_graph_2: this.props.order_graph_2
};
// needs to be an arrow function to access `this` properly
// could use ( event: React.ChangeEvent<HTMLInputElement>)
// could avoid the assertion by passing the name as an argument
setOrders = (event: any) => {
// I don't love this solution, but we can avoid the TS errors by copying the previous state
this.setState((prevState) => ({
...prevState,
[event.target.name]: parseInt(event.target.value)
}));
};
render(){
return(
<div className="row">
<div className="col-6">
<p className="text-center">Order of first model: </p>
<div className="w-100 d-flex justify-content-center">
<input className="text-center" name="order_graph_1" type="number" value={this.state.order_graph_1} onChange={this.setOrders.bind(this)} min="1" max="10"/>
</div>
</div>
{/* <div className="col-6">
<p className="text-center">Order of second model: </p>
<div className="w-100 d-flex justify-content-center">
<input className="text-center"name="order_graph_2" type="number" value={this.props.order_graph_2} onChange={this.setOrders.bind(this)} min="1" max="10"/>
</div>
</div> */}
</div>
);
}
}
export default Setup;
接口命令{
顺序图1:数字;
顺序图2:数字;
}
接口MyProps扩展订单{
setOrders:(…args:any)=>void;//接受args的函数。。。??
}
接口MyState扩展了订单{
//otherProperty:字符串;
}
类设置扩展了React.Component{
状态={
//最好不要从道具中获得状态
顺序图:this.props.order图,
顺序图2:this.props.order图2
};
//需要是箭头函数才能正确访问'this'
//可能使用(事件:React.ChangeEvent)
//可以通过将名称作为参数传递来避免断言
setOrders=(事件:任意)=>{
//我不喜欢这个解决方案,但是我们可以通过复制以前的状态来避免TS错误
this.setState((prevState)=>({
…国家,
[event.target.name]:parseInt(event.target.value)
}));
};
render(){
返回(
第一款车型的订单:
{/*
第二种型号的订单:
*/}
);
}
}
导出默认设置;
虽然它编译时没有错误,但输入值的东西不起作用。它不会改变图形上的线条,因此我假设状态未保存。如何解决此问题?只有React组件在状态更改时才会重新启动。因此,您应该在每次值更改时根据输入字段的值相应地更改状态,然后将此状态值加载到输入字段中。这导致了问题
value={this.props.order\u graph\u 1}
此处的值是从props而非state派生的。理想情况下,它应该使用一些状态进行填充,onChange应该更新该状态。
因为在每次重播之后,道具不会改变,输入值仍然保持不变
this.state.order\u graph\u 1
应该是输入字段的值。问题是,您使用的是从道具中获得的order\u graph\u 1
和order\u graph\u 2
的值,但是更新了处于状态的值,而没有更新道具中的值
正在转换的代码同时更新状态和道具(通过调用this.props.setOrders
)。但是完全没有必要让这些变量处于组件状态RegressionSetup
,因为它已经可以通过props访问和更新它们
从Main
组件传递下来的setOrders
函数也有点愚蠢,因为这两个组件都有一个属性为order\u graph\u 1
和order\u graph\u 2
的状态——那么为什么我们要将它们作为元组传递给setOrders
在Main
中,您可以删除setOrders
函数,而是向下传递一个调用setState
的箭头函数
<RegressionSetup
order_graph_1={this.state.order_graph_1}
order_graph_2={this.state.order_graph_2}
setOrders={(orders) => this.setState(orders)}
/>
它没有理由成为一个类组件,但也没关系<代码>回归设置不需要使用状态、挂钩或生命周期方法。它只需要使用道具并返回JSX
我仍然更喜欢使用函数呈现两个输入,因为它的重复性更小,但显然您不必这样做。我们使用变量property
从propsvalue={this.props[property]}
获取正确的属性,并在传递给setOrders
的对象上设置正确的键:onChange={(e)=>this.props.setOrders({[property]:parseInt(e.target.value,10)}
类回归设置扩展了React.Component{
renderInput(属性:keyof OrderGraphs,标签:string){
返回(
{label}
this.props.setOrders({[property]:parseInt(e.target.value,10)})
}
min=“1”
max=“10”
步骤=“1”
/>
);
}
render(){
返回(
{this.renderInput(“order_graph_1”,“第一个模型的顺序:”)}
{this.renderInput(“order_graph_2”,“第二个模型的顺序:”)}
);
}
}
我也弄乱了其他部件。我为所有东西添加了Props
和State
类型。我还使用了箭头函数来消除所有的t
interface Orders {
order_graph_1: number;
order_graph_2: number;
}
interface MyProps extends Orders {
setOrders: (...args: any) => void; // function which takes args...??
}
interface MyState extends Orders {
//otherProperty: string;
}
class Setup extends React.Component<MyProps, MyState>{
state = {
// it is best not to derive state from props
order_graph_1: this.props.order_graph_1,
order_graph_2: this.props.order_graph_2
};
// needs to be an arrow function to access `this` properly
// could use ( event: React.ChangeEvent<HTMLInputElement>)
// could avoid the assertion by passing the name as an argument
setOrders = (event: any) => {
// I don't love this solution, but we can avoid the TS errors by copying the previous state
this.setState((prevState) => ({
...prevState,
[event.target.name]: parseInt(event.target.value)
}));
};
render(){
return(
<div className="row">
<div className="col-6">
<p className="text-center">Order of first model: </p>
<div className="w-100 d-flex justify-content-center">
<input className="text-center" name="order_graph_1" type="number" value={this.state.order_graph_1} onChange={this.setOrders.bind(this)} min="1" max="10"/>
</div>
</div>
{/* <div className="col-6">
<p className="text-center">Order of second model: </p>
<div className="w-100 d-flex justify-content-center">
<input className="text-center"name="order_graph_2" type="number" value={this.props.order_graph_2} onChange={this.setOrders.bind(this)} min="1" max="10"/>
</div>
</div> */}
</div>
);
}
}
export default Setup;
<RegressionSetup
order_graph_1={this.state.order_graph_1}
order_graph_2={this.state.order_graph_2}
setOrders={(orders) => this.setState(orders)}
/>
export interface OrderGraphs {
order_graph_1: number;
order_graph_2: number;
}
interface Props extends OrderGraphs {
setOrders(graphs: Partial<OrderGraphs>): void;
}
class RegressionSetup extends React.Component<Props> {
renderInput(property: keyof OrderGraphs, label: string) {
return (
<div className="col-6">
<p className="text-center">{label}</p>
<div className="w-100 d-flex justify-content-center">
<input
className="text-center"
name={property}
type="number"
value={this.props[property]}
onChange={(e) =>
this.props.setOrders({ [property]: parseInt(e.target.value, 10) })
}
min="1"
max="10"
step="1"
/>
</div>
</div>
);
}
render() {
return (
<div className="row">
{this.renderInput("order_graph_1", "Order of first model: ")}
{this.renderInput("order_graph_2", "Order of second model: ")}
</div>
);
}
}