如何使用 RactJS 组件在 ASP.NET CORE MVC 项目上实现客户端

How to implement client-side on ASP.NET CORE MVC project with RactJS Component

提问人:Matteo Pagliarello 提问时间:1/30/2023 最后编辑:Matteo Pagliarello 更新时间:1/31/2023 访问量:384

问:

[编辑]好的,我不明白,如果我使用 ReactDOM.render 在 id=“root” 的 div 中渲染我的类,它可以工作,我可以使用 console.log()。 但是我需要这个组件,即在 Razor 页面中,可以作为道具接收 Razor 模型的一些数据。(例如,用户列表)。因此,我决定使用 @Html.React 来加载组件。但是如果我使用此方法,我可以传递属性,但console.log(不起作用。 我该怎么办? 而且,有一种方法可以在剃须刀页面中使用组件作为“”??

[编辑] 我想做这样的事情,但组件不再显示。

<div id="root">
    <App/>
</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.0/umd/react.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.0/umd/react-dom.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/remarkable/1.7.1/remarkable.min.js"></script>
<script src="@Url.Content("https://unpkg.com/@babel/standalone/babel.min.js")"></script>
<script src="@Url.Content("~/js/app.jsx")" type="text/babel"></script>

我有一个 ASP.NET 核心 MVC 项目,我希望我的 Razor 页面实现 ReactJS 组件。 我可以加载组件应用程序,但是当我尝试使用console.log时,它不起作用。我发现这是因为组件仅在服务器端加载,但我找不到正确的方法来允许我的客户端访问组件并使用 js 在控制台中打印我想要的值。

我尝试的第一个解决方案是点击以下链接: https://reactjs.net/features/server-side-rendering.html

但是当它说要添加:

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

我有 2 个问题:

  1. 不要@Script所以我不得不安装 WebOptimize..但现在它说不能对 Ihtml 字符串进行罚款
  2. 我没有这个'~/bundles/main',那个文件是什么?我必须安装软件包吗?
  3. 使用 ReactInitJavaScript 组件显示,但在检查器中说该组件未定义,并且在类中找不到 React.Component

因此,显示值,但我无法访问控制台。我必须在代码中插入什么才能启用客户端??

_Layout.cshtml:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - SportData</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
    <link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
    
    <link rel="stylesheet" href="~/css/card.css" asp-append-version="true" />
</head>
<body>
     
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>
  

    <script src="~/lib/jquery/dist/jquery.min.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
    
    @await RenderSectionAsync("Scripts", required: false)
</body>

</html>

索引.cshtml

@using Newtonsoft.Json;
@using SportData.Web.Models;
@using System.Web.Optimization;


@model SportContainer


@Html.React("App",new { Property1 = "value1", Property2 = "value2" })

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.0/umd/react.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.0/umd/react-dom.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/remarkable/1.7.1/remarkable.min.js"></script>
@Scripts.Render("~/bundles/main")
@Html.ReactInitJavaScript()
             

App.jsx:

class App extends React.Component{

    componentDidMount() {
        console.log('hi')
    }
    
    render() {
        console.log(this.props)
        const { Property1, Property2 } = this.props

        const handler = (event) => {
            console.log(event);
        }
        return (
            <div>
                <button onClick={handler}> clicca </button>
                {console.log(this.props)}
                <p>Property1: {Property1}</p>
                <p>Property2: {Property2}</p>
                <div className="box">Sono un box</div>
            </div>

            );
    }
}

程序 .cs:

var builder = WebApplication.CreateBuilder(args);
        
        // Add services to the container.
        builder.Services.AddControllersWithViews();

        builder.Services.AddMvc().AddRazorRuntimeCompilation();

        //builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();  
        builder.Services.AddReact();
        builder.Services.AddHttpContextAccessor();
        
        builder.Services.AddJsEngineSwitcher(option => option.DefaultEngineName = V8JsEngine.EngineName).AddV8();
        
        
        var app = builder.Build();
        // configure middleware
        
        // Configure the HTTP request pipeline.
        if (!app.Environment.IsDevelopment())
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }

        app.UseReact(config => {
            config.AddScript("~/js/App.jsx");
        });
        
        ReactSiteConfiguration.Configuration.JsonSerializerSettings.ContractResolver = new DefaultContractResolver();

        
        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");

        app.Run();
        
ReactJS 客户端 控制台:.log

评论


答:

0赞 n_dev 1/30/2023 #1

你必须使用带有 API 的 React JS,这是方式,因为如果你像这样使用 React JS,你就不能制作丰富的 UI,而且包也有问题,但如果你想这样使用,所以你必须这样使用。点击这里

评论

0赞 Matteo Pagliarello 1/31/2023
基本上,我必须在我的 index.cshtml 和类组件中使用“@Html.React()”,将 div 中的相同类呈现到 Layout.cshtml 上......否则我无法访问控制台 .log,对吧?
0赞 Matteo Pagliarello 1/31/2023
不起作用,因为如果我把 ReactDOM....该函数找不到文档。
0赞 n_dev 1/31/2023
好的,首先,您必须将 React 嵌入为 Razor 页面的 JS 库,您必须在脚本部分添加 JS 文件,仅此而已。
0赞 n_dev 1/31/2023
不要使用 @Htm.React(),因为它会使事情变得复杂并且不适合你,所以你也只需添加 js 库并使用 React 做所有的事情路由每件事
0赞 Matteo Pagliarello 1/31/2023
因此,每次我想要在我的剃须刀页面中加入一个组件时,我都必须使用 ReactDOM.render 并有一个 div 来包含它。但是,有没有办法将组件用作标签?例如:“”<App/>“,只是为了没有每次想要组件时都有渲染脚本。