Reactjs:意外的标记“<”错误
我刚刚开始使用Reactjs,并正在编写一个简单的组件来显示
li
标签,并遇到这个错误:
意外的标记“<”
我把这个例子放在http://jsbin.com/UWOquRA/1/edit?html,js,console,output下的jsbin
请让我知道我做错了什么。
更新:在React 0.12+中,JSX杂注不再是必需的。
确保在您的文件顶部包含JSX杂注:
/** @jsx React.DOM */
如果没有这一行, jsx
二进制和浏览器内的转换器将保持文件不变。
我使用type =“text / babel”解决了这个问题
<script src="js/reactjs/main.js" type = "text/babel"></script>
在我的情况下,我没有在我的脚本标签中包含type属性。
<script type="text/jsx">
问题意外的标记“<”是因为缺less巴贝尔预设。
解决scheme:您必须按照以下步骤configuration您的webpackconfiguration
{ test :/\.jsx?$/, exclude:/(node_modules|bower_components)/, loader :'babel', query :{ presets:['react','es2015'] } }
这里.jsx检查.js和.jsx格式。
你可以简单地使用节点安装babel依赖项,如下所示
npm install babel-preset-react
谢谢
您需要将JSX代码转换/编译为javascript或使用浏览器内转换器
看一下http://facebook.github.io/react/docs/getting-started.html并记下;<script>
标签,你需要JSX包含在浏览器中。
下面是你的jsbin的一个实例:
HTML:
<!DOCTYPE html> <html> <head> <script src="//fb.me/react-with-addons-0.9.0.js"></script> <meta charset=utf-8 /> <title>JS Bin</title> </head> <body> <div id="main-content"></div> </body> </html>
JSX:
<script type="text/jsx"> /** @jsx React.DOM */ var LikeOrNot = React.createClass({ render: function () { return ( <p>Like</p> ); } }); React.renderComponent(<LikeOrNot />, document.getElementById('main-content')); </script>
从一个文件运行这个代码,你应该可以工作。
为了正确的标签parsing,你需要使用这个babel版本: https : //cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.24/browser.js和属性“type ='text / babel'”在脚本中。 另外,你的自定义脚本应该在“body”标签内。
你可以使用这样的代码:
import React from 'react'; import ReactDOM from 'react-dom'; var LikeOrNot = React.createClass({ displayName: 'Like', render: function () { return ( React.createElement("li", null, "Like") ); } }); ReactDOM.render(<LikeOrNot />, document.getElementById('main-content'));
别忘了在你的html
添加<div id='main-content'></div>
到body
中
但是在你的package.json文件中,你应该使用这个依赖关系:
"dependencies": { ... "babel-core": "^6.18.2", "babel-preset-react": "^6.16.0", ... } "devDependencies": { ... "babel": "^6.5.2", "babel-loader": "^6.2.7", "babel-preset-es2015": "^6.18.0", "jsx-loader": "^0.13.2", ... }
它适用于我,但我也使用webpack,这个选项(进入webpack.config.js):
module: { loaders: [ { test: /\.jsx?$/, // Match both .js and .jsx files exclude: /node_modules/, loader: "babel-loader", query: { presets: ['es2015', 'react'] } } ] }
在我的情况下,除了babel
预设,我还必须添加到我的.eslintrc
:
{ "extends": "react-app", ... }
如果我们考虑你的真实网站configuration,比你需要在头上运行ReactJS
<!-- Babel ECMAScript 6 injunction --> <script src="babel-standalone@6/babel.min.js"></script>
并添加属性到你的js文件 – type =“text / babel”之类的
<script src="../js/r1HeadBabel.js" type="text/babel"></script>
那么下面的代码示例将工作:
ReactDOM.render( <h1>Hello, world!</h1>, document.getElementById('root') );
使用下面的代码。 我添加了对React和React DOM的引用。 使用ES6 / Babel将您的JS代码转换为vanilla JavaScript。 请注意,Render方法来自ReactDOM,并确保render方法具有在DOM中指定的目标。 有时你可能会面临render()方法找不到目标元素的问题。 发生这种情况是因为反应代码在DOM呈现之前执行。 为了对付这个,使用jQuery ready()来调用React的render()方法。 这样你就可以确定首先渲染DOM。 您也可以在应用程序脚本上使用defer属性。
HTML代码:
<!DOCTYPE html> <html> <head> <meta charset=utf-8 /> <title>JS Bin</title> </head> <body> <div id='main-content'></div> <script src="CDN link to/react-15.1.0.js"></script> <script src="CDN link to/react-dom-15.1.0.js"></script> </body> </html>
JS代码:
var LikeOrNot = React.createClass({ render: function () { return ( <li>Like</li> ); } }); ReactDOM.render(<LikeOrNot />, document.getElementById('main-content'));
希望这可以解决你的问题。 🙂