reactjs - 为子组件传递的函数在带有 Typescript 的 ReactJS 中不起作用
问题描述
我正在将一个函数从父组件传递给子组件,该函数用于更新状态父组件中的值。通行证工作得很好,在子组件中我可以访问该函数,但是当我尝试更改时,当我单击按钮并调用“handleAddClass”函数时,值不会改变。发送到 API 的数据也可以正常工作。
父项中的 h1 {setupProgressTeacher.classesByTeacher} /h1 在子项中更新值时不会更改。
父组件
import React, { useLayoutEffect, useCallback, useState, useContext } from 'react';
import { Container } from './styled';
import Navbar from '../../components/NavBar';
import AddClass from '../TeacherSetup/addclass';
import api from '../../services/api';
interface TeacherSetupState {
classesByTeacher: number;
}
const Dashboard: React.FC = () => {
const [setupProgressTeacher, setSetupProgressTeacher] = useState<TeacherSetupState>(() => {
const classesByTeacher = 1;
return { classesByTeacher } as TeacherSetupState;
});
const updateStateProgress = useCallback((classesByTeacher: number) => {
setSetupProgressTeacher({ classesByTeacher });
}, []);
useLayoutEffect(() => {
async function fetchData() {
const token = localStorage.getItem('@Ensae:token');
const response = await api.get('/class/classbyteacher', {
headers: {
'Authorization': `Bearer ${token}`
}
});
}
fetchData();
}, []);
return (
<Container>
<Navbar />
<h1>{setupProgressTeacher.classesByTeacher}</h1>
<AddClass setProgress={(({ classesByTeacher: any }) => updateStateProgress)} />
{/* <AddSubject /> */}
</Container >
);
};
export default Dashboard;
子组件
import React, { useRef, useCallback } from 'react';
import { Content } from './styled';
import { Form } from '@unform/web';
import api from '../../services/api';
import { SiGoogleclassroom } from 'react-icons/si';
import { FormHandles } from '@unform/core';
import Input from '../../components/Form/input';
import Button from '../../components/Button';
interface AddClassData {
class_name: string;
}
interface TeacherSetupState {
setProgress: ({ classesByTeacher }: { classesByTeacher: any }) => void;
}
const AddClass: React.FC<TeacherSetupState> = (props) => {
const formRef = useRef<FormHandles>(null);
const handleAddClass = useCallback(async (data: AddClassData) => {
const userStoraged = localStorage.getItem('@Ensae:user');
let userObject;
if (typeof userStoraged === 'string') {
userObject = JSON.parse(userStoraged);
}
const dataForApi = {
class_name: data.class_name,
lesson_frequency: "Semanal",
teacher_id: userObject.id,
}
try {
await api.post('/class', dataForApi);
} catch (err) {
}
props.setProgress({ classesByTeacher: 4 });
}, [props]);
return (
<Content>
<h2>Agora que fez o primeiro login, está na hora de criar uma turma</h2>
<Form ref={formRef} onSubmit={handleAddClass}>
<div className="inputClassName" >
<Input name="class_name" className="inputAddClass" icon={SiGoogleclassroom} placeholder="O nome da turma" />
<Button type="submit">Continuar</Button>
</div>
</Form>
</Content>
);
};
export default AddClass;
解决方案
问题是这里的这一行:
<AddClass setProgress={(({ classesByTeacher: any }) => updateStateProgress)} />
setProgress
是一个函数,它接受一个参数,该参数是一个包含classesByTeacher
但不使用该参数的对象。
你想用那个参数打电话。 updateStateProgress
请注意,这({ classesByTeacher: any }) =>
实际上意味着我们将属性的值重命名为在解构它时classesByTeacher
调用的变量any
,而不是我们在注释类型。
<AddClass
setProgress={({ classesByTeacher }) => updateStateProgress(classesByTeacher)}
/>
您也可以只传递updateStateProgess
函数,但您需要相应地更改AddClass
's props 的接口。
推荐阅读
- javascript - Webpack@5 + angularJS + babel: Module parse failed: Unexpected token (2115:9), 没有配置加载器来处理这个文件
- identityserver4 - AddMicrosoftIdentityWebAppAuthentication 阻止其余提供者:如何解决?
- haskell - 如何从元组列表中获取元素列表?
- swift - Vapor 4:如何包括兄弟姐妹,包括数据透视表中的额外属性?
- wordpress - 如何使用带有 Timber/Twig 的 ACF 选项页面字段在 WordPress 中输出有效的 [短代码]
- azure - 如何将“systemProperties”添加到 IOT Central 消息
- redux - 我需要等待异步 Redux Thunk(不是 Promise)吗?
- python - Kivy-ios 上的 PYTHON_EGG_CACHE
- excel - 将 imageMSO 添加到自定义功能区组
- nlp - 将信息连接到特征向量时如何使用预训练模型