Как я могу заставить кнопку JavaScript (с помощью React framework) создать новый экземпляр класса?

#javascript #html #reactjs #function #syntax

#javascript #HTML #reactjs #функция #синтаксис

Вопрос:

Я новичок в веб-разработке, и я только сейчас создаю свою первую страницу (используя ReactJS поверх нее), так что извините, если это вопрос новичка. На моей странице я создал 3 окна, которые позже будут заполнены информацией, и я хочу, чтобы пользователь мог создавать свои собственные, нажимая кнопку » «. Хотя по какой-то причине мой код не работает. Даже после нажатия кнопки » » ничего не происходит. Вот код моего класса ‘Board’ для демонстрации.

 class Board extends React.Component {
  renderWindow(i) {
    return (
      <Window name={i} />
    );
  }

  handleClick() {
    var test = document.createElement("P");
    test.innerHTML = "this.renderWindow('test-thingy')";
    document.body.appendChild(test);
  }

  render() {
    return (
      <div>
        <div className="info-window">
          {this.renderWindow("Contacts")}
          {this.renderWindow("Accounts")}
          {this.renderWindow("Info")}
        </div>
      <button
        className="button1"
        onClick={() => this.handleClick()}
      >
        {" "}
      </button>
      </div>
    );
  }
}
  

Я просто не знаю, как заставить его реагировать соответствующим образом, потому что прямо сейчас он создает только текст с цитатой из test.innerHTML . Я попробовал несколько других синтаксисов для этой строки, таких как:

     test.innerHTML = "{this.renderWindow('test-thingy')}";
  

или

     test.innerHTML = "<div> {this.renderWindow('test-thingy')} </div>";
  

или даже инвертировать «и «. С тех пор я искал способ, но не могу его найти. Я хочу, чтобы он создал четвертое окно с именем ‘test-thingy’.

Ответ №1:

Вы должны поместить элемент JSX, который будет отображаться из-за изменения состояния, как часть render метода.

 const WindowComp = ({ name }) => <p>{name}</p>;
class Board extends React.Component {
  state = {
    windowNames: ['Contacts', 'Accounts', 'Info']
  };
  handleClick() {
    this.setState({
      windowNames: [...this.state.windowNames, 'test-thingy']
    });
  }

  render() {
    return (
      <div>
        <div className="info-window">
          {this.state.windowNames.map(
            (name, i) => <WindowComp key={i} name={name} />
          )}
        </div>
      <button
        className="button1"
        onClick={() => this.handleClick()}
      >
        {" "}
      </button>
      </div>
    );
  }
}
ReactDOM.render(<Board />, document.querySelector('.react'));  
 <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div class="react"></div>  

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

1. Я не понял функциональность этой строки (name, i) => <WindowComp key={i} name={name} /> и, более конкретно, причину, по которой вы объявляете ключ. На данный момент оно равно нулю. Есть ли способ заполнить его из windowNames? Кроме этого, он работал отлично, и мне не нужно было объявлять WindowComp const, потому что я использовал Window, который я создал ранее.

2. Первый аргумент .map обратного вызова — это элемент, который повторяется. Например, на первой итерации name это windowNames[0] . Второй аргумент — это повторяемый индекс, начинающийся с 0 (и 1 на второй итерации и т.д.). Ключ необходим, потому что, если вы его опустите, React покажет предупреждение — см. adhithiravi.medium.com /… для получения подробной информации.