React.js без JSX - "Предупреждение: что-то вызывает компонент React напрямую. Вместо этого используйте factory или JSX"
Я пытаюсь использовать компонент React.js без JSX и получать такое предупреждение:
Warning: Something is calling a React component directly. Use a factory or JSX instead. See: http://fb.me/react-legacyfactory
Я посетил ссылку, но предлагаемое решение createFactory
не помогло мне:/
app.js
var React = require('react/addons');
var TagsInput = React.createFactory(require('./tagsinput')); // no luck
var TagsComponent = React.createClass({
displayName: "TagsComponent",
saveTags: function () {
console.log('tags: ', this.refs.tags.getTags().join(', '));
},
render: function () {
return (
React.createElement("div", null,
React.createElement(TagsInput, {ref: "tags", tags: ["tag1", "tag2"]}),
React.createElement("button", {onClick: this.saveTags}, "Save")
)
);
}
});
React.render(React.createElement(TagsComponent, null), document.getElementById('tags'));
tagsinput.js
https://raw.githubusercontent.com/olahol/react-tagsinput/master/react-tagsinput.js
Я не могу понять, в чем проблема?
Ответы
Ответ 1
React.createClass(spec)
возвращает компонент.
React.createElement(component, props, ...children)
создает элемент .
React.createFactory(component)
возвращает функцию factory, которая может быть использована для создания элемента .
React.createFactory(a)(b, c, d)
совпадает с React.createElement(a, b, c, d)
.
Вы получите предупреждение, когда вы вызываете компонент напрямую, например component()
. Если вы хотите называть его как функцию, используйте createFactory
var factory = React.createFactory(component);
var element = factory(props, ...children);
Или используйте createElement:
var element = React.createElement(component, props, ...children);
В 0.13 это приведет к ошибке вместо предупреждения:
var element = component(props, ...children);
Также, поскольку React.DOM уходит, вы должны создать dom элементы так же, как вы создаете компонент на основе элементов
Edit: похоже, что React.DOM сейчас торчит.
var div = React.createFactory('div');
var element = div(props, ...children);
// or
var element = React.createElement('div', props, ...children);
Жирный шрифт, используемый для отображения согласованных терминов. ...children
означает любое количество дочерних аргументов
Ответ 2
Вам также нужно обернуть все дочерние компоненты в createFactory
, я смог запустить ваш код без этого специального предупреждения, обернув Tag
и Input
в createFactory
.
jsbin