React. js: использование компонентов класса в конструкторе - PullRequest
1 голос
/ 02 августа 2020

Вот код:

export default class Collage extends React.Component {
    constructor() {
        super();
        this.state = {
            images: [
                <this.Image src="" />,
            ],
        };
    }

    Image = ({ src }) => (
        <img className="collage__img" alt="" src={src} onTransitionEnd={evt => evt.target.remove()} />
    );

    render() {
        return (
            <div className="collage">
                {this.state.images}
            </div>
        );
    }
}

Все, что я хочу, - это сгенерировать список изображений в блоке .collage до того, как все будет отрисовано. Как видите, я пробовал создавать изображения в конструкторе. Но вот так я получаю ошибку: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: undefined.

Но если я объявлю Image в конструкторе (без использования this), все будет работать нормально. Такое странное поведение.

Подскажите, есть ли другой способ сгенерировать данные перед рендерингом?

Ответы [ 4 ]

1 голос
/ 02 августа 2020

Я не знаю, почему вы хотите перевести компоненты в состояние, но это не оптимизировано. Я думаю, что лучший способ сделать это - это примерно так:

  export default class Collage extends React.Component {
        constructor() {
            super();
            this.state = {
                images: [
                    {src: ""}
                ],
            };
        }
    
        Image = ({ src }) => (
            <img className="collage__img" alt="" src={src} onTransitionEnd={evt => evt.target.remove()} />
        );
    
        render() {
            return (
                <div className="collage">
                    {this.state.images.map(this.Image)}
                </div>
            );
        }
    }
1 голос
/ 02 августа 2020

Я не знаю, почему вы не помещаете <Image /> как отдельный компонент, поскольку он не зависит от чего-либо в контексте вашего класса, как показано ниже:

const Image = ({ src }) => (
  <img className="collage__img" alt="" src={src} onTransitionEnd={evt => evt.target.remove()} />
);

class Collage extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
        images: [
          <Image src="" />
        ],
    };
  }

  render() {
    return (
        <div className="collage">
          {this.state.images}
        </div>
    );
  }
}
1 голос
/ 02 августа 2020

Создайте свой класс компонента Image за пределами College. js. Также не забудьте добавить в JSX атрибут «ключ», который хранится в массиве, чтобы ускорить работу.

Codesandbox

Изображение. js

import React from "react";
const Image = ({ src }) => (
  <img
    className="collage__img"
    alt=""
    src={src}
    onTransitionEnd={evt => evt.target.remove()}
  />
);

export default Image;

Колледж. js

import React from "react";
import Image from "./Image";

export default class Collage extends React.Component {
  constructor() {
    super();
    this.state = {
      images: [
        <Image
          key="a356f8ff-0fc4-4c00-afb4-8ce60fcc210e"
          src="https://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Test-Logo.svg/1200px-Test-Logo.svg.png"
        />
      ]
    };
  }

  render() {
    return <div className="collage">{this.state.images};</div>;
  }
}

Приложение js

import React from "react";
import "./styles.css";
import Collage from "./College";

export default function App() {
  return (
    <div className="App">
      <Collage />
    </div>
  );
}
0 голосов
/ 02 августа 2020

Вы можете использовать метод жизненного цикла реакции componentWillMount(), который сгенерирует список изображений в блоке .collage до того, как все будет отрисовано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...