Инициализация состояния в React без конструктора

#reactjs

#reactjs

Вопрос:

У меня есть компонент класса, как показано ниже:

 import React, { Component } from "react";
import Aux from "../../../hoc/Auxilary/Auxilary";
import ComponentDetails from "./SideBarLayoutDetails";
import DropDownDetails from "../UI/DropDown/DropDownDetails";
import Row from "../UI/Row/Row";
import "./Layouts.css";
import Dropdown from "../UI/DropDown/DropDown";
import Calendar from "../UI/Calendar/Calendar";

class SideBarLayout extends Component {

    state = {
        isActive: Array(DropDownDetails.length),
        isDateActive: false,
    }


    DropDownArrowHandler = (index) =>
    {

    }

    render()
    {
        const calendar = this.state.isDateActive ? <Calendar />:null;

        return <Aux>
                <div className = "SideBar-Central">
                                <Row Elems = {ComponentDetails.TopHeaders.elements} 
                                Container = {ComponentDetails.TopHeaders.container}
                                />
                                <Dropdown Elems = {DropDownDetails[0].DateFilter} 
                                Container = {DropDownDetails[0].DateFilterContainer}
                                />
                                {calendar}
                </div>
        </Aux>
    }
}

export default SideBarLayout;
  

Я хочу инициализировать this.state.isActive цикл следующим образом:

 const initializedvalue = DropDownDetails.map(elem => elem.active);
  

а затем используйте это initializedvalue для назначения this.state.isActive .

Но я хочу сделать это только тогда, когда компонент отображается на экране. Каков наилучший способ сделать это? Должен ли я использовать constructor ? Я не предпочитаю это, так как получаю предупреждение об использовании super(props) . Пожалуйста, дайте мне знать, как лучше всего это сделать. Моя конечная цель — иметь this.state.isActive массив, готовый к использованию при принятии решений о рендеринге компонентов экрана.

Комментарии:

1. это не так, как работает react… точка. Я предлагаю вам прочитать документацию react о том, как работает локальное состояние по сравнению с реквизитами и глобальным состоянием (например, redux)

2. Также forEach является пустой функцией… Пожалуйста, прочитайте документы, в которых есть вся информация.

Ответ №1:

Во-первых, forEach не возвращает никакого значения, поскольку это функция void. Так что попробуйте вместо этого функцию map. Это вернет элементы, для которых значение active равно true (предполагается active boolean , что это свойство типа в elem )

const initializedvalues = DropDownDetails.map(elem => elem.active);

Далее, если вы хотите использовать это для установки this.state.isActive после рендеринга, запустите его componentDidMount() . Это функция жизненного цикла, которая запускается после завершения первоначального рендеринга.

Комментарии:

1. Я не хочу использовать componentDidMount , потому что он установит значения после первого цикла рендеринга… скорее я хочу использовать что-то вроде ComponentWillMount . Моя конечная цель — использовать эту инициализацию до монтирования компонента, а не после.

2. Затем используйте componentWillMount() .