我是打字稿的新手。我需要得到的子状态值的父使用ref上的按钮点击更新的减速器值。
我已尝试将ref
传递给孩子,但我得到的错误与此类似:
类型{value:string;onChange:Dispatch
属性“ref”不存在于类型“IntrinsicatAttributes”上
父组件
import React, from "react";
import styled from "styled-components";
import {
Page,
Welcome,
ErrorBoundary
} from "components";
const ParentDiv = styled.div`
margin: 0 410px 30px 15px;
`;
export const CreateEvent = (props: any) => {
return (
<Page title='Dashboard'>
<ErrorBoundary>
{(() => {
switch (activeEventStage?.step) {
case 1:
return (
<ErrorBoundary>
<Welcome />
</ErrorBoundary>
);
default:
return null;
}
})()}
</ErrorBoundary>
</Page>
);
};
export default withRouter(CreateEvent);
子组件
import React, { useState } from "react";
import { Row, Col } from "react-bootstrap";
export const Welcome = () => {
const { t } = useTranslation();
const [state, setState] = useState({
welBannerTagline: "",
welHeroTitle: "",
});
return (
<CreateEventFormContainer
title={t("event.create.title")}
subTitile={t("welcome.subTitle")}
>
<>
<Row>
<Col lg='6'>
<DropZoneInputField
titleName={t("welcome.bgImage.title")}
onSelectedFiles={onDropFiles}
imageType='bgImage'
value={state.welBgFilename}
/>
</Col>
<Col lg='6'>
<DropZoneInputField
titleName={t("welcome.banner.title")}
onSelectedFiles={onDropFiles}
imageType='bannerImage'
value={state.welBannerFilname}
/>
</Col>
</Row>
</>
</CreateEventFormContainer>
);
};
export default Welcome;
一种更简单的方法是使用内置在React中的useRef
钩子与保留的ref
prop进行交互。它只适用于可变对象,因此您不必担心自己键入它。
import { useRef } from "react";
export const CreateEvent = (props: any) => {
const welcomeRef = useRef();
return (
<Page title='Dashboard'>
<ErrorBoundary>
{(() => {
switch (activeEventStage?.step) {
case 1:
return (
<ErrorBoundary>
<Welcome ref={welcomeRef} />
</ErrorBoundary>
);
default:
return null;
}
})()}
</ErrorBoundary>
</Page>
);
};
export default withRouter(CreateEvent);
您会出现这个错误,因为欢迎
不是为接受ref
prop而设计的。
ref
是React中的保留道具名称,因此为了将道具ref
传递给子组件,该子组件必须使用React。forwardRef
接受ref
prop。
您可以使用任何其他道具名称直接传递ref对象,例如myRef
。在这种情况下,您不需要使用forwardRef
,但需要确保孩子的道具接受一个道具myRef
,它是一个ref。
ref本身的类型取决于它最终连接到DOM的位置。可能是一个HTMLButtonElement
?
interface WelcomeProps {
myRef: React.MutableRefObject<HTMLButtonElement | null>;
}
export const Welcome = ({myRef}: WelcomeProps) => {
...
export const CreateEvent = (props: RouteComponentProps) => {
const refObject = React.useRef<HTMLButtonElement | null>(null);
return (
...
<Welcome myRef={refObject}/>
...
这允许您与DOM交互。但这似乎不是你真正想要做的。
我需要得到的子状态值的父使用ref上的按钮点击更新的减速器值。
给我回个电话!该状态甚至应该存储在子级中,还是可以将其提升到父级?
interface CallbackValue {
// what properties does the callback want to receive?
welBannerTagline: string;
welHeroTitle: string;
}
interface WelcomeProps {
myCallback: (value: CallbackValue) => void;
}
export const Welcome = ({myCallback}: WelcomeProps) => {
const [state, setState] = useState({
welBannerTagline: "",
welHeroTitle: "",
});
const handleEvent = () => {
myCallback(state);
}
...
export const CreateEvent = (props: RouteComponentProps) => {
return (
...
<Welcome myCallback={(value) => {
// do something here with the value
}} />
...
我有一个类组件,它返回使用Redux存储完全填充的状态: 但是,当我将上面的类组件切换到下面的功能组件,以便可以在代码中使用ReactJS钩子时,状态始终为空。
我试图了解如何构建具有不同"页面"或"视图"的ReactJS应用程序。 我将以下组件作为我的基础应用程序,并且我正在React状态中使用currentState属性在视图中的活动组件之间切换。 它执行此任务,但在启动dataLoaded回调时,组件从不接收更新的recipes数组。 如何根据应用程序中的更新状态更新道具? 还是我处理这整件事的方式错了?
这两个是等价的吗?如果不是,哪一个是最好的,为什么?
我想用React useState钩子设置多个状态值,这样我就可以用useEffect钩子分别更新它们。我有以下代码: 但是当我用React DevTools检查应用程序时,我会看到钩子的多个“状态”值,而不是“订单”、“支付”、“提交”等。
我还是ReactJs的初学者。实际上我想重写我的类组件来钩住组件,但是我的代码有一部分有问题。有人能帮我把这个组件重写成钩子吗? 这是我的代码:
我是reactjs的新手,我不知道如何从父组件中更改子组件的状态。下面是代码 每当对父组件中的执行时,我希望子组件接收。 有什么建议吗?