React JS:在父组件中调用子组件方法(React with typescript)
React JS : Calling Child component method within parent component (React with typescript)
我正在尝试创建一个自定义数字选择器组件,并尝试将其添加到需要的组件中。但是当我试图在 Parent 组件中获取数字选择器值时,我得到的是旧值。
有人可以帮我解决这个问题吗?
号码选择器组件
import * as React from "react";
interface IState {
value: number;
}
interface IProps {
setValue(val: number): void;
}
class NumberPicker extends React.Component<IProps, IState> {
constructor(props: any) {
super(props);
this.state = {
value: 0
};
}
public doDecrement = () =>
// DECREMENT CODE
{
if (this.state.value < 1) {
console.log("LESS THAN O");
} else {
this.setState({
value: this.state.value - 1
});
this.props.setValue(this.state.value);
}
};
public doIncrement = () =>
// INCREMENT CODE
{
this.setState({
value: this.state.value + 1
});
this.props.setValue(this.state.value);
};
public handleChange = (
e: React.ChangeEvent<HTMLInputElement> // CHANGE HANDLER
) => {
const val = parseInt(e.target.value);
this.setState({ value: val });
};
public render() {
return (
<div>
<button
onClick={this.doDecrement}
className="fa fa-minus fa-inverse fa-2x"
/>
<input
type="text"
className="number"
value={this.state.value}
onChange={this.handleChange}
/>
<button
onClick={this.doIncrement}
className="fa fa-plus fa-inverse fa-2x"
/>
</div>
);
}
}
export default NumberPicker;
父组件代码
import * as React from "react";
import NumberPicker from "./NumberPicker";
interface IState {
val: number;
}
interface IProps {}
class Parent extends React.Component<IProps, IState> {
constructor(props: any) {
super(props);
this.state = {
val: 0
};
}
handleVal = (value: number) => {
this.setState({ val: value }, () => console.log(this.state.val));
};
render() {
return (
//Some fields along with the below numberpicker
<NumberPicker setValue={this.handleVal} />
);
}
}
export default Parent;
我也尝试过使用 setState 的回调函数,但似乎不起作用。父组件总是显示较旧的 value.How 我会得到父组件中 NumberPicker 的更新值吗?
帮助将不胜感激!
React 的 setState
是异步的,因此 this.props.setValue
函数将在 setState
更新子 Numberpicker 组件中的状态之前被调用。这就是将旧值传递给父组件的原因。
相反,您可以在 setState
的回调函数中调用 this.props.setValue
。
public doIncrement = () =>
// INCREMENT CODE
{
this.setState({
value: this.state.value + 1
}, () => {
this.props.setValue(this.state.value);
});
};
public doDecrement = () =>
// DECREMENT CODE
{
if (this.state.value < 1) {
console.log("LESS THAN O");
} else {
this.setState({
value: this.state.value - 1
}, () => {
this.props.setValue(this.state.value);
});
}
};
setState 不是同步函数。因此,当您从父级调用回调时,您将使用旧状态值调用它,因为将来某个时候会设置新值。您可以使用设置为状态的相同值调用回调:this.state.value - 1 或 this.state.value + 1。它应该按预期工作。我还建议阅读 thinking in react 以更好地了解应该在何处保持状态。
不要在回调中使用状态传递值,你可以这样做:-
handleChange = (
e: React.ChangeEvent<HTMLInputElement> // CHANGE HANDLER
) => {
const val = parseInt(e.target.value);
// this.setState({ value: val });
this.props.setValue(val);
};
希望对您有所帮助!
我正在尝试创建一个自定义数字选择器组件,并尝试将其添加到需要的组件中。但是当我试图在 Parent 组件中获取数字选择器值时,我得到的是旧值。 有人可以帮我解决这个问题吗?
号码选择器组件
import * as React from "react";
interface IState {
value: number;
}
interface IProps {
setValue(val: number): void;
}
class NumberPicker extends React.Component<IProps, IState> {
constructor(props: any) {
super(props);
this.state = {
value: 0
};
}
public doDecrement = () =>
// DECREMENT CODE
{
if (this.state.value < 1) {
console.log("LESS THAN O");
} else {
this.setState({
value: this.state.value - 1
});
this.props.setValue(this.state.value);
}
};
public doIncrement = () =>
// INCREMENT CODE
{
this.setState({
value: this.state.value + 1
});
this.props.setValue(this.state.value);
};
public handleChange = (
e: React.ChangeEvent<HTMLInputElement> // CHANGE HANDLER
) => {
const val = parseInt(e.target.value);
this.setState({ value: val });
};
public render() {
return (
<div>
<button
onClick={this.doDecrement}
className="fa fa-minus fa-inverse fa-2x"
/>
<input
type="text"
className="number"
value={this.state.value}
onChange={this.handleChange}
/>
<button
onClick={this.doIncrement}
className="fa fa-plus fa-inverse fa-2x"
/>
</div>
);
}
}
export default NumberPicker;
父组件代码
import * as React from "react";
import NumberPicker from "./NumberPicker";
interface IState {
val: number;
}
interface IProps {}
class Parent extends React.Component<IProps, IState> {
constructor(props: any) {
super(props);
this.state = {
val: 0
};
}
handleVal = (value: number) => {
this.setState({ val: value }, () => console.log(this.state.val));
};
render() {
return (
//Some fields along with the below numberpicker
<NumberPicker setValue={this.handleVal} />
);
}
}
export default Parent;
我也尝试过使用 setState 的回调函数,但似乎不起作用。父组件总是显示较旧的 value.How 我会得到父组件中 NumberPicker 的更新值吗? 帮助将不胜感激!
React 的 setState
是异步的,因此 this.props.setValue
函数将在 setState
更新子 Numberpicker 组件中的状态之前被调用。这就是将旧值传递给父组件的原因。
相反,您可以在 setState
的回调函数中调用 this.props.setValue
。
public doIncrement = () =>
// INCREMENT CODE
{
this.setState({
value: this.state.value + 1
}, () => {
this.props.setValue(this.state.value);
});
};
public doDecrement = () =>
// DECREMENT CODE
{
if (this.state.value < 1) {
console.log("LESS THAN O");
} else {
this.setState({
value: this.state.value - 1
}, () => {
this.props.setValue(this.state.value);
});
}
};
setState 不是同步函数。因此,当您从父级调用回调时,您将使用旧状态值调用它,因为将来某个时候会设置新值。您可以使用设置为状态的相同值调用回调:this.state.value - 1 或 this.state.value + 1。它应该按预期工作。我还建议阅读 thinking in react 以更好地了解应该在何处保持状态。
不要在回调中使用状态传递值,你可以这样做:-
handleChange = (
e: React.ChangeEvent<HTMLInputElement> // CHANGE HANDLER
) => {
const val = parseInt(e.target.value);
// this.setState({ value: val });
this.props.setValue(val);
};
希望对您有所帮助!