将 React 组件移动到 ReactJS.Net 中的另一个文件而不用 "unexpected identifier"

Move React component to a different file in ReactJS.Net without "unexpected identifier"

我习惯了 "normal" React 设置,但现在我需要将 ASP.NET MVC 管理系统中的一个页面制作成一个简单的 React 应用程序。

我已经为 MVC 4/5 安装了 https://reactjs.net/,并遵循了有关如何设置的教程。

我的问题是:如何引用其他文件中的组件?

我做了什么:

我使用一个名为 App.jsx 的应用程序进行了超级简单的设置。如果我不引用任何页面,我会从上面的教程中获取输出。

但是,如果我 - 在同一个文件夹中 - 创建一个新文件,InvoiceBuilder.jsx,然后我创建以下内容(或任何代码,这似乎从未达到):

var CommentForm = React.createClass({
    render: function () {
        return (
            <div className="commentForm">
                Hello, world! I am a CommentForm.
      </div>
        );
    }
});

我在我的 App.jsx 文件中引用了这个(我尝试了 import 语句的许多变体):

import CommentForm from './InvoiceBuilder';

var CommentBox = React.createClass({
    render: function () {
        return (
            <div className="commentBox">
                <h1>Comments</h1>
                <CommentList />
                <CommentForm />
            </div>
        );
    }
});

var Comment = React.createClass({
    render: function () {
        return (
            <div className="comment">
                <h2 className="commentAuthor">
                    {this.props.author}
                </h2>
                {this.props.children}
            </div>
        );
    }
});

var CommentList = React.createClass({
    render: function () {
        return (
            <div className="commentList">
                <Comment author="Daniel Lo Nigro">Hello ReactJS.NET World!</Comment>
                <Comment author="Pete Hunt">This is one comment</Comment>
                <Comment author="Jordan Walke">This is *another* comment</Comment>
      </div>
        );
    }
});



ReactDOM.render(
    <CommentBox />,
    document.getElementById('content')
);

我已经得到错误:

Uncaught SyntaxError: Unexpected identifier

基于以以下开头的生成文件,并在导入行失败:

// @hash v3-E82E48A85D4E9467B3D81F106834DC4725BD0DDC
// Automatically generated by ReactJS.NET. Do not edit, your changes will be overridden.
// Version: 3.3.0 (build 8c1c474) with Babel 6.7.7
// Generated at: 01-04-2018 17:20:43
///////////////////////////////////////////////////////////////////////////////
//import React from 'react';
import CommentForm from './InvoiceBuilder';

var CommentBox = React.createClass({

编辑:

我尝试将 JSX 添加到这样的包中:

   bundles.Add(new BabelBundle("~/bundles/main").Include(
                "~/Scripts/React/InvoiceBuilder/InvoiceBuilder.jsx",
                "~/Scripts/React/InvoiceBuilder/App.jsx"
            ));

然后我在编译包时遇到这个错误:

+       InnerException  {"Error: unknown: Unexpected token (15:15)\n  13 |     document.getElementById('content')\n  14 | );;\n> 15 | export default var CommentForm = React.createClass({\n     |                ^\n  16 |     render: function () {\n  17 |         return (\n  18 |             <div className=\"commentForm\">\n   at n (React.Core.Resources.babel.generated.min.js:1:416)"}   System.Exception {JavaScriptEngineSwitcher.Core.JsRuntimeException}
        Message "Error: unknown: Unexpected token (15:15)\n  13 |     document.getElementById('content')\n  14 | );;\n> 15 | export default var CommentForm = React.createClass({\n     |                ^\n  16 |     render: function () {\n  17 |         return (\n  18 |             <div className=\"commentForm\">\n   at n (React.Core.Resources.babel.generated.min.js:1:416)" string

您需要向组件添加导出。

尝试

export default const CommentForm = React.createClass({
render: function () {
    return (
        <div className="commentForm">
            Hello, world! I am a CommentForm.
  </div>
    );
}

});

尝试 bundling 所有 jsx 文件并在 asp.net 网页中呈现捆绑的 js。

// BundleConfig.cs

bundles.Add(new BabelBundle("~/bundles/main").Include(
    "~/Scripts/React/InvoiceBuilder/InvoiceBuilder.jsx",
    "~/Scripts/React/InvoiceBuilder/App.jsx"      
));

// 示例页面 - 而不是 <script src="@Url.Content("~/Scripts/App.jsx")"></script>

@Scripts.Render("~/bundles/main")


更新:

捆绑工作正常,只需删除 导入行和导出语句。

由于 Reactjs.Net 本身不支持 ES6 模块,如果你想使用模块而不仅仅是单独的文件和 Asp.Net MVC 捆绑,你应该使用模块捆绑器,例如 Webpack.