reactjs - 如何在渲染组件之前正确获得新的反应状态?
问题描述
如果答案很明显,我很抱歉。我可能错过了一个模式来做到这一点......
我有这种架构(当然更复杂):一个组件(这里是一个按钮)必须同时调用一个函数并设置一个状态。
当然,这个例子不起作用,因为在调用函数word
之前没有定义要显示的状态。speak()
做这个的最好方式是什么 ?
const Speaker = () => {
const [word, setWord]= useState ("nothing")
const speak = () => {
console.log(word)
...
}
const speakDirectly = () => {
setWord("hello")
speak() // say "nothing" instead of "hello"
}
const prepareWord = (wordToPrepare) => {
setWord(wordToPrepare)
}
return (
<>
<p>Thinking word : {word} </p>
<button onClick={() =>prepareWord('Goodbye')} >Prepare to say "Goodbye"</button>
<button onClick={() =>prepareWord('Goodnight')} >Prepare to say "Goodnight"</button>
----
<button onClick={() =>speak()} >Say Hello</button>
<button onClick={() =>speakDirectly('hello')} >Say Hello</button>
</>
)
}
是否存在解决 React 中这种行为的模式?
我想避免像这样更新我的功能
const Speaker = () => {
const [word, setWord]= useState ("nothing")
const speak = (directWord) => {
let wordToSay = directWord || word
console.log(word)
...
}
const speakDirectly = (directWord) => {
setWord(directWord)
speak(directWord)
}
...
解决方案
你可以做这样的事情。为你的话语和你的直接话语设定一个状态。使用直接词的效果在更新时触发朗读,但在点击时为您准备好的词调用朗读。
const Speaker = () => {
const [preparedWord, setPreparedWord]= useState();
const [directWord, setDirectWord]= useState();
const speak = (word) => {
console.log(word)
...
}
useEffect(() => directWord && speak(directWord), [directWord]);
return (
<>
<p>Thinking word : {preparedWord} </p>
<button onClick={() => setPreparedWord('Goodbye')} >Prepare to say "Goodbye"</button>
<button onClick={() => setPreparedWord('Goodnight')} >Prepare to say "Goodnight"</button>
----
<button onClick={() => speak(preparedWord)} >Speak</button>
<button onClick={() => setDirectWord('hello')} >Say Hello</button>
</>
)
}
更新
在考虑了一秒钟之后,除非您需要直接词处于您的状态,否则您也可以摆脱该部分并在将其传递给函数时调用它。
const Speaker = () => {
const [preparedWord, setPreparedWord]= useState();
const speak = (word) => {
console.log(word)
...
}
return (
<>
<p>Thinking word : {preparedWord} </p>
<button onClick={() => setPreparedWord('Goodbye')} >Prepare to say "Goodbye"</button>
<button onClick={() => setPreparedWord('Goodnight')} >Prepare to say "Goodnight"</button>
----
<button onClick={() => speak(preparedWord)} >Speak</button>
<button onClick={() => speak('hello')} >Say Hello</button>
</>
)
}
推荐阅读
- c - 谁定义了栈指针地址
- c# - 我的部分视图未从我所在区域内的正确文件位置加载
- typescript - 键入一个方法,该方法返回一个具有此属性的对象?
- angular - 为什么在使用 FormBuilder 重置表单时出现验证错误?
- python - 来自生成器的张量流数据集
- bash - 将数字输入 mkdir
- javascript - 导入的函数在 render() 下不起作用
- javascript - Javascript 正则表达式只允许最多 10 位的数字,不允许使用字符串和特殊字符
- node.js - 无法在 expo-react-native 应用程序上运行“expo start”,权限问题
- delphi - 如何在 paslibvlc 视频播放器中禁用活动音轨