Классы ES6, вызывающие функцию SetState для себя

Я создаю приложение React и пытаюсь понять, смогу ли я сделать следующее. есть много вложенных компонентов, и тот, который обновляется, всегда является главным родителем.

Идея состоит в том, чтобы построить его через вложенный объект, прототипированный с помощью класса ES6, следующим образом:

class _Board {
    constructor(setStateFunction){
        this.items = [];
        this.setState = setStateFunction;
    }

    addSwimlane() {
        console.log(this);
        this.items = [...this.items, new _Swimlane()];
        this.setState(this);
    }
}

class _Swimlane {
    constructor(){
        this.id = uuidv4();
        this.items = [];
    }

    addColumn() {
        this.items = [...this.items, new _Column(this.id)];
        //Can we call the parent function through super to update the render?
    }
}

Затем у меня есть компонент, в котором я бы вызвал функцию:

const Main = (props) => {
    const [board, setBoard] = useState(new _Board());
    
    useEffect(() => { //Initial Render load setState
        setBoard(new _Board(setBoard));
    }, []);

    return (
        <div className="App" >
            {JSON.stringify(board)}
            <button onClick={() => board.addSwimlane()} >Add Swimlane</button>
        </div>
    );
};

У меня два вопроса:

  1. Как вы передаете такую ​​​​функцию в класс? Я могу передать их через функцию стрелки, как обычно, но при передаче в качестве параметра рендеринг не обновляется.
  2. Как вы вызываете родительский класс после того, как дочерние элементы были вложены? Должен ли я передать функцию через функцию addX, которая у меня уже есть, и она будет там в качестве ссылки?

person Johnny Prescott    schedule 08.03.2021    source источник
comment
Я не совсем то, что вы имеете в виду, как вы называете родительский класс после вложения детей, не могли бы вы перефразировать его?   -  person kyle    schedule 08.03.2021
comment
Это абсолютно неправильный способ написания React. Работает это или нет, не имеет значения, делайте что-то в стиле React, иначе вы столкнетесь с серьезными проблемами, и никто не сможет вам помочь, потому что весь ваш код сумасшедший и очень сложный для понимания. Если вы хотите сохранить строку/столбец в виде структуры данных, просто сделайте это непосредственно в состоянии React. Вы также не должны устанавливать состояние из внешних мест, таких как экземпляр класса. Всегда устанавливайте состояние непосредственно внутри самого компонента. Иногда вам приходится делать странные вещи, но не в таких простых случаях, как этот.   -  person Jayce444    schedule 08.03.2021
comment
Для вашего варианта использования вам буквально просто нужно сохранить массив uuidv4() в состоянии и создать из него свои компоненты. Это все   -  person Jayce444    schedule 08.03.2021
comment
Вы пытаетесь поделиться состоянием. Есть несколько способов сделать это. Ознакомьтесь с этим ответом для одного метода, который может вас заинтересовать: stackoverflow.com/a/38904385/9078341   -  person Randy Casburn    schedule 08.03.2021
comment
Почему построение моего состояния из шаблонного класса было бы неправильным? Это ничем не отличается от простой установки состояния как объекта. Единственный раз, когда класс используется, это начальное состояние использования, после чего он просто становится объектом. Я хочу знать, как дать этому объекту возможность вызывать setState для себя.   -  person Johnny Prescott    schedule 08.03.2021
comment
какую родительскую функцию вы хотите вызвать? А кто должен звонить? ребенок (Swimlane?) ?   -  person grodzi    schedule 08.03.2021
comment
@grodzi, когда я вызываю addSwimlane, вызывает this.setState, который передается из параметров. Должно ли это работать и перерисовываться, поскольку это исходный SetState из компонента?   -  person Johnny Prescott    schedule 08.03.2021
comment
Таким образом, ваш вопрос может быть сужен до: когда setState запускает слияние и повторную визуализацию экземпляра. Кажется, если вы сохраните ту же ссылку, она не перерисовывается. Вместо этого вы можете рассмотреть возможность хранения простого «json». И каждый раз перестраивайте объект на основе этого json + предоставляя setState строковую версию, представляющую... ** состояние ** этого объекта.   -  person grodzi    schedule 08.03.2021