reactjs - 在 React-Hooks 的 useRef 中我无法获取新的状态值
我正在使用 react-hooks 尝试 useref,但当我调用 setAccountVal 方法时,虽然子组件的状态发生了变化,但当我 alert 值时,它仍然是 "Ege"。你对这种情况有什么想法吗?
import React, { useState, useRef, useImperativeHandle, useEffect, forwardRef } from "react";
interface A {
name?: string;
}
const Child = forwardRef((props: A, ref) => {
const [acc, setAcc] = useState("Ege");
useImperativeHandle(ref, () => ({
getAlert(value: string) {
alert("getAlert from Child===>" + value);
},
setAccountVal(val: string) {
setAcc(val);
},
acc
}));
useEffect(
() => {
debugger;
setAcc(props.name || "dummy");
console.log(acc + " --");
},
[props.name]
);
const changeState = (e:React.FormEvent<HTMLInputElement>)=>{
setAcc(e.currentTarget.value);
}
return <input onChange={changeState}></input>;
})
function App() {
let [name, setName] = useState("Nate");
let nameRef = useRef<any>(null);
const submitButton = () => {
debugger;
const comp = nameRef.current;
comp.setAccountVal("Mahmut");
comp.getAlert(comp.acc);
};
return (
<div className="App">
<p>{name}</p>
<div>
<button type="button" onClick={submitButton}>
Submit
</button>
<Child ref={nameRef} />
</div>
</div>
);
}
export default App;
当我调用一个普通方法时,我可以看到我想要的结果。但问题是,我可以在 acc 状态上看到新的状态值,但当我从父组件获取它时,它显示的是旧的(实际上是初始状态值("Ege"))状态值。
编辑:实际上我想做的是下面的内容
//Child component with forwardRef
const [account, setAccount] = useState("defaultAccount");
const [branch, setBranch] = useState("defaultBranch");
const [person, setPerson] = useState("defaultPerson");
useImperativeHandle(ref, () => ({
selectedAccount: account,
selectedBranch: branch,
selectedPerson: person
}));
//Parent component
const childComponentRef = useRef(null);
//Is it possible to change child component's state? Is it allowed?
childComponentRef.current.selectedAccount = "new account";
childComponentRef.current.selectedBranch = "new branch";
childComponentRef.current.selectedPerson = "new person";
alert(childComponentRef.current.selectedAccount);
alert(childComponentRef.current.selectedBranch);
alert(childComponentRef.current.selectedPerson);
//We can change these variables but child component does not rerender with new values.
好!我找到了方法。现在当我使用带有 getter 和 setter 的 ref 变量时,我也可以通过 useRef 设置和获取当前值了!!
//Child component with forwardRef
const [account, setAccount] = useState("defaultAccount");
const [branch, setBranch] = useState("defaultBranch");
const [person, setPerson] = useState("defaultPerson");
useImperativeHandle(ref, () => ({
**get account(){
return account;
},
set account(val : string){
setAccount(val);
},**
selectedBranch: branch,
selectedPerson: person
}));
//Parent component
const childComponentRef = useRef(null);
//Is it possible to change child component's state? Is it allowed?
childComponentRef.current.selectedAccount = "new account";
childComponentRef.current.selectedBranch = "new branch";
childComponentRef.current.selectedPerson = "new person";
alert(childComponentRef.current.selectedAccount);
alert(childComponentRef.current.selectedBranch);
alert(childComponentRef.current.selectedPerson);
//We can change these variables but child component does not rerender with new values
详细演示:
.
答案#1
这是因为你在使用 useImperativeHandle 时没有设置任何输入,所以函数从未更新。只需将 acc 添加为输入,它就会起作用:
useImperativeHandle(ref, () => ({
getAlert(value: string) {
alert("getAlert from Child===>" + value);
},
setAccountVal(val: string) {
setAcc(val);
},
acc
}), [acc]);