React: получение неожиданной ошибки токена в компоненте render () в классе [duplicate]

В sqlite вы получаете только поведение автоинкремента, когда только один целочисленный столбец является первичным ключом. (! d2)

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

Если это все еще не совсем то, что вы хотите (скажем, id не обязательно должен быть уникальным вообще), вам, вероятно, придется использовать триггер для работы автоинкремента.

72
задан Shawn 24 May 2014 в 04:56
поделиться

6 ответов

Попробуйте вспомнить теги как вызовы функций (см. docs ). Тогда первый будет:

{[1,2,3].map(function (n) {
  return React.DOM.p(...);
})}

И второй:

{[1,2,3].map(function (n) {
  return (
    React.DOM.h3(...)
    React.DOM.p(...)
  )
})}

Теперь должно быть ясно, что второй фрагмент действительно не имеет смысла (вы можете " t возвращает более одного значения в JS). Вы должны либо обернуть его в другой элемент (скорее всего, то, что вы хотите, таким образом вы также можете предоставить действительное свойство key), или вы можете использовать что-то вроде этого:

{[1,2,3].map(function (n) {
  return ([
    React.DOM.h3(...),
    React.DOM.p(...)
  ]);
})}

С сахаром JSX:

{[1,2,3].map(function (n) {
  return ([
    <h3></h3>, // note the comma
    <p></p>
  ]);
})}

Вам не нужно сгладить результирующий массив, React сделает это за вас. См. Следующий скрипт http://jsfiddle.net/mEB2V/1/ . Опять же: объединение двух элементов в div / раздел, скорее всего, будет более долгосрочным.

115
ответ дан Jan Olaf Krems 16 August 2018 в 14:26
поделиться
  • 1
    Да, действительно, документально зафиксировано facebook.github.io/react/tips/… – Shawn 24 May 2014 в 04:42
  • 2
    Использование return ([...]) без бит flatten дает мне разметку точно так, как я хотел, хотя возвращаемый массив не должен был быть flattend, но в моем конкретном случае это не влияет на окончательный вывод. Или это? – Shawn 24 May 2014 в 04:52
  • 3
    Благодаря! TIL! Обновление моего ответа включает ссылку на JSFiddle, которая показывает, что flatten не является обязательным. Будет также включать ссылку на документы React. – Jan Olaf Krems 24 May 2014 в 05:37
  • 4
    Это больше не работает (с 0.9ish) Uncaught Error: Invariant Violation: Product.render(): A valid ReactComponent must be returned. You may have returned undefined, an array or some other invalid object. – dogmatic69 21 August 2015 в 14:25
  • 5
    @TimFletcher. Прекрасно возвращать массив как часть рендеринга компонента, например <div>{ this.props.foos.map(function() { return <Foo /> }) }</div>. Но функция render компонента не может вернуть этот массив без его обертывания, например. в div. – Henrik N 2 July 2016 в 22:17

Кроме того, вы можете захотеть вернуть несколько элементов списка в некоторой вспомогательной функции внутри компонента React. Просто верните массив узлов html с атрибутом key:

import React, { Component } from 'react'

class YourComponent extends Component {
  // ...

  render() {
    return (
      <ul>
        {this.renderListItems()}
      </ul>
    )
  }      

  renderListItems() {
    return [
      <li key={1}><a href="#">Link1</a></li>,
      <li key={2}><a href="#">Link2</a></li>,
      <li key={3} className="active">Active item</li>,
    ]
  }
}
6
ответ дан Dmitriy 16 August 2018 в 14:26
поделиться

Кажется, старый ответ о возврате массива больше не применяется (возможно, с React ~ 0.9, так как @ dogmatic69 написал в комментарий ).

Документы говорят, что вам нужно вернуть один узел:

Максимальное количество корневых узлов JSX

В настоящее время в рендеринге компонента вы можете вернуть только один узел; Если у вас есть, скажем, список divs для возврата, вы должны обернуть ваши компоненты в div, span или любой другой компонент.

Не забывайте, что JSX компилируется в обычный JS; возвращение двух функций не делает синтаксического смысла. Аналогично, не ставьте более одного ребенка в тройной.

Во многих случаях вы можете просто обернуть вещи в <div> или <span>.

В моем случае я хотел вернуть несколько <tr> s. Я обернул их в <tbody> - таблице разрешено иметь несколько тел.

EDIT: Начиная с React 16.0, возвращение массива, по-видимому, разрешено снова, пока каждый элемент имеет key : https://facebook.github.io/react/blog/2017/09/26/react-v16.0.html#new-render-return-types-fragments-and-strings

EDIT: React 16.2 позволяет вам окружать список элементов с помощью <Fragment>…</Fragment> или даже <>…</>, если вы предпочитаете это для массива: https://blog.jmes.tech/react- фрагмент-и-семантико-HTML /

32
ответ дан Henrik N 16 August 2018 в 14:26
поделиться
  • 1
    Спасибо за & lt; tbody & gt; трюк, это был мой случай. – Amida 4 November 2015 в 13:14
  • 2
    Что вы можете сделать, если хотите вернуть несколько <li>? Предполагая, что я не могу просто обернуть все это в <ul> – Banjocat 10 November 2015 в 17:22
  • 3
    @Banjocat Боюсь, я не знаю: / Вам разрешено перечислять гнездо , чтобы вы могли вернуть что-то вроде <li><ul><li>one</li><li>two</li></ul></li>, если это работает в вашей ситуации. Или: Развертывание div не будет строгодействующим, но, возможно, оно отлично отображается во всех соответствующих браузерах? Если вы попробуете, сообщите нам об этом. – Henrik N 10 November 2015 в 19:22
  • 4
    @Banjocat ... Мне бы хотелось узнать лучший ответ на ваш вопрос. Может быть, вы должны представить его как обычный вопрос о стеке и посмотреть, есть ли у вас другой ответ. – user1175849 24 November 2015 в 12:22
  • 5
    @HenrikN Fwiw, обертывание "подмножества" из li в span или div не помогли мне. Диверс серьезно нарушил рендеринг, и, по крайней мере, в моем случае, пробел испортил CSS. 2 ¢: Попытка вернуть несколько подмножеств li s - это запах кода. Мы использовали ul в качестве своего рода выпадающего меню, и изначально я хотел, чтобы многие компоненты возвращали «разделы» и т. Д. of li s. В конце концов, было бы лучше поместить весь код меню в один компонент "привязанный & quot; на ul, чем на shoehorn в li s из нескольких источников. Я думаю, что это сделало также ментальную модель для UI немного чище. – ruffin 24 March 2017 в 18:43

С React> 16 вы можете использовать response-composite .

import { Composite } from 'react-composite';

// ...

{[1,2,3].map((n) => (
  <Composite>
    <h2>Title {n}</h2>
    <p>Description {n}</p>
  </Composite>
))};

Конечно, должен быть установлен состав-ответ.

npm install react-composite --save
0
ответ дан Mr Br 16 August 2018 в 14:26
поделиться

Начиная с версии React v16.0.0, можно возвращать несколько элементов, обернув их внутри Array

render() {
  return (
    {[1,2,3].map(function (n) {
      return [
        <h3>Item {n}</h3>.
        <p>Description {n}</p>
      ]
    }}
  );
}

Также из React v16.2.0 появилась новая функция под названием React Fragments , который вы можете использовать для обертывания нескольких элементов

render() {
  return (
    {[1,2,3].map(function (n, index) {
      return (
        <React.Fragment key={index}>
            <h3>Item {n}</h3>
            <p>Description {n}</p>
        </React.Fragment>
      )
    }}
  );
}

В соответствии с документацией:

Общий шаблон в React для компонента для возврата нескольких элементов. Фрагменты позволяют группировать список детей без добавления дополнительных узлов в DOM.

Фрагменты, объявленные с явным синтаксисом, могут иметь ключи. Для этого используется сопоставление коллекции с массивом фрагментов - например, для создания списка описаний:

function Glossary(props) {
  return (
    <dl>
      {props.items.map(item => (
        // Without the `key`, React will fire a key warning
        <React.Fragment key={item.id}>
          <dt>{item.term}</dt>
          <dd>{item.description}</dd>
        </React.Fragment>
      ))}
    </dl>
  );
}

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

1
ответ дан Shubham Khatri 16 August 2018 в 14:26
поделиться

Здесь вы можете использовать createFragment.

https://facebook.github.io/react/docs/create-fragment.html

import createFragment from 'react-addons-create-fragment';
...
{[1,2,3].map((n) => createFragment({
    h: <h3>...</h3>,
    p: <p>...</p>
  })
)}

(используя синтаксис ES6 и JSX здесь)

вам сначала нужно добавить пакет react-addons-create-fragment:

npm install --save react-addons-create-fragment

Преимущество решения Jan Olaf Krems: не реагировать жалуются на недостающие key

2
ответ дан sylvain 16 August 2018 в 14:26
поделиться
  • 1
    исправьте меня, если я ошибаюсь, но вы можете просто добавить ключи вручную. используя пример jan: первый элемент массива получает, например. & lt; h3 key = {i} & gt; & lt; / h3 & gt; и второй элемент элемента sth немного отличается, например, & lt; p & gt; key = {i + '-foo'} & gt; & lt; / p & gt; – nerdess 3 August 2017 в 09:50
Другие вопросы по тегам:

Похожие вопросы: