分享好友 前端技术首页 频道列表

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

react  2023-03-08 17:480

如何实现在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】的文章

展开全文
相关推荐
反对 0
举报 0
评论 0
图文资讯
热门推荐
优选好物
更多热点专题
更多推荐文章
react编译器jsxTransformer,babel
1.JSX是什么JSX其实是JavaScript的扩展,React为了代码的可读性更方便地创建虚拟DOM等原因,加入了一些类似XML的语法的扩展。2.编译器——jsxTransformerJSX代码并不能直接运行,需要将它编译成正常的JavaScript表达式才能运行,jsxTransformer.js就是这一编

0评论2023-03-08892

react-native start 启动错误解决方法
ERRORError watching file for changes: EMFILE{"code":"EMFILE","errno":"EMFILE","syscall":"Error watching file for changes:","filename":null}Error: Error watching file for changes: EMFILE

0评论2023-03-08542

React兄弟组件通信(发布者-订阅者模式)
// eventProxy.js'use strict';const eventProxy = {onObj: {},oneObj: {},on: function(key, fn) {if(this.onObj[key] === undefined) {this.onObj[key] = [];}this.onObj[key].push(fn);},one: function(key, fn) {if(this.oneObj[key] === undefined) {thi

0评论2023-03-08558

React笔记_(7)_react路由 react路由配置
路由路由(routing)是指分组从源到目的地时,决定端到端路径的网络范围的进程。路由器当然是作为一个转发设备出现的,主要是转发数据包来实现网络互联。那么react的路由到底指的是什么呢?举个栗子~~~在网页中点击后,从A页面跳到B页面,跳转过程中url发生变

0评论2023-03-08542

react-native关闭所有黄色警告 react native statusbar
 将以下这两句话加在index.js(入口文件)中,放在AppRegistry.registerComponent('App', () = App)之前即可1 console.ignoredYellowBox = ['Warning: BackAndroid is deprecated. Please use BackHandler instead.','source.uri should not be an empty str

0评论2023-03-08979

react中style的写法 react styles
div style={{width: 20px; height=30px}}style的写法/div 

0评论2023-03-08630

写react vue要规范,结尾的冒号,之间的逗号一定要写规范,写全
写react  vue要规范,结尾的冒号,之间的逗号一定要写规范,写全

0评论2023-03-08869

react 中引入font-awesome
1.https://www.npmjs.com/package/react-fontawesomenpm install --save react-fontawesome   //这里不包含样式,需要引入font-awesome的样式 2.npm install font-awesome//为了用他的样式3.import React, { Component } from 'react';import './index.les

0评论2023-03-08532

【React】react开发vscode插件推荐  
原文地址:https://github.com/xieqingtian/blog/issues/2由于本人主要是做react开发,用的代码编辑器是传说中的宇宙第一前端神器vscode, 所以在这里记录并推荐一些本人开发过程中常用的一些vscode插件帮助开发。1. 代码提示类插件1.1 Reactjs code snippets

0评论2023-03-08684

React16.8的新特性及旧特性 react 新特性
首先简单谈谈react和vue的区别:如果你写过vue,会发现组件的视图指令已编译为修改视图的函数存放在绑定的state里的属性里,所以能够做到靶向修改,而react会以组件为根,重新渲染整个组件子树。所以应避免这些不必要的render。0、setState和shouldComponentU

0评论2023-03-08486

【踩坑】【React】 antd 动态表单获取和设置值
真是个悲伤的故事,由于动态表单里面嵌套动态表单,然后就不知道怎么获取和设置值了,然后公司的小朋友教我了QAQ动态表单为totalStrategy:{strategy:{mainArea:123,mainPublicArea:456,},strategy:{mainArea:123,mainPublicArea:456,}}获取 form.getFieldVal

0评论2023-03-08551

【转】React、Vue访问NotFound
部署完成后,访问没问题,从页面中点击跳转也没问题,但是只要点击刷新或通过浏览器地址栏回车,就会出现404现象!在本地开发中是没有这个问题的,调试的时候一切都是正常的直接访问地址,便会出现404http://www.xxx.com/home/application/list问题原因:刷新

0评论2023-03-08538

图书《React.js实战》代码下载
图书《React.js实战》代码下载链接:https://pan.baidu.com/s/1kep0xsTeSupyr15c3VwmBw 提取码:9pra这个代码经过图书《React.js实战》作者的授权发布,请放心用于学习。禁止本下载代码用于任何形式的商用目的。

0评论2023-03-08318

移动端悬浮框可移动,可回弹,Vue and React
一,首先讲 React的悬浮框示例,可参照链接Demo文档,可参照链接 1. 安装npm install suspend-button -S2. 使用import React, { Component } from 'react'import ReactDOM from 'react-dom'import SuspendButton from 'suspend-button'class App extends Com

0评论2023-03-08650

更多推荐