成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

react+react-router4+redux最新版構(gòu)建分享

weapon / 1844人閱讀

摘要:相關(guān)配置請(qǐng)參考中文文檔。關(guān)于的更多使用方法及理解需要詳細(xì)具體講解,涉及篇幅較大,本文暫不涉及,有興趣可以看文檔中文文檔,我會(huì)整理后再多帶帶章節(jié)分享接下來我們將編寫路由組件這與有一些差別,原來的方法已經(jīng)不再使用,在中或組件從中引入。

??????相信很多剛?cè)肟覴eact的小伙伴們有一個(gè)同樣的疑惑,由于React相關(guān)庫不斷的再進(jìn)行版本迭代,網(wǎng)上很多以前的技術(shù)分享變得不再適用。比如react-touter2react-router4在寫法上存在不少區(qū)別,以前的調(diào)用方法將無法使得項(xiàng)目正常工作。我最近用React全家桶在構(gòu)建一個(gè)spa,由于官方文檔給的比較繁瑣,使用類似react-cli的腳手架工具會(huì)使你的理解停留在表面,能用單反相機(jī)就不用傻瓜相機(jī)~~最好還是自己動(dòng)手豐衣足食。在這里希望能用通俗易懂的方式來說一下如何快速構(gòu)建spa。(PS:此文旨在讓大家少走彎路,因此在項(xiàng)目結(jié)構(gòu)上力求全而簡(jiǎn))

在此之前你先需要懂得基本的 nodejs 操作與 ES2015 語法。
通過npm安裝webpack:npm install webpack,然后用node運(yùn)行配配置文件(這里并非絕對(duì),也可以直接在cmd里運(yùn)行,但不推薦)

首先給出項(xiàng)目結(jié)構(gòu):

--component    //組件文件夾
  ?--hello.jsx    //組件jsx
  --more-component  //嵌套組件可以放在次級(jí)目錄
--js
  ?--common.js    //自己常用的js方法,
--css            
  ?--hello.css   //每個(gè)組件對(duì)應(yīng)一個(gè)css文件,便于管理
--img
--route
  ?--router.jsx    //路由配置組件
--store            //redux相關(guān)
  ?--action.js     //狀態(tài)發(fā)起動(dòng)作方法
  ?--reducer.js    //接受動(dòng)作后改變狀態(tài)
entry.jsx          //打包入口
temp.html         //打包模板html
webpack.config.js  //webpack配置

項(xiàng)目結(jié)構(gòu)根據(jù)個(gè)人習(xí)慣可以修改,但原則上要保持條理清晰,有時(shí)候還要根據(jù)項(xiàng)目結(jié)構(gòu)修改webpack配置等。

接下來配置webpack,同時(shí)npm安裝所需要的 loader。webpack相關(guān)配置請(qǐng)參考webpack中文文檔。本章不多做贅述。
給出一個(gè)簡(jiǎn)單配置:
webpack.config.js

const webpack = require("webpack");
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");

const compiler = webpack({
    entry: "./entry.jsx",
    output:{
        path: path.resolve(__dirname, "./dist"),
        filename:"code.min.js"
    },
    module:{
        rules:[
            {
                test:/.css$/,
                include:[path.resolve(__dirname, "./")],
                loader:"style-loader!css-loader"
            },
            {
                test:/.js$/,
                include:[path.resolve(__dirname, "./")],
                loader:"babel-loader",
                options: {
                    presets: ["es2015","stage-0"]
                }
            },
            {
                test:/.jsx$/,
                include:[path.resolve(__dirname, "./")],
                loader:"babel-loader",
                options: {
                    presets: ["es2015","stage-0","react"]
                }
            },
            {
                test: /.(png|jpeg|jpg)$/,
                include:[path.resolve(__dirname, "./img")],
                loader:"file-loader?name=img/[name]-[hash].[ext]"
            }
        ]
    },
    plugins: [
        new HtmlWebpackPlugin({
            template:"./temp.html",
            filename:"./spa.html",
            inject:"body"
        })
    ]
});

const watching = compiler.watch({
    aggregateTimeout: 300,
    poll: undefined
}, (err, stats) => {
    if (err || stats.hasErrors())console.log(stats.compilation.errors);
    else{console.log("success")}
})

當(dāng)編寫好webpack.config.js文件后,我們只需要用node運(yùn)行它,那么當(dāng)我們的react項(xiàng)目改變時(shí)會(huì)自行編譯到一個(gè)自動(dòng)生成的dist文件夾里(建議一定開啟監(jiān)聽文件改變編譯,而不是每次改變后手動(dòng)運(yùn)行webpack.config.js,因?yàn)槟菢訒?huì)很慢!)

做好了這些準(zhǔn)備工作,接下來正式進(jìn)入 React 世界:
entry.js

import React from "react"
import { render } from "react-dom"
import { createStore } from "redux"
import todoApp from "./store/reducers"
import Main from "./route/router.jsx"

let store = createStore(todoApp)

render(
    
, document.body )

上面import的模塊請(qǐng)npm安裝,我們?cè)?b>entry里僅僅創(chuàng)建一個(gè)狀態(tài)管理的store對(duì)象,并且將router.jsx的路由模塊渲染到body中,reducersredux中具體需要更改哪些狀態(tài)的js文件,在creatStore里綁定。(關(guān)于redux的更多使用方法及理解需要詳細(xì)具體講解,涉及篇幅較大,本文暫不涉及,有興趣可以看文檔redux中文文檔,我會(huì)整理后再多帶帶章節(jié)分享)

接下來我們將編寫路由組件
router.jsx

import React from "react"
import { HashRouter as Router,Route } from "react-router-dom"
import { Provider } from "react-redux"

import Hello from "../component/hello.jsx";

class Main extends React.Component {
    render(){
        const { store } = this.props
        return (
            
                
                 {
                    return(
                        
) }}/>
) } } export default Main ;

這與react-router2有一些差別,原來的方法已經(jīng)不再使用,在react-router4HashRouterBrowserRouter組件從react-redux-dom中引入。

關(guān)于業(yè)務(wù)組件的編寫,相信大家都很熟悉,即使以前使用es5開發(fā)的小伙伴也應(yīng)該能很快上手
hello.jsx

import "../css/xxx.css";
import React from "react";
import { connect } from "react-redux";
import * as action from "../store/actions";

class Hello extends React.Component{
    constructor(props){
        super(props)
        this.state={...}
    }
    componentDidMount(){
        this.props.dispatch(action.hi())
    }
    render() {
        const { name } = this.props
        return (
            
{name}
) } } export default connect(state => state)(Hello)

在這個(gè)組件里,我們將redux中管理的state和觸發(fā)狀態(tài)更改的dispatch方法通過connect綁定在了props中,可以隨時(shí)調(diào)用,同時(shí)該組件將監(jiān)聽reduxstate的變化實(shí)時(shí)更新數(shù)據(jù)。

我們需要改變redux狀態(tài)時(shí)所觸發(fā)的動(dòng)作
action.js

export const hi = () => {
    return {
        type:"hi",
        ...//其他你需要的屬性
    }
}

根據(jù)redux要求,這里的type屬性是必須的,不能用別的字段名,否則運(yùn)行時(shí)瀏覽器會(huì)報(bào)type不存在。

接收action后執(zhí)行狀態(tài)改變的文件就是
reducers.js

import { combineReducers } from "redux"

const name = (state="", action) => {
    switch (action.type) {
        case "hi":
            return "hello world!"
        default :
            return state
    }
}

const todoApp = combineReducers({
    name,
    //more state
})  

export default todoApp;

reducer首先用action中傳入的type屬性來判斷我們要做的是哪種操作,然后再根據(jù)傳入的其他屬性當(dāng)做參數(shù)做你想要的改變,最后返回一個(gè){name : ...}的對(duì)象,然后所有類似的對(duì)象通過combineReducers合并為一個(gè)總狀態(tài)對(duì)象暴露給組件訪問。

當(dāng)以上文件利用webpack編譯打包好以后,一個(gè)最簡(jiǎn)單的react全家桶spa就完成了(雖然只包含一個(gè)組件)。
在實(shí)際的使用過程中,需要更多的庫來使我們的應(yīng)用更強(qiáng)大且美觀。比如路由過度動(dòng)畫react-addons-css-transition-group,redux異步更改state數(shù)據(jù)redux-thunk,Ajax的兼容shimwhatwg-fetch,移動(dòng)端滾動(dòng)iscroll等等。

關(guān)于react-router4redux的詳細(xì)用法還是建議要靜下心來理解文檔,這樣才能在變化多端的開發(fā)需求中運(yùn)用自如。(我之前也用過vuex,感覺相比之下redux文檔稍顯繁瑣,vuex文檔看了很容易就理解上手了)

如果感興趣可以訪問我的成熟項(xiàng)目源碼React醫(yī)療類移動(dòng)app --Github,歡迎各位多多指教,多多star ^_^

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/87233.html

相關(guān)文章

  • webpack4 中的最新 React全家桶實(shí)戰(zhàn)使用配置指南!

    摘要:安裝配置加載器配置配置文件配置支持自定義的預(yù)設(shè)或插件只有配置了這兩個(gè)才能讓生效,單獨(dú)的安裝是無意義的。 showImg(https://segmentfault.com/img/bVbjGNY?w=2847&h=1931); 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你! 最新React全家桶實(shí)戰(zhàn)使用配置指南 這篇文檔 是呂小明老師結(jié)合以往的項(xiàng)目經(jīng)驗(yàn) 加上自己本身...

    Towers 評(píng)論0 收藏0
  • 拒絕Redux文檔“毒害” 一個(gè)項(xiàng)目告訴你Redux最新真正哲學(xué)

    摘要:之前分享過幾篇關(guān)于技術(shù)棧的原創(chuàng)文章解析前端架構(gòu)學(xué)習(xí)復(fù)雜場(chǎng)景數(shù)據(jù)設(shè)計(jì)干貨總結(jié)打造單頁應(yīng)用一個(gè)項(xiàng)目理解最前沿技術(shù)棧真諦一個(gè)工程實(shí)例今天進(jìn)一步剖析一個(gè)實(shí)際案例移動(dòng)網(wǎng)頁版。目前面臨的問題在于提高產(chǎn)品的各方面性能體驗(yàn)。 之前分享過幾篇關(guān)于React技術(shù)棧的原創(chuàng)文章: 解析Twitter前端架構(gòu) 學(xué)習(xí)復(fù)雜場(chǎng)景數(shù)據(jù)設(shè)計(jì) React Conf 2017 干貨總結(jié)1: React + ES next ...

    YuboonaZhang 評(píng)論0 收藏0
  • react+react-router+react-redux全家桶小項(xiàng)目開發(fā)過程分享

    摘要:項(xiàng)目地址下載完項(xiàng)目然后即可基于的項(xiàng)目,主要是為了學(xué)習(xí)實(shí)戰(zhàn)。數(shù)據(jù)都是固定的,從餓了么接口臨時(shí)抓的,模擬了一個(gè)的異步數(shù)據(jù)延遲,感謝餓了么。詳細(xì)信息可以看上面的官方文檔,我這里就簡(jiǎn)單說一下我這個(gè)項(xiàng)目的應(yīng)用。 react-ele-webapp 項(xiàng)目地址 :https://github.com/kliuj/reac... run 下載完項(xiàng)目npm install然后npm run dev 即可 ...

    zzir 評(píng)論0 收藏0
  • ? 基于 react + react-router + redux 構(gòu)建的移動(dòng)端微應(yīng)用

    摘要:項(xiàng)目地址基于構(gòu)建的移動(dòng)端單頁微應(yīng)用,適合于核心概念的理解與掌握。前言這個(gè)項(xiàng)目是介于版本之后并且完全仿照功能設(shè)計(jì)的版本。但隨之而來通常會(huì)有這樣的疑問概念太多,并且都是分離的分文件。 react-mobile-starter 項(xiàng)目地址 基于 react + redux + react-router 構(gòu)建的移動(dòng)端單頁微應(yīng)用,適合于react、redux、react-router核心概念的理解...

    zhangke3016 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<