如何实现在react现有项目中嵌入Blazor?

如何,现在,react,现有,项目,嵌入,blazor · 浏览次数 : 384

小编点评

**步骤 1:创建 React 项目** 使用 `npx create-react-app react-debugcd react-debugyarn` 或 `npm i` 创建一个名为 `react-app` 的新项目。 **步骤 2:引入 Blazor 模块** 在 `App.js` 中引入 `BlazorCustomElements.js` 文件: ```javascript import { BlazorCustomElements } from "./BlazorCustomElements.js"; ``` **步骤 3:注册 Blazor 自定义元素** 在 `App.js` 中注册自定义元素: ```javascript builder.RootComponents.RegisterCustomElement("my-blazor-counter", typeof BlazorCustomElements.Index); ``` **步骤 4:在 `BlazorCustomElements.js` 中定义组件** 在 `BlazorCustomElements.js` 中定义一个名为 `BlazorCustomElements` 的自定义组件,并继承 `BlazorComponent`: ```javascript import { Component, Inject } from "microsoft.aspnetcore.components.web"; import { BlazorCustomElement, Input, Output } from "./BlazorCustomElements"; [Component] export class BlazorCustomElements : Component { @Input() title: string; @Input() incrementAmount: number; private count = 0; constructor( [Inject] private el: HTMLElement ) { super(); } render() { return (

@title

Current count: {this.count}

); } private IncrementCount() { this.count += this.incrementAmount; } } ``` **步骤 5:在 `App.js` 中使用 Blazor 自定义元素** 在 `App.js` 中使用 `my-blazor-counter` 组件: ```javascript ``` **运行项目** 运行项目并访问 `localhost:5000` 端口。您应该看到一个名为 "My Blazor Counter" 的组件,它将动态更新当前计数。

正文

如何实现在react现有项目中嵌入Blazor?

目前官方只提供了angular和react俩种示例所以本教程只讲react教程

思路讲解:

首先在现有react项目中我们可能某些组件是在Blazor中完成,但是我们没办法找到怎么在react中轻量级使用blazor组件,可能会有人会使用iframe去加载Blazor项目,但是我不太喜欢这种方式,所以今天问了很多大佬,有大佬说可以直接在react使用Blazor组件的方式,并且找到了文档和示例(其实在Blazor文档中微软已经提到了这个但是由于在文档的在下面的示例中可能没什么人去看 [文档直通车](ASP.NET Core Razor 组件 | Microsoft Learn))

首先流程

  1. 创建react项目

    npx create-react-app react-debug
    cd react-debug
    yarn or npm i
    

    将以下代码添加到App.js

import React, { useState } from 'react';
import logo from './logo.svg';
import './App.css';

function App() {
    const [nextCounterIndex, setNextCounterIndex] = useState(1);
    const [blazorCounters, setBlazorCounters] = useState([]);
    const addBlazorCounter = () => {
        const index = nextCounterIndex;
        setNextCounterIndex(index + 1);
        setBlazorCounters(blazorCounters.concat([{
            title: `Counter ${index}`,
            incrementAmount: index,
        }]));
    };
    const removeBlazorCounter = () => {
        setBlazorCounters(blazorCounters.slice(0, -1));
    };

    return (
        <div className="App">
            <header className="App-header">
                <img src={logo} className="App-logo" alt="logo" />
                <p>
                    <button onClick={addBlazorCounter}>Add Blazor counter</button> &nbsp;
                    <button onClick={removeBlazorCounter}>Remove Blazor counter</button>
                </p>
    
                {blazorCounters.map(counter =>
                    <div key={counter.title}>
                        <my-blazor-counter title={counter.title} increment-amount={counter.incrementAmount}></my-blazor-counter> // 这里将是渲染razor组件的地方 `my-blazor-counter` 是在razor中定义的,会在下面讲到 
                    </div>
                )}
    
            </header>
        </div>
    );
}
export default App;

将以下引用添加到public/index.htmlMicrosoft.AspNetCore.Components.CustomElements/BlazorCustomElements.js是Microsoft.AspNetCore.Components.CustomElements 生成的

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="theme-color" content="#000000" />
    <meta
      name="description"
      content="Web site created using create-react-app"
    />
    <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
    <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
    <title>React App</title>
  </head>
  <body>
    <noscript>You need to enable JavaScript to run this app.</noscript>
    <div id="root"></div>
    <script src="_content/Microsoft.AspNetCore.Components.CustomElements/BlazorCustomElements.js"></script> 
    <script src="_framework/blazor.webassembly.js"></script>
  </body>
</html>

  1. 创建WebAssembly项目
	mkdir webassembly 
	cd webassembly
	dotnet new blazorwasm-empty 

WebAssembly文件夹 并且在文件夹中创建 WebAssembly的空项目
需要确保项目是7.0 因为目前只支持6的预览和7的正式版
安装 Microsoft.AspNetCore.Components.CustomElements

	    <PackageReference="Microsoft.AspNetCore.Components.CustomElements" Version="7.0.2" />

Microsoft.AspNetCore.Components.CustomElements 是提供组件化的主要实现

修改Program.cs的代码

using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;

var builder = WebAssemblyHostBuilder.CreateDefault(args);
// BlazorApp.Pages.Index可以修改成自己的渲染的razor组件
// my-blazor-counter就是上面提到的razor对应的标记 这样就可以在react通过my-blazor-counter去渲染BlazorApp.Pages.Index组件的内容了
builder.RootComponents.RegisterCustomElement<webassembly.Pages.Index>("my-blazor-counter");
builder.RootComponents.Add<HeadOutlet>("head::after");

await builder.Build().RunAsync();

webassembly.Pages.Index组件相关代码

<h1>@Title</h1>

<p role="status">Current count: @currentCount</p>
<p>Increment amount: @IncrementAmount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>

@code {
    private int currentCount = 0;
    
    [Parameter] public string Title { get; set; } = "Blazor Counter";
    [Parameter] public int? IncrementAmount { get; set; }

    private void IncrementCount()
    {
        currentCount += IncrementAmount.GetValueOrDefault(1);
    }
}

<style>
    button {
        font-weight: bold;
        background-color: #7b31b8;
        color: white;
        border-radius: 4px;
        padding: 4px 12px;
        border: none;
    }

    button:hover {
        background-color: #9654cc;
        cursor: pointer;
    }

    button:active {
        background-color: #b174e4;
    }

</style>

如何查看运行效果:

如果需要查看运行效果有很多种方式比如通过代码将Blazor和react的代理到一块这样就可以一边修改一边预览,

但是我现在做最简单的
先将react build生成

yarn build

将build目录下面的所有文件拷贝到webassembly\wwwroot下,并且覆盖index.html

然后执行dotnet程序 在webassembly目录下执行

dotnet watch

将会打开浏览器 ,效果入下图,我们可以添加 Add Blazor counter

效果将是这样,可以点击Click me将会条件 Current count数量 点击Remove Blazor counter将会删除razor组件

好了效果差不多是这样字,

通过这个案例我们可以知道 blazor也可以像react那样嵌入在任何的现有项目中,并且使用方便,如果是vue的话目前还不知道是否支持 目前官方只提供了angular和react俩种实现,并且支持webassembly和server,当前教程是WebAssembly的实践,Server会有所差异,

结尾

项目地址:239573049/Use-blazor-in-react (github.com)
官方示例: github地址
技术交流群:737776595
微信交流群:

来着token的分享;

与如何实现在react现有项目中嵌入Blazor?相似的内容:

如何实现在react现有项目中嵌入Blazor?

如何实现在react现有项目中嵌入Blazor? 目前官方只提供了angular和react俩种示例所以本教程只讲react教程 思路讲解: 首先在现有react项目中我们可能某些组件是在Blazor中完成,但是我们没办法找到怎么在react中轻量级使用blazor组件,可能会有人会使用iframe

基于ReAct机制的AI Agent

当前,在各个大厂纷纷卷LLM的情况下,各自都借助自己的LLM推出了自己的AI Agent,比如字节的Coze,百度的千帆等,还有开源的Dify。你是否想知道其中的原理?是否想过自己如何实现一套AI Agent?当然,借助LangChain就可以。

如何使用Java + React计算个人所得税?

**前言** 在报表数据处理中,Excel公式拥有强大而多样的功能,广泛应用于各个业务领域。无论是投资收益计算、财务报表编制还是保险收益估算,Excel公式都扮演着不可或缺的角色。传统的做法是直接依赖Excel来实现复杂的业务逻辑,并生成相应的Excel文件。因此只需在预设位置输入相应参数,Exce

如何编写难以维护的React代码?耦合组件

# 如何编写难以维护的React代码?耦合组件 在许多项目中,我们经常会遇到一些难以维护的React代码。其中一种常见的情况是:子组件直接操作父组件方法,从而导致父子组件深度耦合。这样的实现让子组件过于依赖父组件的具体实现细节,使得代码难以维护和扩展。 让我们来看一个例子: ```jsx funct

一个.NET 7 + DDD + CQRS +React+Vite的实战项目

## 项目简介 基于SignalR实现聊天通信,支持横向扩展,可支撑上万用户同时在线聊天 ## 快速体验 http://server.tokengo.top:8888/ 可在这里快速体验使用,请注意目前只适配了PC端,请勿使用手机访问,可能出现样式不适应的情况, 当然如果你想要自己部署也可以,目前提

项目完成小结 - Django-React-Docker-Swag部署配置

前言 最近有个项目到一段落,做个小结记录。 内容可能会多次补充,在博客上实时更新哈~ 如果是在公众号阅读这篇文章,可以点击「查看原文」访问最新版本~ 这个项目是前后端分离,后端为了快,依然用我的DjangoStarter框架。前端一开始是小程序,后面突然换成公众号H5的形式,还好我用了Taro,大差

超级实用!React-Router v6实现页面级按钮权限

大家好,我是王天~ 今天咱们用 reac+reactRouter来实现页面级的按钮权限功能。这篇文章分三部分,实现思路、代码实现、踩坑记录。 嫌啰嗦的朋友,直接拖到第二章节看代码哦。 前言 通常情况下,咱们为用户添加权限时,除了页面权限,还会细化到按钮级别,比如、新增、删除、查看等权限。 如下效果,

前端使用 Konva 实现可视化设计器(9)- 另存为SVG

请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 Bug,欢迎来提 Issue 哟~ github源码 gitee源码 示例地址 另存为SVG 这一章增强了另存为的能力,实现“另存为SVG”,大概是全网唯一的实例分享了吧。 灵感来源:react-konva-custom-context

Spring缓存是如何实现的?如何扩展使其支持过期删除功能?

我们希望将这些rpc结果数据缓存起来,并在一定时间后自动删除,以实现在一定时间后获取到最新数据。类似Redis的过期时间。本文是我的调研步骤和开发过程。

新知识get,vue3是如何实现在style中使用响应式变量?

前言 vue2的时候想必大家有遇到需要在style模块中访问script模块中的响应式变量,为此我们不得不使用css变量去实现。现在vue3已经内置了这个功能啦,可以在style中使用v-bind指令绑定script模块中的响应式变量,这篇文章我们来讲讲vue是如何实现在style中使用script