ReactJS: React.render не является функцией, а React.createElement не является функцией
Я нашел проблему в своем коде, когда пытался использовать эти две функции в моей версии React версии 15.2.0, тем не менее, я нашел обходной путь, но я хотел бы знать, есть ли лучшее решение.
//app.jsx
var React = require('react');
var ThumbnailList = require('./thumbnail-list');
var options = {
ThumbNailData: [{
title : 'Download the ISO',
number : 32,
header : 'Learning React',
description: 'The best library for creating fast and dynamic websites.',
imageUrl : 'image source'
},{
title : 'Download the ISO',
number : 64,
header : 'Learning Gulp',
description: 'Speed your development framework!',
imageUrl : 'image source'
}],
};
var element = React.createElement(ThumbnailList,options);
React.render(element, document.querySelector('.container'));
Итак, всякий раз, когда я пытаюсь запустить файл index.html, ничего не отображается, но эта первая ошибка приходит в консоль: React.render не является функцией. Я обнаружил, что это происходит потому, что эта новая версия React нуждается в реагировании, то есть
//app.jsx
var React = require('react-dom');
var ThumbnailList = require('./thumbnail-list');
var options = {
ThumbNailData: [{
title : 'Download the ISO',
number : 32,
header : 'Learning React',
description: 'The best library for creating fast and dynamic websites.',
imageUrl : 'image source'
},{
title : 'Download the ISO',
number : 64,
header : 'Learning Gulp',
description: 'Speed your development framework!',
imageUrl : 'image source'
}],
};
var element = React.createElement(ThumbnailList,options);
React.render(element, document.querySelector('.container'));
Теперь проблема решена, но теперь возникает вторая проблема при попытке снова запустить index.html: React.CreateElement не является функцией.. Я сделал, чтобы добавить еще одну переменную, требующую реакции, т.е.
var React = require('react-dom');
var React2 = require('react');
var ThumbnailList = require('./thumbnail-list');
var options = {
ThumbNailData: [{
title : 'Download the ISO',
number : 32,
header : 'Learning React',
description: 'The best library for creating fast and dynamic websites.',
imageUrl : 'image-source'
},{
title : 'Download the ISO',
number : 64,
header : 'Learning Gulp',
description: 'Speed your development framework!',
imageUrl : 'image-source'
}],
};
var element = React2.createElement(ThumbnailList,options);
React.render(element, document.querySelector('.container'));
В нескольких словах, чтобы решить проблему React.render
var React = require('react-dom')
чтобы решить проблему React.createElement
var React2 = require('react')
Мои вопросы:
-
Почему эта реакция создала проблему с React.createElement?
-
Это из-за этой новой версии React?
-
Есть ли лучший подход для решения этих проблем без необходимости ссылаться на реакцию и реагировать?
Любые мысли и комментарии приветствуются;)
Ответы
Ответ 1
Прежде всего, начиная с React v0.14, появился новый пакет под названием react-dom
. Он абстрагирует "среду", в которой вы будете запускать React, и в вашем случае это браузер.
https://facebook.github.io/react/blog/2015/10/07/react-v0.14.html#two-packages-react-and-react-dom
Итак, теперь у вас есть два пакета: "react
" для создания ваших компонентов React и "react-dom
" для "интеграции" React с браузером, вам нужно вызывать правильные методы, которые предоставляет каждый из них.
Затем, отвечая на ваши вопросы:
Почему реактивный дом создал проблему с React.createElement?
Пакет с React.createElement
- это react
, а не react-dom
.
Это из-за этой новой версии React?
Да, вы больше не можете звонить в React.render
(из пакета react
), вам нужно использовать ReactDOM.render
(из пакета react-dom
).
Есть ли лучший подход для решения этих проблем без необходимости реагировать и реагировать?
Я не вижу в этом "проблемы", вам просто нужно знать, что теперь есть специальный пакет для управления DOM. Кроме того, это "хороший" шаблон, потому что если вы когда-нибудь захотите визуализировать свои компоненты в виде HTML (для рендеринга с использованием сервера), вам просто нужно адаптировать некоторые вещи, и ваш код будет таким же.
Ответ 2
Я получаю сообщение об ошибке: "React.createElement не является функцией", и для моей ситуации исправление должно было изменить это:
import * as React from "react";
import * as ReactDOM from "react-dom";
НА ЭТО:
import React from "react";
import ReactDOM from "react-dom";
Это было в файле TypeScript, поэтому я не уверен, что оно применимо к не-TypeScript или нет.