ReactJs.NET

ReactJs.NET

 

REACTJS

Reactはユーザー・インターフェースを作るためのオープンソースのJavaScriptライブラリです。JSXという新しい実装方法を使ってWebを表示させる場合に素晴らしい応答速度を提供してくれます。Reactでは、ページをリロードせずにデータを切り替える大きいWebアプリを開発できます。Reactの主な目的としては、応答が早い、拡張可能、簡単です。しかし、Reactはアプリのユーザー・インターフェースのみに機能します。ReactはMVCテンプレートのViewに相当します。また、MVCの Angular JSといったフレームワークと他のJavaScriptライブラリを組んで使うことができます。

JSX

Reactにおいては、テンプレートを作るには、純粋なJavaScriptの他に、JSXを使って応答速度を上げます。JSXはJavaScriptにHTMLのコードを作れる言語ですが、JavaScriptとは異なり、静的型付け、すなわち、実行前に、JavaやC++のようにコンパイルされるということです。そのため、不具合はコンパイル時に発現できます。

なぜReactJsを用いるか

  • 簡単性: ReactはJSXと呼ばれる特殊なシンタックスを用いて、HTMLとJavaScriptを組み合わせることができます。
  • 習得容易性: プログラミング知識を持っている方はどなたでもReactのことを容易に理解できます。 Reactを学ぶにはCSS、JS、そしてHTMLの基礎知識さえ持っていればいいです。
  • 仮想DOMを導入したパフォーマンス向上:JSXの要素をレンダリングした時、仮想DOMのオブジェクトは全て更新されます。

REACTJS.NET

ReactJS.NETは、他の環境で動作しますが、C#および、特にASP.NET MVCをはじめとする他の.NET言語にReactを簡単に使うことをサポートしてくれます。ReactJS.NETはASP.NET 4 (MVC 4か5)と ASP.NET Core MVCをサポートしています。他に、ReactJS.NETはマルチプラットフォームであり、LinuxにてMonoあるいは.NET Coreを通して動作します。

ASP.NET Core MVCを使ったReactJS.NETアプリの開発

ASP.NET Core MVCのプロジェクトの作成

 

パッケージインストール

Solution Explorerにあるプロセスを右クリックして、Nuget Package Managerに辿ってから「Manage NuGet Packages…」を選択してください。

「Browse」タブを押下して、以下のパッケージを探してインストールしておいてください。

  • JavaScriptEngineSwitcher.V8
  • React.AspNet
  • JavaScriptEngineSwitcher.V8.Native.win-x64
  • JavaScriptEngineSwitcher.Extensions.MsDependencyInjection

コンフィグ設定

Startup.cs

Startup.csの一番上に以下のコードを追加してください。

using Microsoft.AspNetCore.Http;

using JavaScriptEngineSwitcher.V8;

using JavaScriptEngineSwitcher.Extensions.MsDependencyInjection;

using React.AspNet;

ConfigureServices関数を以下のように修正してください。

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
       services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
       services.AddReact();
       // Make sure a JS engine is registered, or you will get an error!
       services.AddJsEngineSwitcher(options => options.DefaultEngineName =V8JsEngine.EngineName)
              .AddV8();
       services.AddControllersWithViews();
}

Configure関数を以下のように修正してください。

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}
else
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see        https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
 }
 app.UseHttpsRedirection();
 app.UseReact(config =>
 {

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

Views\_ViewImports.cshtmlの一番上に以下のコードを追加してください。

@using React.AspNet

特徴

コンポーネント

  • Reactにおいて、コンポーネントはHTMLのコンポーネントを返却する関数として機能します。
  • コンポーネントは独立した再利用できる部品です。
  • 関数コンポーネントとクラスコンポーネントがあります。
  • コンポーネントは JavaScript の関数と似ていますが、独立してHTMLへRender関数経由で返却します。

最初のコンポーネント作成

App.jsxの作成

App.jsxを以下のようなコードで作成してください。

class FisrtComponent extends React.Component {
render() {
     return (
              <div className="component">
              Hello, world! This is a component.
              </div>
             );
         }
}

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

index.cshtmlを以下のように修正してください。

@{
Layout = null;
}

<html>
<head>
    <title>Hello React</title>
</head>
<body>
 <div id="content"></div>
 <script  src="https://cdnjs.cloudflare.com/ajax/libs/react/16.13.0/umd/react.development.js"></script>
 <script  src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.13.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("~/js/App.jsx")"></script>
</body>
</html>

startup.configのConfigure関数に以下の太い文字のコードを追加してください。

app.UseReact(config =>
{
    config
    .AddScript("~/js/App.jsx");
});

プロジェクト実行

Props

  • Propsはコンポーネントへデータを送信するために使われます。
  • ReactにおいてPropsは引数としてReactコンポーネントに引き継がれます。
  • PropsはHTMLの属性でコンポーネントへ引き継がれます。
  • Propsは値が固定で変更不可です。

Propsの使い方

以下のようにthis.propsを使ってPropsの値を取得してください。

class FisrtComponent extends React.Component {
render() {
        return (
            <div className="Component">
                <h1> Hello, world! This is a component. </h1>
                <h2> This is data from props : {this.props.value}</h2>
            </div>
        );
    }
}

ReactDOM.render(<FisrtComponent value = "Props test" />, document.getElementById('content'))

結果

State

  • Stateはコンポーネント・ツリーのロカール変数と似ています。親コンポーネントのStateを子コンポーネントが使えます。
  • Stateは可変です。
  • Stateは変更した時、コンポーネントが再描画されます。

Stateの使い方

以下のようにStateの属性を作成します。

constructor(props) {
        super(props);
        this.state = {
            brand: "Ford",
            color: "Blue",
            year: 1994
        };
}

以下のようにthis.setStateを使ってStateの値を設定します。

this.setState({ color:"Red" })

以下のようにstateの切り替えに使われるOnclick関数を作成します。

changeColor = () => { this.setState({ color:"Red" }) }

以下のようにイベントをボタンに追加します。

<button
          type="button"
          onClick={this.changeColor}
>Change Color</button>

結果

押下前

押下後

その他の特徴

  • Hook
  • Webpack
  • ES6

参照元