最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于webpack4搭建的react項目框架的方法

 更新時間:2018年06月30日 11:43:25   作者:一二三  
本篇文章主要介紹了基于webpack4搭建的react項目框架的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

介紹

框架介紹,使用webpac構(gòu)建的react單頁面應(yīng)用,集成antd。使用webpack-dev-server啟動本地服務(wù),加入熱更新便于開發(fā)調(diào)試。使用bundle-loader進(jìn)行代碼切割懶加載

手動搭建,不使用cli,大量注釋適合初學(xué)者對webpack的理解學(xué)習(xí),對react項目的深入了解

啟動

 git clone https://gitee.com/wjj0720/react-demo.git
 cd react-demo
 yarn
 yarn start

打包

yarn build

目錄結(jié)構(gòu)

 +node_modules
 -src
  +asset
  +Layout
  +pages
  +redux
  +utils
  +app.js
  +index.html
  +index.js
 .babelrc 
 package.json 
 postcss.config.js
 webpack.config.js //webpack 配置

bundle-loader 懶加載使用

 // webpack.config.js 配置
 module: {
  rules: [
   {
    test: /\.bundle\.js$/,
    use: {
     loader: 'bundle-loader',
     options: {
      name: '[name]',
      lazy: true
     }
    }
   }
  ]
 }
 // 頁面引入組件
 import Home from "bundle-loader?lazy&name=[name]!./Home";

 // 組件使用 因?yàn)榻M件懶加載 是通過異步的形式引入 所以不能再頁面直接以標(biāo)簽的形式使用 需要做使用封裝 
 import React, {Component} from 'react'
 import { withRouter } from 'react-router-dom'
 class LazyLoad extends Component {
  state = {
   LoadOver: null
  }
  componentWillMount() {
   this.props.Loading(c => {
    this.setState({
     LoadOver: withRouter(c.default)
    })
   })
  }
 
  render() {
   let {LoadOver} = this.state;
   return (
    LoadOver ? <LoadOver/> : <div>加載動畫</div>
   )
  }
 }
 export default LazyLoad

 // 通過封裝的懶加載組件過度 增加加載動畫
 <LazyLoad Loading={Home} />

路由配置

框架按照模塊劃分,pages文件夾下具有route.js 即為一個模塊

 // 通過require.context讀取模塊下路由文件
 const files = require.context('./pages', true, /route\.js$/)
 let routers = files.keys().reduce((routers, route) => {
  let router = files(route).default
  return routers.concat(router)
 }, [])

 // 模塊路由文件格式
 import User from "bundle-loader?lazy&name=[name]!./User";
 export default [
  {
   path: '/user',
   component: User
  },
  {
   path: '/user/:id',
   component: User
  }
 ]

redux 使用介紹

 // ---------創(chuàng)建 --------
 // 為了不免action、reducer 在不同文件 來回切換 對象的形式創(chuàng)建

 // createReducer 將書寫格式創(chuàng)建成rudex認(rèn)識的reducer
 export function createReducer({state: initState, reducer}) {
  return (state = initState, action) => {
   return reducer.hasOwnProperty(action.type) ? reducer[action.type](state, action) : state
  }
 }

 // 創(chuàng)建頁面級別的store
 const User_Info_fetch_Memo = 'User_Info_fetch_Memo'
 const store = {
  // 初始化數(shù)據(jù)
  state: {
   memo: 9,
   test: 0
  },
  action: {
   async fetchMemo (params) {
    return {
     type: User_Info_fetch_Memo,
     callAPI: {url: 'http://stage-mapi.yimifudao.com/statistics/cc/kpi', params, config: {}},
     payload: params
    }
   },
   ...
  },
  reducer: {
   [User_Info_fetch_Memo] (prevState = {}, {payload}) {
    console.log('reducer--->',payload)
    return {
     ...prevState,
     memo: payload.memo
    }
   },
   ...
  }
 }

 export default createReducer(store)
 export const action = store.action

 // 最終在模塊界別組合 [當(dāng)然模塊也有公共的數(shù)據(jù)(見Home模塊下的demo寫法)]
 import {combineReducers} from 'redux'
 import info from './Info/store'
 export default combineReducers({
  info,
  。。。
 })

 // 最終rudex文件夾下的store.js 會去取所有模塊下的store.js 組成一個大的store也就是我們最終倉庫

 // --------使用------
 // 首先在app.js中將store和app關(guān)聯(lián)
 import { createStore } from 'redux'
 import { Provider } from 'react-redux'
 // reducer即我們最終
 import reducer from './redux/store.js'
 // 用戶異步action的中間件
 import middleware from './utils/middleware.js'
 let store = createStore(reducer, middleware)
 <Provider store={store}>
  。。。
 </Provider>


 // 然后組件調(diào)用 只需要在組件導(dǎo)出時候 使用connent鏈接即可
 import React, {Component} from 'react'
 import {connect} from 'react-redux'
 // 從頁面級別的store中導(dǎo)出action
 import {action} from './store'

 class Demo extends Component {
  const handle = () => {
   // 觸發(fā)action
   this.props.dispatch(action.fetchMemo({}))
  }
  render () {
   console.log(this.props.test)
   return <div onClick={this.handle}>ss</div>
  }
 }
 export default connect(state => ({
  test: state.user.memo.test
 }) )(demo) 

關(guān)于redux中間件

 // 與其說redux中間件不如說action中間件
 // 中間件執(zhí)行時機(jī) 即每個action觸發(fā)之前執(zhí)行

 // 
 import { applyMiddleware } from 'redux'
 import fetchProxy from './fetchProxy';

 // 中間件 是三個嵌套的函數(shù) 第一個入?yún)檎麄€store 第二個為store.dispatch 第三個為本次觸發(fā)的action 
 // 簡單封裝的中間件 沒有對請求失敗做過多處理 目的在與項錯誤處理機(jī)制給到頁面處理
 const middleware = ({getState}) => next => async action => {
  // 此時的aciton還沒有被執(zhí)行 
  const {type, callAPI, payload} = await action
  // 沒有異步請求直接返回action
  if (!callAPI) return next({type, payload})
  // 請求數(shù)據(jù)
  const res = await fetchProxy(callAPI)
  // 請求數(shù)據(jù)失敗 提示
  if (res.status !== 200) return console.log('網(wǎng)絡(luò)錯誤!')
  // 請求成功 返回data
  return next({type, payload: res.data})
 }
 export default applyMiddleware(middleware)

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • react的嚴(yán)格模式和解決react useEffect執(zhí)行兩次問題

    react的嚴(yán)格模式和解決react useEffect執(zhí)行兩次問題

    文章總結(jié):本文詳細(xì)探討了React中useEffect執(zhí)行兩次的問題,主要?dú)w因于React的嚴(yán)格模式,嚴(yán)格模式在開發(fā)模式下會故意重復(fù)調(diào)用一些生命周期方法,以幫助開發(fā)者發(fā)現(xiàn)潛在的問題,包括不安全的生命周期、過時的ref API、廢棄的findDOMNode方法、意外的副作用等
    2025-01-01
  • Native?Memory?Tracking追蹤區(qū)域示例分析

    Native?Memory?Tracking追蹤區(qū)域示例分析

    這篇文章主要為大家介紹了Native?Memory?Tracking追蹤區(qū)域示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • react 實(shí)現(xiàn)頁面代碼分割、按需加載的方法

    react 實(shí)現(xiàn)頁面代碼分割、按需加載的方法

    本篇文章主要介紹了react 實(shí)現(xiàn)頁面代碼分割、按需加載的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • React狀態(tài)管理Redux的使用介紹詳解

    React狀態(tài)管理Redux的使用介紹詳解

    redux是redux官方react綁定庫,能夠使react組件從redux store中讀取數(shù)據(jù),并且向store分發(fā)actions以此來更新數(shù)據(jù),這篇文章主要介紹了react-redux的設(shè)置,需要的朋友可以參考下
    2022-09-09
  • useEffect中不能使用async原理詳解

    useEffect中不能使用async原理詳解

    這篇文章主要為大家介紹了useEffect中為什么不能使用async的原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • ios原生和react-native各種交互的示例代碼

    ios原生和react-native各種交互的示例代碼

    本篇文章主要介紹了ios原生和react-native各種交互的示例代碼,非常具有實(shí)用價值,需要的朋友可以參考下
    2017-08-08
  • React中的for循環(huán)解讀

    React中的for循環(huán)解讀

    這篇文章主要介紹了React中的for循環(huán)解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • React Native自定義控件底部抽屜菜單的示例

    React Native自定義控件底部抽屜菜單的示例

    本篇文章主要介紹了React Native自定義控件底部抽屜菜單的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • React中的合成事件是什么原理

    React中的合成事件是什么原理

    React 中的事件,是對原生事件的封裝,叫做合成事件。這篇文章主要通過幾個簡單的示例為大家詳細(xì)介紹一下React中的合成事件,感興趣的可以了解一下
    2023-02-02
  • 基于react?vant實(shí)現(xiàn)彈窗搜索功能

    基于react?vant實(shí)現(xiàn)彈窗搜索功能

    這篇文章主要為大家詳細(xì)介紹了如何基于react?vant實(shí)現(xiàn)彈窗搜索功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-01-01

最新評論

马龙县| 漾濞| 辰溪县| 林口县| 东源县| 白水县| 乌兰浩特市| 冀州市| 平阳县| 九龙坡区| 西和县| 奉节县| 康马县| 曲水县| 兴安盟| 五台县| 改则县| 偃师市| 陆良县| 云霄县| 东光县| 墨玉县| 凭祥市| 巢湖市| 邢台县| 桃江县| 闽侯县| 五寨县| 菏泽市| 阳信县| 金门县| 镇远县| 霍城县| 上犹县| 潼关县| 通辽市| 连云港市| 兴义市| 偏关县| 平阴县| 临湘市|