希望您可以澄清此问题:
我有父级组件:
function App() {
const [ thanks, setThanks ] = useState(null);
const thankerHandler=(value)=>{
setThanks(value)
}
**//in the return**
<Route component={PaymentPage} thankerHandler={thankerHandler} path="/payment" />```
和子组件:
const PaymentPage=({thankerHandler})=> {
const [thanks, setThanks] = useState(false);
**//after some logic**
useEffect(() => {
thankerHandler(thanks);
}, [thanks])
问题在于反应告诉了我以下内容:
61 | useEffect(() => {
62 |
> 63 | thankerHandler(thanks);
64 |
65 | }, [thanks])
thankerHandler is not a function
我不知道我在这里做错了什么,想法是当在子组件中调用该函数时,它将更新父组件中的值,但是当我控制台日志时,它没有做任何事情thankerHandler,由于父级中的空状态而只给我提供undefined的值,如果我将其设置为false,则给我false,依此类推,但不会将其识别为函数。
有人知道我在这里做错了吗? 预先感谢
答案 0 :(得分:3)
由于PaymentPage
组件是通过Route
组件呈现的,因此传递给props
组件的Route
不会传递给PaymentPage
组件。
代替使用component
道具来渲染PaymentPage
组件,而使用带有功能的render
道具。它将允许您将props
传递给PaymentPage
组件
更改
<Route component={PaymentPage} thankerHandler={thankerHandler} path="/payment" />
到
<Route
path="/payment"
render={(routerProps) => <PaymentPage {...routerProps} thankerHandler={thankerHandler} />}
/>
除此问题外,PaymentPage
组件中还有另一个问题。
由于useEffect
正在调用thankerHandler
函数,因此应将thankerHandler
添加到useEffect
钩子的依赖项数组中
useEffect(() => {
thankerHandler(thanks);
}, [thanks, thankerHandler]);
但是将thankerHandler
添加到useEffect
钩子的依赖项数组将导致另一个问题,即,当App
组件重新渲染时,thankerHandler
函数将被重新创建并对该新函数的引用将传递给PaymentPage
组件,这将导致useEffect
组件中的PaymentPage
钩子再次运行。这可能不是您想要的东西。如果您不希望这样做,请确保将thankerHanlder
函数包装在useCallback
钩子中,以防止useEffect
钩子不必要地运行。
答案 1 :(得分:0)
尝试在<Route render={() => <PaymentPage thankerHandler={thankerHandler} />} path="/payment" />
组件中使用渲染方法:
//updateUser
AdminUser adminUser = findById();
adminUser.setFirstName(adminUserModel.getFirstName());
adminUser.setLastName(adminUserModel.getLastName());
adminUser.setPassword(PasswordEncoderGenerator.generate(adminUserModel.getPassword()));
adminUser.setUsername(adminUserModel.getUsername());
adminUser.setDateOfBirth(CalendarTools.getDateFromCustomDate(adminUserModel.getDateOfBirth()));
adminUser.setGender(etcItemService.findByIdAndCheckEntity(adminUserModel.getGender_id(), GenderEnum.class,null,true));
adminUser = adminUserRepository.save(adminUser);
//update userAcount For Admin
//call grpcUpdate
this.userAcountStub.grpcUpdate(createRequestModel);
//update UserContact For Admin
//call grpcUpdate
this.userContactStub.grpcUpdate(createRequestModel);
adminUserModel.setId(adminUser.getId());
return adminUserModel;