React tabulator ref становится нулевым при повторном рендеринге

Я использую Tabulator с React, используя модуль react-tabulator.

Я использовал «ref» для компонента таблицы и вызывал такие действия, как загрузка данных или что-то еще.

import React, { Suspense, useEffect, useReducer, useRef } from 'react';
import PropTypes from 'prop-types';

import "react-tabulator/lib/styles.css"; // default theme
import "react-tabulator/css/tabulator_midnight.min.css";

import {Button } from 'react-bootstrap';
import { ReactTabulator, reactFormatter } from "react-tabulator";
import { reducer } from '../common/reducer';
import ChangeStaffCompetency from './ChangeStaffCompetency';
import * as jsPDF from 'jspdf';
import 'jspdf-autotable';
window.jspdf = jsPDF;

const luxon = require('luxon');
window.DateTime = luxon.DateTime;

// Initial states of StaffCompetency
const initialState = {
    changeStaffCompetencyShow: false,
    staffID: "",
    workflowName: "",
    competentTasks: "",
    competencyEditorRow: null,
};

const StaffCompetency = (props) => {

    // State Handling
    const [state, dispatch] = useReducer(reducer, initialState);
    
    // Reference for the tabulator
    let staffCompetencyTableRef = useRef(null);

    // Action to download workloads data as 'JSON'
    const downloadAsJSON = () => {
        staffCompetencyTableRef.current.download("json", "RTP_Staff_Competencies.json");
    }

    /***
     * ALL OTHER CODE
     */

    return (
        <>
            <h3 className = "text-center"> Staff Competency </h3>
            <div>
                <Button variant = "dark" onClick = {() => downloadAsJSON()}>Download JSON</Button>{' '}
            </div>
            <div style = {{clear: 'both'}}></div>
            <br></br>
            <ReactTabulator
                onRef = {(r) => (staffCompetencyTableRef = r)}
                columns = {staffCompetencyTableCoumns}
                options = {staffCompetencyTableOptions}
            />
            <ChangeStaffCompetency
                show = {state.changeStaffCompetencyShow}
                onHide = {() => dispatch({ type: "changeStaffCompetencyShow", value: false })}
                staffID= {state.staffID}
                workflowName= {state.workflowName}
                competentTasks= {state.competentTasks}
                api = {props.api}
                parentCallback = {handleCallback}
            />
        </>
        
    );
}

StaffCompetency.propTypes = {
    api: PropTypes.object.isRequired
};

export default StaffCompetency;

ChangeStaffCompetency — это модальный компонент react-bootstrap, который используется в качестве пользовательского редактора для редактирования содержимого ячейки.

staffCompetencyTableRef отлично работает на первом рендере, но становится null при повторном рендеринге; например, когда я открываю и закрываю модальное окно ChangeStaffCompetency.

Как бы я решил это?

Спасибо

Поведение ключевого слова "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) для оценки ваших знаний,...
0
0
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я решил проблему, изменив тип моей переменной useRef (staffCompetencyTableRef) на const и использовал свойство переменных const для выполнения своей работы.

const StaffCompetency = (props) => {

    // State Handling
    const [state, dispatch] = useReducer(reducer, initialState);
    
    // Reference for the tabulator
    const staffCompetencyTableRef = useRef(null);

    // Action to download workloads data as 'JSON'
    const downloadAsJSON = () => {
        staffCompetencyTableRef.current.download("json", "RTP_Staff_Competencies.json");
    }

    /***
     * ALL OTHER CODE
     */

    return (
        <>
            <h3 className = "text-center"> Staff Competency </h3>
            <div>
                <Button variant = "dark" onClick = {() => downloadAsJSON()}>Download JSON</Button>{' '}
            </div>
            <div style = {{clear: 'both'}}></div>
            <br></br>
            <ReactTabulator
                onRef = {(r) => (staffCompetencyTableRef.current = r.current)}
                columns = {staffCompetencyTableCoumns}
                options = {staffCompetencyTableOptions}
            />
            <ChangeStaffCompetency
                show = {state.changeStaffCompetencyShow}
                onHide = {() => dispatch({ type: "changeStaffCompetencyShow", value: false })}
                staffID= {state.staffID}
                workflowName= {state.workflowName}
                competentTasks= {state.competentTasks}
                api = {props.api}
                parentCallback = {handleCallback}
            />
        </>
    );
}

Это похоже на трюк. Если кто-то знает лучший подход, пожалуйста, прокомментируйте.

Спасибо

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