Поднятие состояния до основного компонента в приложении React с помощью хуков

Я изучаю реакцию и пытаюсь реализовать небольшие вещи для практики. Идея проста: добавлять записи (feedbackTasks) в базу данных и перечислять эти записи (при первой загрузке страницы и позже при добавлении новой записи). Пожалуйста, смотрите изображение ниже.

Поднятие состояния до основного компонента в приложении React с помощью хуков

Главный компонент — ManageFeedbackTasks. Я сохраняю список feedbackTask элементов в его состоянии (st_feedbackTaskList). Обновление этого списка осуществляется через функцию add_to_st_feedbackTask. Если этот список генерируется в первый раз, все извлеченные данные (поступающие из компонента PrintFeedbackTasks) устанавливаются в st_feedbackTaskList. Если нет, в список вставляется только добавленный элемент (поступивший из ShowAddingFeedbackTaskForm).

export function ManageFeedbackTasks() {
    const [st_feedbackTaskList, setFeedbackTaskList] = useState([]);

    const add_to_st_feedbackTask = (data) => {

        if (st_feedbackTaskList.length == 0) {
            setFeedbackTaskList(data);
        } else {
            const { id, title, description } = data;
            setFeedbackTaskList([...st_feedbackTaskList, { id, title, description }]);
        }
    }

    return (
        <>
            <ShowAddingFeedbackTaskForm onAddingItem = {add_to_st_feedbackTask} />
            <PrintFeedbackTasks onListingFeedbackTasks = {add_to_st_feedbackTask} feedbackTasks = {st_feedbackTaskList} />
        </>
    );
}

Ниже представлена ​​функция PrintFeedbackTasks. Эта функция получает список feedbackTasks от основного компонента ManageFeedbackTasks. Этот список впервые извлекается из базы данных с помощью fetchFeedbackTasks. Внутри fetchFeedbackTasksprops.onListingFeedbackTasks(response.data) отправляет полученный список обратно в основной компонент для обновления состояния (st_feedbackTaskList).

const PrintFeedbackTasks = (props) => {    
    const [st_isInitialized, setInitialized] = useState(false);    

    const fetchFeedbackTasks = () => {
        axios.get('api/FeedbackTask/Index')
            .then(response => props.onListingFeedbackTasks(response.data))
            .catch(error => console.info(error));
    }    

    useEffect(() => {
        if (!st_isInitialized) {
            fetchFeedbackTasks();
        }
        setInitialized(true);
    });

    return (
        <React.Fragment>
           {
                props.feedbackTasks.map(taskItem =>....
           }
        </React.Fragment>
    );
}

Компонент ниже отображает форму добавления и обрабатывает отправку формы. Когда добавляется новый элемент, этот новый элемент снова отправляется обратно в основной компонент с помощью props.onAddingItem.

const ShowAddingFeedbackTaskForm = (props) => {
    const [st_title, setTitle] = useState('');
    const [st_description, setDescription] = useState('');

    const handleSubmit = async (event) => {
        event.preventDefault();
        await axios(...)
        .then(function (response) {
                setTitle('');
                setDescription('');

            //This will update the list of the feedback task in the main component
                props.onAddingItem({
                   id: response.data,
                   title: st_title,
                   description: st_description
                });

            //GET THE ID HERE
            console.info(response.data);

        }).catch(function (error) {
            console.info(error);
        });
    }


    return (
        <form onSubmit = {handleSubmit}>
            <input
                placeholder = "Title..."
                type = "text"
                value = {st_title}
                onChange = {(event) => setTitle(event.target.value)}
            />
            <input
                placeholder = "Description..."
                type = "text"
                value = {st_description}
                onChange = {(event) => setDescription(event.target.value)}
            />
            <button>Add Feedback Task</button>
        </form>
    );
}

Интересно, надежен ли этот способ поднятия состояния и управления им? Есть предложения по улучшению кода? Кроме того, мне интересно, следует ли размещать эти компоненты на своих собственных страницах (например, одну страницу или добавление записи, а другую для листинга). Будет ли это иметь больше смысла в react мире?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
606
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Идея поднять состояние до родителя правильная. Однако из-за структуры вашего кода вы можете вызвать много повторных рендеров, и в вашем решении можно сделать несколько оптимизаций производительности. Еще одна вещь заключается в том, что вместо того, чтобы получать FeedbackTasks в компоненте PrintFeedbackTasks, вы должны делать это в самом родителе. Также useEffect принимает второй параметр, который вы можете использовать для его выполнения при начальном монтировании.

Вы также можете использовать хук useCallback для запоминания функций.

Управление задачами обратной связи

export function ManageFeedbackTasks() {
    const [st_feedbackTaskList, setFeedbackTaskList] = useState([]);

    const fetchFeedbackTasks = useCallback(() => {
        axios.get('api/FeedbackTask/Index')
            .then(response => props.onListingFeedbackTasks(response.data))
            .catch(error => console.info(error));
    }, []);    

    useEffect(() => {
        fetchFeedbackTasks();
    }, []);

    const add_to_st_feedbackTask = useCallback((data) => {

        setFeedbackTaskList(prevTaskList => {
          if (prevTaskList.length == 0) {
            return data;
          } else {
            const { id, title, description } = data;
            return [...prevTaskList, { id, title, description }];
          }
        });
    }, [])

    return (
        <>
            <ShowAddingFeedbackTaskForm onAddingItem = {add_to_st_feedbackTask} />
            <PrintFeedbackTasks onListingFeedbackTasks = {add_to_st_feedbackTask} feedbackTasks = {st_feedbackTaskList} />
        </>
    );
}

PrintFeedbackTasks

const PrintFeedbackTasks = (props) => {    

    return (
        <React.Fragment>
           {
                props.feedbackTasks.map(taskItem =>....
           }
        </React.Fragment>
    );
}

Что касается идеи разделения показа и обновления TaskList, то это как продуктовое решение, которое может быть принято в зависимости от того, насколько длинный список полей, которые пользователь должен заполнить сразу

Другие вопросы по теме