У меня есть родительский компонент с оператором if для отображения двух разных типов кнопок.
Что я делаю, при загрузке страницы я проверяю, возвращает ли API массив с именем lectures
как пустой или с любые значения:
lectures.length > 0 ? show button A : show button B
Это компонент, называемый основным. js, где оператор if:
lectures.length > 0
? <div onClick={() => handleCollapseClick()}>
<SectionCollapse open={open} />
</div>
: <LectureAdd dataSection={dataSection} />
Компонент LectureAdd
отображает знак +
, который откроет модальное окно для создания нового заголовка лекции, а SectionCollapse
покажет стрелку, чтобы показать / скрыть список элементов.
Лог c прост:
1. При загрузке страницы, если lectures.lenght > 0
равно false, мы показываем знак +
, чтобы добавить новую лекцию
ИЛИ
2. Если lectures.lenght > 0
равно true, мы меняем и показываем стрелку коллапса.
Теперь моя проблема возникает, когда я добавляю новую лекцию из дочернего компонента LectureAdd. js
import React from 'react';
import { Form, Field } from 'react-final-form';
// Constants
import { URLS } from '../../../../constants';
// Helpers & Utils
import api from '../../../../helpers/API';
// Material UI Icons
import AddBoxIcon from '@material-ui/icons/AddBox';
export default ({ s }) => {
const [open, setOpen] = React.useState(false);
const [ lucturesData, setLecturesData ] = React.useState(0);
const { t } = useTranslation();
const handleAddLecture = ({ lecture_title }) => {
const data = {
"lecture": {
"title": lecture_title
}
}
return api
.post(URLS.NEW_COURSE_LECTURE(s.id), data)
.then(data => {
if(data.status === 201) {
setLecturesData(lucturesData + 1) <=== this doesn't trigger the parent and the button remains a `+` symbol, instead of changing because now `lectures.length` is 1
}
})
.catch(response => {
console.log(response)
});
}
return (
<>
<Button variant="outlined" color="primary" onClick={handleClickOpen}>
<AddBoxIcon />
</Button>
<Form
onSubmit={event => handleAddLecture(event)}
>
{
({
handleSubmit
}) => (
<form onSubmit={handleSubmit}>
<Field
name='lecture_title'
>
{({ input, meta }) => (
<div className={meta.active ? 'active' : ''}>
<input {...input}
type='text'
className="signup-field-input"
/>
</div>
)}
</Field>
<Button
variant="contained"
color="primary"
type="submit"
>
ADD LECTURE
</Button>
</form>
)}
</Form>
</>
)
}
Я пытался использовать UseEffect для запуска повторного рендеринга на обновление переменной с именем lucturesData
, но она не переопределяет родительский компонент.
Есть идеи? Спасибо Джо