React - 即使屏幕上打印的消息发生变化,class 组件中的状态也不会更新
React - state doesn't update in class component even though the message printed on the screen changes
我有一个包含输入的 App 组件。每次我输入输入时,输入的值都会更新,并且 Message 组件会打印不同的消息,具体取决于输入的长度。同时,名为 Character 的第三个组件将字符串的每个字母单独打印到屏幕上。期望的行为是,当我单击其中一个字母时,它会从字符串中删除,新字符串显示在屏幕上,输入也会更新为新字符串。
我使用了一些 console.logs 进行调试,一切似乎都按预期进行,直到我尝试更新状态的最后一步,但由于某种原因,它没有得到更新。
class App extends React.Component {
constructor(props) {
super(props);
this.state = { text: "" };
}
render() {
const handleUpdateText = event => {
this.setState({
text: event.target.value
});
};
const inputLength = this.state.text.length;
const toArray = this.state.text.split("");
const handleDeleteLetter = index => {
toArray.splice(index, 1);
console.log(toArray);
const updatedArray = toArray.join("");
console.log(updatedArray);
this.setState({ text: updatedArray });
console.log(this.state.text);
};
return (
<>
<input type="text" onChange={handleUpdateText} />
<Message inputLength={inputLength} />
{toArray.map((letter, index) => (
<Character
key={index}
theLetter={letter}
deleteLetter={() => handleDeleteLetter(index)}
/>
))}
</>
);
}
}
class Message extends React.Component {
render() {
const { inputLength } = this.props;
let codeToPrint = "The text is long enough!";
if (inputLength <= 5) {
codeToPrint = "The text is not long enough!";
}
return <p>{codeToPrint}</p>;
}
}
class Character extends React.Component {
render() {
const { theLetter, deleteLetter } = this.props;
return (
<div
style={{
display: "inline-block",
padding: "16px",
textAlign: "center",
margin: "16px",
backgroundColor: "tomato"
}}
onClick={deleteLetter}
>
{theLetter}
</div>
);
}
}
完整代码在这里:
我真的不明白我做错了什么,我觉得这与生命周期方法有某种关系。任何答案都可能有所帮助。谢谢。
状态正在更新,您只需要将 value
prop 传递给输入,以便输入的值可以与您的状态同步
<input type="text" value={this.state.text} onChange={handleUpdateText} />
并且您在设置后看不到更新的状态,因为 setState
是异步的。这就是 setState
语句之后的 console
语句显示先前值的原因。
您还应该将函数移出渲染方法,因为每次组件重新渲染时,都会创建新函数。您可以将它们声明为 class 属性并传递它们的引用
handleUpdateText = event => {
this.setState({
text: event.target.value
});
};
render() {
.......
return (
<>
<input type="text" onChange={this.handleUpdateText} />
我有一个包含输入的 App 组件。每次我输入输入时,输入的值都会更新,并且 Message 组件会打印不同的消息,具体取决于输入的长度。同时,名为 Character 的第三个组件将字符串的每个字母单独打印到屏幕上。期望的行为是,当我单击其中一个字母时,它会从字符串中删除,新字符串显示在屏幕上,输入也会更新为新字符串。
我使用了一些 console.logs 进行调试,一切似乎都按预期进行,直到我尝试更新状态的最后一步,但由于某种原因,它没有得到更新。
class App extends React.Component {
constructor(props) {
super(props);
this.state = { text: "" };
}
render() {
const handleUpdateText = event => {
this.setState({
text: event.target.value
});
};
const inputLength = this.state.text.length;
const toArray = this.state.text.split("");
const handleDeleteLetter = index => {
toArray.splice(index, 1);
console.log(toArray);
const updatedArray = toArray.join("");
console.log(updatedArray);
this.setState({ text: updatedArray });
console.log(this.state.text);
};
return (
<>
<input type="text" onChange={handleUpdateText} />
<Message inputLength={inputLength} />
{toArray.map((letter, index) => (
<Character
key={index}
theLetter={letter}
deleteLetter={() => handleDeleteLetter(index)}
/>
))}
</>
);
}
}
class Message extends React.Component {
render() {
const { inputLength } = this.props;
let codeToPrint = "The text is long enough!";
if (inputLength <= 5) {
codeToPrint = "The text is not long enough!";
}
return <p>{codeToPrint}</p>;
}
}
class Character extends React.Component {
render() {
const { theLetter, deleteLetter } = this.props;
return (
<div
style={{
display: "inline-block",
padding: "16px",
textAlign: "center",
margin: "16px",
backgroundColor: "tomato"
}}
onClick={deleteLetter}
>
{theLetter}
</div>
);
}
}
完整代码在这里:
我真的不明白我做错了什么,我觉得这与生命周期方法有某种关系。任何答案都可能有所帮助。谢谢。
状态正在更新,您只需要将 value
prop 传递给输入,以便输入的值可以与您的状态同步
<input type="text" value={this.state.text} onChange={handleUpdateText} />
并且您在设置后看不到更新的状态,因为 setState
是异步的。这就是 setState
语句之后的 console
语句显示先前值的原因。
您还应该将函数移出渲染方法,因为每次组件重新渲染时,都会创建新函数。您可以将它们声明为 class 属性并传递它们的引用
handleUpdateText = event => {
this.setState({
text: event.target.value
});
};
render() {
.......
return (
<>
<input type="text" onChange={this.handleUpdateText} />