Mayank是正确的。
创建一个名为“text”(或您选择的其他名称)的变量,并将其放在“Next”位置。
state = {
text: "Next"
}
changeText = (text) => {
this.setState({ text });
}
render() {
const { text } = this.state
return (
<Button
onClick={ () => { this.changeText("newtext")} }> {text} </Button> )...etc
注意: 点击时此方法将始终更改文本为 "newtext"。您也可以传递变量来使其更加动态。
希望这有所帮助。
更新: 刚刚看到Mayank的评论。那段代码基本上就是我所拥有的。一个提示是您不再需要构造函数,也不必再绑定您的方法。
更新:React Hooks
相同的事情,但使用 useState
hook。 我正在使用 buttonText
而不是将状态变量称为 text
以更明确地表示。 更新后的版本如下:
import { useState } from 'React';
const [buttonText, setButtonText] = useState("Next");
const changeText = (text) => setButtonText(text);
return (
<Button onClick={() => changeText("newText")}>{buttonText}</Button>
)
您可以完全省略
changeText
函数,只留下这个:
return (
<Button onClick={() => setButtonText("newText")}>{buttonText}</Button>
)
更新: 如何添加setTimeout
为了回答评论中的问题,我们做了一些更新:“如果我想在1秒后使用setTimout将按钮文本恢复到以前的文本,我应该在哪里添加?”
以下有两种方式:将setTimeout
添加到changeText
函数中或创建一个依赖于buttonText
的效果。
改变文本
你可以直接在这个函数中加入setTimeout。
从这个状态开始:
const changeText = (text) => setButtonText(text);
对于这个
const initialState = "Next";
const [buttonText, setButtonText] = useState(initialState);
const changeText = (text) => {
setButtonText(text);
setTimeout(() => setButtonText(initialState), [1000])
}
我们添加了initialState
变量作为常量来跟踪“先前的文本”。由于它不应该改变,我们可以像const INITIAL_STATE
这样定义它,但是选择权在你。
useEffect
我们仍然需要定义initialState
变量,以便我们可以跟踪原始值。然后,我们可以创建一个useEffect
,这是一个React钩子,允许您“hook”到变量的更改中(只是useEffect
的一部分,足以让我们开始这里)。
我们可以将该效果分解为两个基本部分:效果的主体或回调 - 当效果运行时我们要做什么,以及依赖项或触发效果运行的内容。在这种情况下,我们的回调函数将是setTimeout
并在超时内设置按钮文字,我们的buttonText
将触发该效果。
这就是效果:
useEffect(() => {
if(buttonText !== initialState){
setTimeout(() => setButtonText(initialState), [1000])
}
}, [buttonText])
每当状态变量buttonText
发生变化时,这个 effect 就会运行。我们从以下位置开始:
buttonText = initialState
该效果运行并检查if
。由于buttonText
等于初始状态,条件求值为false
,我们终止回调和效果。
当用户点击按钮时,changeText
执行并设置buttonText
状态,更新触发效果的变量。现在我们再次运行if
检查,这次通过,因此我们执行setTimeout
。
在超时内部,我们正在设置状态,因此效果再次运行,并且这次失败,因为我们刚刚将状态更改回initialState
。
我建议在那里抛出一个调试器或一些日志来跟踪轨迹
冗长的解释。以下是使用效果方法的整个组件的外观。
import React, { useState, useEffect } from "react";
const FancyButton = () => {
const initialState = "Next";
const [buttonText, setButtonText] = useState("Next");
useEffect(() => {
if(buttonText !== initialState){
setTimeout(() => setButtonText(initialState), [1000])
}
}, [buttonText])
const changeText = (text) => setButtonText(text);
return (
<button type="button" onClick={() => changeText("newText")}>{buttonText}</button>
)
};
我在按钮上添加了"type",因为这是一个好的做法。并将“Button”更改为“button”。你可以在那里使用任何组件,这样复制和粘贴更为方便。