目錄
Hello World!
mainText
topicText:
mainText:{this.props.mainText}
topicText:{this.props.topicText}
首頁 web前端 js教程 react如何配置開發環境? React+webpack 的開發環境設定步驟(結果篇)

react如何配置開發環境? React+webpack 的開發環境設定步驟(結果篇)

Sep 11, 2018 am 11:12 AM
react

本篇文章主要講述了關於react webpack的開發環境設定步驟最後結果篇。下面讓我們一起來看這篇文章吧

設定步驟(一):React如何設定開發環境? React webpack開發環境設定步驟(附設定實例)

設定步驟(二):  react如何設定開發環境? React webpack 的開發環境設定步驟(深入篇)

這裡先講每一步的原因和做法。設定步驟(四)會講怎麼快速搭建webpack,同時會把整個專案套件分享到git上。

目錄 
四、React 設定 
1. React 元件
2. React router 模組
3. React 與Redux 搭配


#在前面的文章已經講解怎麼配置了整個webpack環境。後面會有一篇文章講怎麼快速搭建webpack。

1. React 元件

先用node.js安裝react 和react-dom 模組:

1

npm install react react-dom --save

登入後複製

在webpack.dll.config.js裡面的vendors 陣列裡面加入react-dom 第三函式庫

1

2

const vendors = [ 

  'react',  "react-dom"];

登入後複製
登入後複製

在Powershell 視窗裡面敲下面指令,把第三方函式庫打包到dll裡面。

1

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

登入後複製
登入後複製
登入後複製

指令完成後,會更新manifest.json 和vendor.xxxx.js。這時需要手動刷新html 模板裡面引進的vendor.xxxx.js檔。

修改app.js裡面的內容,加入reactdom 的渲染語句:

1

2

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]);

登入後複製

//下面的是react的程式碼

1

2

3

4

5

6

7

8

9

10

11

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 router 模組

先安裝對應的模組:react-router-dom,指令:

1

npm install react-router-dom --save

登入後複製

這個模組同樣需要加入到webpack.dll.config.js 裡面的vendors 陣列裡面加入react-dom 第三函式庫

1

2

const vendors = [ 

  &#39;react&#39;,  "react-dom"];

登入後複製
登入後複製

在Powershell 視窗裡面敲下面指令,把第三方函式庫打包到dll裡面。

1

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

登入後複製
登入後複製
登入後複製

指令完成後,會更新manifest.json 和vendor.xxxx.js。這時需要手動刷新html 模板裡面引進的vendor.xxxx.js檔。

修改app.js裡面的內容:

1

2

3

4

5

6

7

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;));

登入後複製

現在的router 有兩個版本,用react-router 或react-router-dom 。這裡用react-router-dom,這個模組有幾個介面:NavLink 、Route 、BrowserRouter、HashRouter、Swith、Redirect 等 。每個介面的作用我這不做說明。 RouteConfig 是路由配置文件,自己創建的。

現在需要建立幾個文件,
  1) 在根目錄建立Config資料夾,資料夾裡面建立Route.jsx。
       Route.jsx 的內容:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

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)在根目錄下建立component 資料夾,資料夾下建立兩個檔案:
Main.jsx:

1

2

3

4

5

6

7

8

9

10

11

12

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

1

2

3

4

5

6

7

8

9

10

11

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 的開發環境設定步驟(結果篇)

點擊jumpe to Topic ,就會跳到topic  頁面:
react如何配置開發環境? React+webpack 的開發環境設定步驟(結果篇)

這樣webpack react router 就這樣簡單的設定好了。

3.React 和Redux 搭配

Redux 模組可以集中管理 react全部元件的state,這個技巧很常用。
安裝Redux模組,指令:

1

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

登入後複製

模組安裝好後,在需要在webpack.dll.config.js 裡面修改vendors的內容:

1

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

登入後複製

在Powershell 視窗下,敲:

1

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

登入後複製
登入後複製
登入後複製

在build 路徑下會再次產生manifest.json 和vendor.xxxxx.js文件,把對應的vendor.xxxxx.js檔案引入index.html範本檔案中。

要使用redux,需要先理解它的基本原理,這裡我簡單的說下,具體的可以百度了解下。
redux 主要分為三塊,store reducer action。
store 用來儲存component裡面需要集中管理的state;
action 是定義與state狀態改變相關的一系列方法(方法也稱為action creator);
reducer 初始化state及呼叫action的方法修改state的狀態,傳回新state。
這三者之間的用什麼相互關聯的,下面步驟講解裡面會有提及。

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

1

2

3

4

5

6

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代码:

1

2

3

4

5

6

7

8

9

10

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的代码:

1

2

3

4

5

6

7

8

9

10

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 存在兼容问题,在网上查了下资料,需要额外添加下面这段代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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参考手册栏目中学习)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

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 代码:

1

2

3

4

5

6

7

8

9

10

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的代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1319
25
PHP教程
1269
29
C# 教程
1248
24
如何利用React和RabbitMQ建立可靠的訊息應用 如何利用React和RabbitMQ建立可靠的訊息應用 Sep 28, 2023 pm 08:24 PM

如何利用React和RabbitMQ建立可靠的訊息傳遞應用程式引言:現代化的應用程式需要支援可靠的訊息傳遞,以實現即時更新和資料同步等功能。 React是一種流行的JavaScript庫,用於建立使用者介面,而RabbitMQ是一種可靠的訊息傳遞中間件。本文將介紹如何結合React和RabbitMQ建立可靠的訊息傳遞應用,並提供具體的程式碼範例。 RabbitMQ概述:

React Router使用指南:如何實現前端路由控制 React Router使用指南:如何實現前端路由控制 Sep 29, 2023 pm 05:45 PM

ReactRouter使用指南:如何實現前端路由控制隨著單頁應用的流行,前端路由成為了一個不可忽視的重要部分。 ReactRouter作為React生態系統中最受歡迎的路由庫,提供了豐富的功能和易用的API,使得前端路由的實作變得非常簡單和靈活。本文將介紹ReactRouter的使用方法,並提供一些具體的程式碼範例。安裝ReactRouter首先,我們需要

PHP、Vue和React:如何選擇最適合的前端框架? PHP、Vue和React:如何選擇最適合的前端框架? Mar 15, 2024 pm 05:48 PM

PHP、Vue和React:如何選擇最適合的前端框架?隨著互聯網技術的不斷發展,前端框架在Web開發中起著至關重要的作用。 PHP、Vue和React作為三種代表性的前端框架,每一種都具有其獨特的特徵和優勢。在選擇使用哪種前端框架時,開發人員需要根據專案需求、團隊技能和個人偏好做出明智的決策。本文將透過比較PHP、Vue和React這三種前端框架的特徵和使

Java框架與前端React框架的整合 Java框架與前端React框架的整合 Jun 01, 2024 pm 03:16 PM

Java框架與React框架的整合:步驟:設定後端Java框架。建立專案結構。配置建置工具。建立React應用程式。編寫RESTAPI端點。配置通訊機制。實戰案例(SpringBoot+React):Java程式碼:定義RESTfulAPI控制器。 React程式碼:取得並顯示API回傳的資料。

如何利用React開發一個響應式的後台管理系統 如何利用React開發一個響應式的後台管理系統 Sep 28, 2023 pm 04:55 PM

如何利用React開發一個響應式的後台管理系統隨著互聯網的快速發展,越來越多的企業和組織需要一個高效、靈活、易於管理的後台管理系統來處理日常的操作事務。 React作為目前最受歡迎的JavaScript庫之一,提供了一種簡潔、高效和可維護的方式來建立使用者介面。本文將介紹如何利用React開發一個響應式的後台管理系統,並給出具體的程式碼範例。建立React專案首先

vue.js vs.反應:特定於項目的考慮因素 vue.js vs.反應:特定於項目的考慮因素 Apr 09, 2025 am 12:01 AM

Vue.js適合中小型項目和快速迭代,React適用於大型複雜應用。 1)Vue.js易於上手,適用於團隊經驗不足或項目規模較小的情況。 2)React的生態系統更豐富,適合有高性能需求和復雜功能需求的項目。

React在HTML中的作用:增強用戶體驗 React在HTML中的作用:增強用戶體驗 Apr 09, 2025 am 12:11 AM

React通過JSX與HTML結合,提升用戶體驗。 1)JSX嵌入HTML,使開發更直觀。 2)虛擬DOM機制優化性能,減少DOM操作。 3)組件化管理UI,提高可維護性。 4)狀態管理和事件處理增強交互性。

react有哪些閉包 react有哪些閉包 Oct 27, 2023 pm 03:11 PM

react有事件處理函數、useEffect和useCallback、高階元件等等閉包。詳細介紹:1、事件處理函數閉包:在React中,當我們在元件中定義事件處理函數時,函數會形成一個閉包,可以存取元件作用域內的狀態和屬性。這樣可以在事件處理函數中使用元件的狀態和屬性,實現互動邏輯;2、useEffect和useCallback中的閉包等等。

See all articles