2014-11-02 53 views
0

我开始使用Backact AMD应用程序,使用React.js作为视图。该视图不识别我在render()函数中编写的JSX。我是否在路由器或视图中缺少语句?我收到的错误是'Unexpected token <'。骨干/ ReactJS视图无法识别JSX

下面是该应用流从顶部到底部:

的index.html

<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.2.0/css/bootstrap.min.css"> 
<link rel="stylesheet" href="style.css"> 
<!--<script src="http://fb.me/react-0.12.0.js"></script> 
<script src="http://fb.me/JSXTransformer-0.12.0.js"></script> --> 
<script data-main="js/main" src="//cdnjs.cloudflare.com/ajax/libs/require.js/2.1.15/require.min.js"></script> 

main.js

require.config({ 
paths: { 
    jquery: 'http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min', 
    underscore: 'http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.7.0/underscore-min', 
    backbone: 'http://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.1.2/backbone-min', 
    react: 'http://fb.me/react-0.12.0', 
    JSXTransformer: 'http://fb.me/JSXTransformer-0.12.0' 
} 
}); 

require([ 

// Load our app module and pass it to our definition function 
'app', 
], function(App){ 
// The "app" dependency is passed in as "App" 
App.initialize(); 
}); 

app.js

define([ 
'jquery', 
'underscore', 
'backbone', 
'router' // Request router.js 

], function($, _, Backbone, Router){ 
    var initialize = function(){ 
    // Pass in our Router module and call it's initialize function 
    Router.initialize(); 
} 

return { 
    initialize: initialize 
}; 
}); 

router.js

define([ 
'jquery', 
'underscore', 
'backbone', 
'views/team/list' 
], function($, _, Backbone, TeamListView){ 

var AppRouter = Backbone.Router.extend({ 
    routes: { 
    // Define some URL routes 
    'team': 'showTeam', 

    // Default 
    '*actions': 'defaultAction' 
    } 
}); 

var initialize = function(){ 
    var app_router = new AppRouter; 

    app_router.on('route:showTeam', function(){ 
    // Call render on the module we loaded in via the dependency array 
    // 'views/teams/list' 
    var teamListView = new TeamListView(); 
    teamListView.render(); 

    }); 

    app_router.on('route:defaultAction', function(actions){ 
    // We have no matching route, lets just log what the URL was 
    console.log('No route:', actions); 
    }); 

    Backbone.history.start(); 

}; 
return { 
    initialize: initialize 
}; 
}); 

list.js

/** 
* @jsx React.DOM 
*/ 
define(
    [ 
    'jquery', 
    'underscore', 
    'backbone', 
    'react', 
    'JSXTransformer' 
    ], function($, _, Backbone, react, JSXTransformer){ 

    var MyWidget = React.createClass({ 
     handleClick: function() { 
     alert('Hello!'); 
     }, 
     render: function() { 
     return (
      <a href="#" onClick={this.handleClick}>Do something!</a> 
     ); 
     } 
    }), 

    var TeamListView = Backbone.View.extend({ 
     el: 'body', 
     template: '<div class="widget-container"></div>', 
     render: function() { 
     this.$el.html(this.template); 
     React.renderComponent(new MyWidget(), this.$('.widget-container').get(0)); 
     return this; 
     } 
    }); 
    // Our module now returns our view 
    return TeamListView; 
}); 

list.js(更新 - 工作版本)

define(
    [ 
    'jquery', 
    'underscore', 
    'backbone', 
    'react' 
    ], function($, _, Backbone, React){ 

    var MyWidget = React.createClass({displayName: 'MyWidget', 
     handleClick: function() { 
     alert('Hello!'); 
    }, 
    render: function() { 
    return (<div> 
     <ul> 
     <li></li> 
     <li></li> 
     </ul> 
     <div>Test</div> 
     <a href="#" onClick={this.handleClick}>Do something!</a> 
     </div> 
    ) 
    } 
}); 

var TeamListView = Backbone.View.extend({ 

    el: $('#mainContent'), 
     events: { 

     }, 

     initialize: function() { 
      console.log('test'); 
     }, 

     render: function(){ 

      React.render(
      React.createElement(MyWidget, null), 
      document.getElementById('mainContent') 
     ); 
     }  
    }); 

    return TeamListView; 
}); 
+0

尝试使用['require-jsx'](https://github.com/seiffert/require-jsx)的分支来组合JSX和Require。 – 2014-11-02 17:52:38

+0

这个答案可能会帮助你:[使用与RequireJS ReactJS](http://stackoverflow.com/questions/23381561/using-reactjs-with-requirejs) – myusuf 2014-11-03 07:36:13

回答

1

JSX必须浏览器之前,编译为JavaScript可以把它理解。

您可以使用jsx tool来做到这一点。

JSX变压器和Require.js不兼容。

+0

我必须将JSX组件分成单独的文件?解析器在list.js文件上抛出一个错误:Error reading while module list: Error:Parse Error:Line 27:Unexpected token var – 2014-11-03 17:14:40

+0

错误发生在'var TeamListView = ...'@FakeRainBrigand – 2014-11-03 17:16:17

+0

Nevermind ,我现在明白了。查看新版本list.js的答案 – 2014-11-03 18:32:23

1

如果您使用的是RequireJS,那么您可以使用JSX插件like this one。对于它的价值,当我将JSX转换器集成到我们的RequireJS设置中时,需要进行相当多的调整和试验。