検索
ホームページウェブフロントエンドjsチュートリアルReact開発環境を構成するにはどうすればよいですか? React+webpack 開発環境の構成手順 (結果)

この記事では主に react+webpack の開発環境設定手順の最終結果について説明します。この記事を一緒に見てみましょう

設定手順(1):Reactの開発環境を設定するにはどうすればよいですか? React+webpack 開発環境の設定手順 (設定例付き)

設定手順 (2): React の開発環境を設定するにはどうすればよいですか? React+webpack 開発環境の構成手順 (詳細記事)

ここでは、まず各手順の理由と実践方法を説明します。構成ステップ (4) では、Webpack を迅速に構築し、プロジェクト パッケージ全体を git に共有する方法について説明します。

ディレクトリ
4. Reactの設定
1. Reactコンポーネント
2. ReactとReduxの連携


前回の記事では、Webpack環境全体の設定方法を説明しました。 Webpack をすばやくビルドする方法については、後ほど記事で紹介します。

1. Reactコンポーネント

まずnode.jsを使用してreactモジュールとreact-domモジュールをインストールします:

npm install react react-dom --save

webpack.dll.config.jsのベンダー配列にreact-domの3番目のライブラリを追加します

const vendors = [  
  'react',  "react-dom"];

Powershell ウィンドウで次のコマンドを実行して、サードパーティのライブラリを dll にパッケージ化します。

webpack -p --config webpack.dll.config.js --progress --profile --colors

コマンド完了後、manifest.jsonとvendor.xxxx.jsが更新されます。 この時点で、HTML テンプレートに導入された Vendor.xxxx.js ファイルを手動で更新する必要があります。

app.js のコンテンツを変更し、reactdom のレンダリング ステートメントを追加します:

require('./css/css');require('./less/less.less');require('./scss/scss.scss');var app=document.createElement("p");
app.innerHTML=&#39;<h1 id="Hello-nbsp-World">Hello World!</h1>&#39;;document.body.insertBefore(app,document.body.childNodes[0]);

//以下は反応コードです

​​

import React from &#39;react&#39;;
import ReactDOM from &#39;react-dom&#39;;class FirstComponent extends React.Component{
    render(){      return(
          <p>             this is React code from Components.          
          </p>
      );  
    }
}
var p=document.createElement("p");p.setAttribute("id","root");
document.body.insertBefore(p,document.body.childNodes[1]);
ReactDOM.render(<FirstComponent/>,document.getElementById(&#39;root&#39;));

powershell で npm start と入力してサーバーを起動し、ブラウザで localhost:8080 と入力して表示しますこのページの内容。

2. Reactルーターモジュール

まず、対応するモジュールをインストールします:react-router-dom、コマンド:

npm install react-router-dom --save

このモジュールもwebpack.dll.config.jsのベンダー配列に追加し、reactを追加する必要があります-dom 3 番目のライブラリ

const vendors = [  
  &#39;react&#39;,  "react-dom"];

Powershell ウィンドウに次のコマンドを入力して、サードパーティ ライブラリを dll にパッケージ化します。

webpack -p --config webpack.dll.config.js --progress --profile --colors

コマンド完了後、manifest.jsonとvendor.xxxx.jsが更新されます。 この時点で、HTML テンプレートに導入された Vendor.xxxx.js ファイルを手動で更新する必要があります。

app.js のコンテンツを変更します:

import React from &#39;react&#39;;import ReactDOM from &#39;react-dom&#39;;import {NavLink,Route,BrowserRouter,HashRouter as Router, Swith,Redirect} from &#39;react-router-dom&#39;;import RouteConfig from &#39;../Config/Route.jsx&#39;;var p=document.createElement("p");
p.setAttribute("id","root");document.body.insertBefore(p,document.body.childNodes[1]);
ReactDOM.render(
    <Router>
        {RouteConfig}
    </Router>
    ,document.getElementById(&#39;root&#39;));

ルーターには現在 2 つのバージョンがあり、react-router または reverse-router-dom を使用します。ここでは React-router-dom が使用されています。このモジュールには、NavLink、Route、BrowserRouter、HashRouter、Swith、Redirect などのいくつかのインターフェイスがあります。各インターフェースの機能については説明しません。 RouteConfig は、自分で作成したルーティング設定ファイルです。

次に、いくつかのファイルを作成する必要があります。

1) ルートディレクトリに Config フォルダーを作成し、そのフォルダー内に Route.jsx を作成します。
Route.jsx の内容:

import React from &#39;react&#39;;
import ReactDOM from &#39;react-dom&#39;;
import {NavLink,Route,BrowserRouter as Router,HashRouter,Switch,Redirect}  from &#39;react-router-dom&#39;;

import MainComponent from &#39;../component/Main.jsx&#39;;//引进组件import Topic from &#39;../component/Topic.jsx&#39;;//引进组件const routes =[
    {
        path:&#39;/&#39;,
        exact:true,
        component: MainComponent
    },
    {
        path:&#39;/topic&#39;,
        exact:false,
        component:Topic
    },
];const RouteConfig = (
    <Switch>
    {
      routes.map((route,index)=>(
                  <Route
                   key ={index}
                   path={route.path}
                   exact={route.exact}
                   component={route.component}                
                  />
                ))
    }
    </Switch>
);
export default RouteConfig;

2) ルート ディレクトリにコンポーネント フォルダーを作成し、そのフォルダーの下に 2 つのファイルを作成します:

Main.jsx:

import React from &#39;react&#39;;import ReactDOM from &#39;react-dom&#39;;import {NavLink as Link} from &#39;react-router-dom&#39;;class MainComponent extends React.Component{
    render(){      return(
          <p>
             <h1 id="mainText">mainText</h1>    

             <Link to="/topic">jumpe to Topic</Link>         
          </p>
      );  
    }
}

export default MainComponent;

Topic.jsx

import React from &#39;react&#39;;import ReactDOM from &#39;react-dom&#39;;import {NavLink as Link} from &#39;react-router-dom&#39;;class Topic extends React.Component{
    render(){      return(
          <p>
              <h1 id="topicText">topicText:</h1>         
              <Link to="/">jumpe to Main</Link>         
          </p>
      );  
    }
}

export default Topic;

完了したら、PowerShell ウィンドウに「npm start」と入力し、ブラウザのアドレス バーに「localhost:8080」と入力します。 次のページが表示されます:


React開発環境を構成するにはどうすればよいですか? React+webpack 開発環境の構成手順 (結果)

「トピックにジャンプ」をクリックします。トピックページにジャンプします:


React開発環境を構成するにはどうすればよいですか? React+webpack 開発環境の構成手順 (結果)

このようにして、webpack 反応ルーターは簡単に設定されます。

3. React と Redux は連携します

Redux モジュールは、すべての React コンポーネントの状態を集中管理できます。このテクノロジーは非常によく使用されます。

Redux モジュールをインストールします。コマンド:

 npm install redux react-redux react-router-redux redux-thunk --save

モジュールがインストールされたら、webpack.dll.config.js のベンダーのコンテンツを変更する必要があります:

const vendors = [  &#39;react&#39;,  "react-dom",  "react-router-dom",  "redux",  "react-redux",  "react-router-redux",  "redux-thunk"];

Powershell ウィンドウで、次のように入力します:

webpack -p --config webpack.dll.config.js --progress --profile --colors

ビルド パスのmanifest.jsonおよびvendor.xxxxx.jsファイルの下に再度、対応するvendor.xxxxx.jsファイルをindex.htmlテンプレート ファイルに導入します。

redux を使用するには、まずその基本原理を理解する必要があります。ここで簡単に説明します。詳しくは、Baidu でご覧ください。

Redux は主に 3 つの部分、ストア リデューサー アクションに分かれています。
store はコンポーネント内で集中管理が必要な状態を保存するために使用されます。
action は状態の変更に関連する一連のメソッドを定義します (メソッドはアクション クリエーターとも呼ばれます)。
reducer は状態を初期化し、状態を変更するためのアクション メソッドを呼び出します。状態を取得し、新しい状態を返します。
これら 3 つの相互関係については、次の手順で説明します。

store 一般会采用自动创建的方法。react组件可以通过函数直接上传给store,上传代码是直接写在组件里面,不需要添加一个组件就修改一次store的代码。
store 的中间件用来实现异步调用,这里用ReduxThunk。这个中间件的优缺点,暂时不涉及。
在src 目录下创建一个Config 文件夹,在Config 里面新建一个Store.jsx。
Store.jsx 的代码:

import {createStore,combineReducers,applyMiddleware} from &#39;redux&#39;;
import RootReducer from &#39;../Reducer/index.jsx&#39;;//引入reduceimport ReduxThunk from &#39;redux-thunk&#39;;//中间件var store = createStore(    //自动生成store的函数
    RootReducer, //reduce,修改state状态的函数集合
    applyMiddleware(ReduxThunk) //中间件);

export default store;

RootReducer是自己定义的reduce文件。createStore applyMiddleware 来自redux 模块。 ReduxThunk 来自于redux-thunk。
store 和 reducer 是通过createStore 关联起来的。

action
在src下面创建一个action文件夹,action文件夹下新建一个action.jsx文件。
action代码:

const actions = {

 changeText:function(num){
     console.log("调用actions");      switch(num){      case 1:      return {type:&#39;AlterMain&#39;,payload:"mainContainer had been changed"};      case 2:       return {type:&#39;AlterTopic&#39;,payload:"topicContainer had been changed"};       default:       return action;

   }
},

};
export default actions;

预先规划设定state格式为:
const defaultState = { //在reducer 里面定义state的初始的值
  mainText:”mainContainer”,
  topicText:”topicContainer”

};
action这里定义了一个修改state状态的函数。当reducer调用action时,action就会通过不同的情况返回不同的action值。

reducer:
在src文件夹下面创建一个Reducer文件夹,文件夹下面新建一个index.jsx文件。
reducer的代码:

import {combineReducers} from &#39;redux&#39;;import {routerReducer} from &#39;react-router-redux&#39;;const defaultState = {//设定state的默认值
   mainText:"mainContainer",
   topicText:"topicContainer"};const reducer = (state = defaultState, action) => {     
    switch (action.type) {//通过action的返回值来选择更新哪个state的状态
        case &#39;AlterMain&#39;:            return  Object.assign({},state,{ mainText:action.payload});        case &#39;AlterTopic&#39;:            return  Object.assign({},state,{ topicText:action.payload});        default:            return state;
    }
};const RootReducer = combineReducers({//可以定义多个reducer,然后通过combineReducers来合并
    routing:routerReducer,//redux和router处理函数
    app:reducer      //app 需要与组件里面上传的state一致});
export default RootReducer;

reducer 只看到 通过action返回值来修改state的状态并没有看到调用action。
在调试移动端显示的时候,发现object.assign 存在兼容问题,在网上查了下资料,需要额外添加下面这段代码:

if (typeof Object.assign != &#39;function&#39;) {    // Must be writable: true, enumerable: false, configurable: true
    Object.defineProperty(Object, "assign", {
      value: function assign(target, varArgs) { // .length of function is 2        &#39;use strict&#39;;        if (target == null) { // TypeError if undefined or null
          throw new TypeError(&#39;Cannot convert undefined or null to object&#39;);
        }        var to = Object(target);        for (var index = 1; index < arguments.length; index++) {          var nextSource = arguments[index];          if (nextSource != null) { // Skip over if undefined or null
            for (var nextKey in nextSource) {              // Avoid bugs when hasOwnProperty is shadowed
              if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
                to[nextKey] = nextSource[nextKey];
              }
            }
          }
        }        return to;
      },
      writable: true,
      configurable: true
    });
  }

组件的定义:
修改component文件夹下的Main.jsx(想看更多就到PHP中文网React参考手册栏目中学习)

import React from &#39;react&#39;;import ReactDOM from &#39;react-dom&#39;;import {NavLink as Link} from &#39;react-router-dom&#39;;import {connect} from &#39;react-redux&#39;;import P from &#39;prop-types&#39;;import actions from &#39;../src/action/action.jsx&#39;;//引入actions//mapstoreStateToProps 这里指定Main控件需要上传的stateconst mapStoreStateToProps = (state) =>(
    {
         mainText:state.app.mainText, //mainText是变量,值对应的state.app.mainText的存储空间,其中app与reducers里面定义的一致。

    }
);//mapDispatchToProps 这里上传处理state函数,即action里面定义的函数const mapDispatchToProps = (dispatch,ownProps)=> ({
   fn:{
       changeText:(num)=> dispatch(actions.changeText(num))
   }
});//这样state一致上传到store,需要取值用props取就okclass MainComponent extends React.Component{
    render(){      return(
          <p>
             <h1 id="mainText-this-props-mainText">mainText:{this.props.mainText}</h1>        
             <button onClick={()=>this.props.fn.changeText(1)}>修改mainText的值</button>

             <Link to="/topic">jumpe to Topic</Link>         
          </p>
      );  
    }
}//最后调用connect函数,把组件和store连接起来export default connect(mapStoreStateToProps,mapDispatchToProps)(MainComponent);

connect 函数能成功执行的前提是 组件是provider的子组件。所有需要修改app.js 。
app.js 代码:

import React from &#39;react&#39;;import ReactDOM from &#39;react-dom&#39;;import {NavLink,Route,BrowserRouter,HashRouter as Router, Swith,Redirect} from &#39;react-router-dom&#39;;import RouteConfig from &#39;../src/Config/Route.jsx&#39;;import {Provider} from &#39;react-redux&#39;;import store from &#39;../src/Config/Store.jsx&#39;;var p=document.createElement("p");
p.setAttribute("id","root");document.body.insertBefore(p,document.body.childNodes[0]);

ReactDOM.render(
    <Provider store={store}> //Provider 并指定store的文件
        <Router>
            {RouteConfig}
        </Router>
    </Provider>
    ,document.getElementById(&#39;root&#39;));

Topic.jsx的代码:

import React from &#39;react&#39;;import ReactDOM from &#39;react-dom&#39;;import {NavLink as Link} from &#39;react-router-dom&#39;;import {connect} from &#39;react-redux&#39;;import actions from &#39;../src/action/action.jsx&#39;;const mapStoreStateToProps = (state) =>(
    {         topicText:state.app.topicText,

    }
)const mapDispatchToProps = (dispatch,ownProps)=> ({   fn:{       changeText:(num)=> dispatch(actions.changeText(num))
   }
});class Topic extends React.Component{
    render(){      return(
          <p>
              <h1 id="topicText-this-props-topicText">topicText:{this.props.topicText}</h1>
              <button onClick={()=>this.props.fn.changeText(2)}>修改topicText的值</button>       
              <Link to="/">jumpe to Main</Link>         
          </p>
      );  
    }
}export default connect(mapStoreStateToProps,mapDispatchToProps)(Topic);

这样整个redux就搭建好了。

provider 指定 store文件,它下面的组件可以通过connect 把组件和store关联。
store:通过createStore 把 store和reducer 关联
reducer: 定义state的默认值,并定义state 和action的对应关系。combineReducers 合并reducer,指定reducer的接口,如果用到router时,要注意定义route的处理函数。
action:只是单独定义一些修改state状态的操作。
组件:通过connect 把需要集中管理的state即state对应的action 上传到store,并绑定组件。state的值被修改,组件的view就会做相应的改变

这里没有涉及到redux的异步通信。
流程可以简化理解为:
组件->action->dispath(action)->store->reducer ->store(修改state)->组件(view)

网页的整体效果如下:
用http://localhost:8080 就能看到下面的界面:
React開発環境を構成するにはどうすればよいですか? React+webpack 開発環境の構成手順 (結果)

点击修改mainText的值 的按钮,mainText就会被更改如下:
React開発環境を構成するにはどうすればよいですか? React+webpack 開発環境の構成手順 (結果)点击jumpe to Topic
React開発環境を構成するにはどうすればよいですか? React+webpack 開発環境の構成手順 (結果)

点击 修改topicText的值 的按钮,topicText就会被更改如下:
React開発環境を構成するにはどうすればよいですか? React+webpack 開発環境の構成手順 (結果)

本篇文章到这就结束了(想看更多就到PHP中文网React使用手册栏目中学习),有问题的可以在下方留言提问。

以上がReact開発環境を構成するにはどうすればよいですか? React+webpack 開発環境の構成手順 (結果)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
react中canvas的用法是什么react中canvas的用法是什么Apr 27, 2022 pm 03:12 PM

在react中,canvas用于绘制各种图表、动画等;可以利用“react-konva”插件使用canvas,该插件是一个canvas第三方库,用于使用React操作canvas绘制复杂的画布图形,并提供了元素的事件机制和拖放操作的支持。

react中antd和dva是什么意思react中antd和dva是什么意思Apr 21, 2022 pm 03:25 PM

在react中,antd是基于Ant Design的React UI组件库,主要用于研发企业级中后台产品;dva是一个基于redux和“redux-saga”的数据流方案,内置了“react-router”和fetch,可理解为应用框架。

React是双向数据流吗React是双向数据流吗Apr 21, 2022 am 11:18 AM

React不是双向数据流,而是单向数据流。单向数据流是指数据在某个节点被改动后,只会影响一个方向上的其他节点;React中的表现就是数据主要通过props从父节点传递到子节点,若父级的某个props改变了,React会重渲染所有子节点。

react中为什么使用nodereact中为什么使用nodeApr 21, 2022 am 10:34 AM

因为在react中需要利用到webpack,而webpack依赖nodejs;webpack是一个模块打包机,在执行打包压缩的时候是依赖nodejs的,没有nodejs就不能使用webpack,所以react需要使用nodejs。

react是组件化开发吗react是组件化开发吗Apr 22, 2022 am 10:44 AM

react是组件化开发;组件化是React的核心思想,可以开发出一个个独立可复用的小组件来构造应用,任何的应用都会被抽象成一颗组件树,组件化开发也就是将一个页面拆分成一个个小的功能模块,每个功能完成自己这部分独立功能。

react和reactdom有什么区别react和reactdom有什么区别Apr 27, 2022 am 10:26 AM

react和reactdom的区别是:ReactDom只做和浏览器或DOM相关的操作,例如“ReactDOM.findDOMNode()”操作;而react负责除浏览器和DOM以外的相关操作,ReactDom是React的一部分。

react中forceupdate的用法是什么react中forceupdate的用法是什么Apr 19, 2022 pm 12:03 PM

在react中,forceupdate()用于强制使组件跳过shouldComponentUpdate(),直接调用render(),可以触发组件的正常生命周期方法,语法为“component.forceUpdate(callback)”。

react有没有双向绑定react有没有双向绑定Apr 21, 2022 am 10:24 AM

react中没有双向绑定;react的设计思想就是单向数据流,没有双向绑定的概念;react是view层,单项数据流只能由父组件通过props将数据传递给子组件,满足了view层渲染的要求并且更易测试与控制,所以在react中没有双向绑定。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境