Рендеринг оператора if в зависимости от состояния в веб-приложении React

#reactjs

#reactjs

Вопрос:

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

Я подумал, что это должно быть просто, но это не так..

У меня есть четыре переменные:

 const stNumbers = [1, 21, 31]
const ndNumbers = [2, 22]
const rdNumbers = [3, 23]
const thNumbers = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 24, 25, 26, 27, 28, 29, 30]
  

Каждый из них представляет собой массив чисел от 1 до 31. Массив, в котором они находятся, зависит от того, как они отображаются в дате, т.Е. 1-й, 2-й, 3-й, 4-й и т.д.

Затем у меня есть функция, которая в зависимости от состояния отображает диапазон в зависимости от того, соответствует ли состояние любому из значений в приведенных выше массивах.

 const numbersCheck = () => {
      if (stNumbers.includes(this.state.paymentDate)) {
        return <span>st</span>
      } else if (ndNumbers.includes(this.state.paymentDate)) {
        return <span>nd</span>
      } else if (rdNumbers.includes(this.state.paymentDate)) {
        return <span>rd</span>
      } else if (thNumbers.includes(this.state.paymentDate)) {
        return <span>th</span>
      } else {
        return <span></span>
      }
    }
  

Это вызывает ‘includes’ для проверки каждого из массивов и определения того, какой диапазон он должен отображать.

Затем я хочу отобразить эту функцию внутри моего компонента, чтобы вместо того, чтобы они были просто числом, т.Е. 3, 9, 12, 24 или любым другим примером, вместо этого он говорит 3-й, 9-й, 12-й, 24-й.

Ввод задает состояние при вводе текста.

Я пытаюсь сделать это следующим образом:

 <div className="link-debt-input-container">
              <input className="link-debt-number-input" list="date-list" name="paymentDate" value={this.state.paymentDate} onChange={this.onChange} />
                <datalist id="date-list">
                  <option value="1" />
                  <option value="2" />
                  <option value="3" />
                  <option value="4" />
                  <option value="5" />
                  <option value="6" />
                  <option value="7" />
                  <option value="8" />
                  <option value="9" />
                  <option value="10" />
                  <option value="11" />
                  <option value="12" />
                  <option value="13" />
                  <option value="14" />
                  <option value="15" />
                  <option value="16" />
                  <option value="17" />
                  <option value="18" />
                  <option value="19" />
                  <option value="20" />
                  <option value="21" />
                  <option value="22" />
                  <option value="23" />
                  <option value="24" />
                  <option value="25" />
                  <option value="26" />
                  <option value="27" />
                  <option value="28" />
                  <option value="29" />
                  <option value="30" />
                  <option value="31" />
                </datalist>
              { numbersCheck }
            </div>
  

Каждый раз, когда я пытаюсь отобразить свою страницу, я получаю следующую ошибку:

Предупреждение: функции недопустимы как дочерние функции React. Это может произойти, если вы возвращаете компонент вместо из render . Или, может быть, вы хотели вызвать эту функцию, а не возвращать ее.

Я не понимаю, как это происходит, поскольку я возвращаю интервалы внутри функции ‘numbersCheck’?

Может кто-нибудь указать, где я ошибаюсь?

Ответ №1:

Вы должны вызвать метод, а не просто вставить его:

 { numbersCheck() }
  

JSX создает дерево элементов React. Вы пытаетесь вставить функцию вместо элемента в дерево.

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

1. Спасибо — это устраняет ошибку, но ничего не отображает на моей странице. Итак, я предполагаю, что он вызывает его при загрузке страницы (componentDidMount), но не обновляется в зависимости от состояния моего ввода?

2. Функция будет вызвана снова при изменении реквизита / состояния этого компонента. Я предполагаю, что ничего не отображается, потому что вы вводите блок else с пустым промежутком?

3. Вы можете попытаться отладить это с помощью инструментов разработчика, если вы не уверены, что происходит. приветствия