亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

優雅的在React項目中使用Redux的方法

2024-05-06 16:46:48
字體:
來源:轉載
供稿:網友

或許你當前的項目還沒有到應用Redux的程度,但提前了解一下也沒有壞處

首先我們會用到哪些框架和工具呢?

React
UI框架
Redux
狀態管理工具,與React沒有任何關系,其他UI框架也可以使用Redux
react-redux
React插件,作用:方便在React項目中使用Redux
react-thunk
中間件,作用:支持異步action

|--src  |-- store        Redux目錄    |-- actions.js    |-- index.js    |-- reducers.js    |-- state.js  |-- components      組件目錄    |-- Test.jsx  |-- App.js        項目入口

準備工作

第1步:提供默認值,既然用Redux來管理數據,那么數據就一定要有默認值,所以我們將state的默認值統一放置在state.js文件:

// state.js// 聲明默認值// 這里我們列舉兩個示例// 同步數據:pageTitle// 異步數據:infoList(將來用異步接口獲?。〆xport default {  pageTitle: '首頁',  infoList: []}

第2步:創建reducer,它就是將來真正要用到的數據,我們將其統一放置在reducers.js文件

// reducers.js// 工具函數,用于組織多個reducer,并返回reducer集合import { combineReducers } from 'redux'// 默認值import defaultState from './state.js'// 一個reducer就是一個函數function pageTitle (state = defaultState.pageTitle, action) { // 不同的action有不同的處理邏輯 switch (action.type) {  case 'SET_PAGE_TITLE':   return action.data  default:   return state }}function infoList (state = defaultState.infoList, action) { switch (action.type) {  case 'SET_INFO_LIST':   return action.data  default:   return state }}// 導出所有reducerexport default combineReducers({  pageTitle,  infoList////

第3步:創建action,現在我們已經創建了reducer,但是還沒有對應的action來操作它們,所以接下來就來編寫action

// actions.js// action也是函數export function setPageTitle (data) { return (dispatch, getState) => {  dispatch({ type: 'SET_PAGE_TITLE', data: data }) }}export function setInfoList (data) { return (dispatch, getState) => {  // 使用fetch實現異步請求  window.fetch('/api/getInfoList', {    method: 'GET',    headers: {      'Content-Type': 'application/json'    }  }).then(res => {    return res.json()  }).then(data => {    let { code, data } = data    if (code === 0) {      dispatch({ type: 'SET_INFO_LIST', data: data })    }  }) }}

最后一步:創建store實例

// index.js// applyMiddleware: redux通過該函數來使用中間件// createStore: 用于創建store實例import { applyMiddleware, createStore } from 'redux'// 中間件,作用:如果不使用該中間件,當我們dispatch一個action時,需要給dispatch函數傳入action對象;但如果我們使用了這個中間件,那么就可以傳入一個函數,這個函數接收兩個參數:dispatch和getState。這個dispatch可以在將來的異步請求完成后使用,對于異步action很有用import thunk from 'redux-thunk'// 引入reducerimport reducers from './reducers.js'// 創建store實例let store = createStore( reducers, applyMiddleware(thunk))export default store

至此,我們已經完成了所有使用Redux的準備工作,接下來就在React組件中使用Redux

開始使用

首先,我們來編寫應用的入口文件APP.js

// App.jsimport React from 'react'import ReactDOM from 'react-dom'// 引入組件import TestComponent from './components/Test.jsx'// Provider是react-redux兩個核心工具之一,作用:將store傳遞到每個項目中的組件中// 第二個工具是connect,稍后會作介紹import { Provider } from 'react-redux'// 引入創建好的store實例import store from '@/store/index.js'// 渲染DOMReactDOM.render ( (  <div>    {/* 將store作為prop傳入,即可使應用中的所有組件使用store */}    <Provider store = {store}>     <TestComponent />    </Provider>  </div> ), document.getElementById('root'))

最后是我們的組件:Test.jsx

// Test.jsximport React, { Component } from 'react'// connect方法的作用:將額外的props傳遞給組件,并返回新的組件,組件在該過程中不會受到影響import { connect } from 'react-redux'// 引入actionimport { setPageTitle, setInfoList } from '../store/actions.js'class Test extends Component { constructor(props) {  super(props) } componentDidMount () {  let { setPageTitle, setInfoList } = this.props    // 觸發setPageTitle action  setPageTitle('新的標題')    // 觸發setInfoList action  setInfoList() } render () {  // 從props中解構store  let { pageTitle, infoList } = this.props    // 使用store  return (   <div>    <h1>{pageTitle}</h1>    {      infoList.length > 0 ? (        <ul>          {            infoList.map((item, index) => {              <li>{item.data}</li>            })          }        </ul>      ):null    }   </div>  ) }}// mapStateToProps:將state映射到組件的props中const mapStateToProps = (state) => { return {  pageTitle: state.pageTitle,  infoList: state.infoList }}// mapDispatchToProps:將dispatch映射到組件的props中const mapDispatchToProps = (dispatch, ownProps) => { return {  setPageTitle (data) {    // 如果不懂這里的邏輯可查看前面對redux-thunk的介紹    dispatch(setPageTitle(data))    // 執行setPageTitle會返回一個函數    // 這正是redux-thunk的所用之處:異步action    // 上行代碼相當于    /*dispatch((dispatch, getState) => {      dispatch({ type: 'SET_PAGE_TITLE', data: data })    )*/  },  setInfoList (data) {    dispatch(setInfoList(data))  } }}export default connect(mapStateToProps, mapDispatchToProps)(Test)

Redux三大原則

單一數據源
整個應用的 state 被儲存在一棵 object tree 中,并且這個 object tree 只存在于唯一一個 store 中

State 是只讀的
唯一改變 state 的方法就是觸發 action,action 是一個用于描述已發生事件的普通對象

使用純函數來執行修改
為了描述 action 如何改變 state tree ,你需要編寫 reducers

結語

感謝您的觀看,以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产亚洲精品va在线观看| 国产一级揄自揄精品视频| 欧美精品久久一区二区| 热re99久久精品国产66热| 亚洲最大福利网| 亚洲欧美日韩精品久久亚洲区| 国产在线一区二区三区| 色婷婷亚洲mv天堂mv在影片| 欧美丰满少妇xxxx| 欧美放荡办公室videos4k| 日韩av不卡在线| 欧美丰满少妇xxxxx做受| 欧美日韩一区免费| 亚洲在线免费观看| 国产精品成人av性教育| 91精品视频专区| 亚洲精品在线不卡| 日韩成人av在线| 中文字幕在线观看亚洲| 国产亚洲美女久久| 欧美激情欧美激情在线五月| 日韩中文字幕欧美| 国产亚洲aⅴaaaaaa毛片| 亚洲国产成人精品女人久久久| 亚洲国产天堂久久国产91| 欧美成人午夜影院| 国产一区二区黑人欧美xxxx| 精品福利在线视频| 国产精品高潮呻吟久久av野狼| 亚洲级视频在线观看免费1级| 成人看片人aa| 97欧美精品一区二区三区| 青青草99啪国产免费| 日韩av网址在线观看| 久久精品最新地址| 91香蕉亚洲精品| 青青草成人在线| 午夜精品蜜臀一区二区三区免费| 中文字幕一区二区三区电影| 中文字幕不卡在线视频极品| 日韩av在线网页| 亚洲精品美女免费| 日韩国产精品视频| 在线看日韩av| 日韩在线播放视频| 日本精品久久中文字幕佐佐木| 午夜精品一区二区三区视频免费看| 欧美老女人性视频| 国产精欧美一区二区三区| 日韩av片免费在线观看| 黑人狂躁日本妞一区二区三区| 欧美综合国产精品久久丁香| 欧美电影在线观看完整版| 亚洲成人免费网站| 午夜精品视频网站| 精品丝袜一区二区三区| 欧美一区第一页| 亚洲国产精品一区二区久| 国内精品久久久久久影视8| 久久精品亚洲94久久精品| 麻豆精品精华液| 日韩一级黄色av| 久久久国产精品视频| 色噜噜国产精品视频一区二区| 国产精品亚洲精品| 国产福利视频一区| 久久久噜噜噜久久| 色999日韩欧美国产| 精品毛片网大全| 国产精品美女无圣光视频| 日本一区二三区好的精华液| 中文字幕九色91在线| 日韩精品视频中文在线观看| 欧美中文字幕在线视频| 久久久亚洲精品视频| 欧美一区二区影院| 国产成人精品a视频一区www| 亚洲一区二区三| 国产午夜精品麻豆| 欧美性在线观看| 日韩av在线影院| 亚洲精美色品网站| 777午夜精品福利在线观看| 岛国视频午夜一区免费在线观看| 久久久97精品| 国产精品91久久久久久| 亚洲美女在线观看| 日韩在线视频国产| 丰满岳妇乱一区二区三区| 精品福利一区二区| 亚洲自拍偷拍第一页| 亚洲天堂成人在线| 国产日韩欧美影视| 欧美日韩在线观看视频小说| 中文字幕日韩在线观看| 中文字幕亚洲无线码在线一区| 成人黄色在线播放| 亚洲欧美三级在线| 亚洲一区二区三区在线视频| 国产精品尤物福利片在线观看| 亚洲精品电影在线观看| 日韩精品欧美激情| 亚洲国产精品专区久久| 欧美在线国产精品| 国产专区精品视频| 夜夜狂射影院欧美极品| 一区二区三区精品99久久| 日韩久久免费视频| 亚洲欧美成人一区二区在线电影| 亚洲色图欧美制服丝袜另类第一页| 亚洲2020天天堂在线观看| 久久免费精品视频| 91最新国产视频| 欧美成人sm免费视频| 日韩欧美999| 国产精品丝袜一区二区三区| 亚洲天堂男人天堂女人天堂| 全亚洲最色的网站在线观看| 国产精品亚洲片夜色在线| 日韩视频第一页| 性视频1819p久久| 国产一区深夜福利| 亚洲97在线观看| 欧美丝袜一区二区三区| 欧美wwwxxxx| 亚洲国产精品悠悠久久琪琪| 欧美成人激情视频| 日韩欧美极品在线观看| 亚洲理论电影网| 午夜精品一区二区三区在线视| 欧美激情一区二区久久久| 九九久久久久久久久激情| 欧美激情一区二区三区高清视频| 国产日韩精品在线观看| 日韩电影中文 亚洲精品乱码| 国产成人av在线播放| 中文字幕日韩在线视频| 中文字幕不卡在线视频极品| 久久精品人人做人人爽| 精品国产欧美成人夜夜嗨| 亚洲毛片在线观看| 成人乱色短篇合集| 国产在线一区二区三区| 日韩在线不卡视频| 91视频国产精品| 韩国三级日本三级少妇99| 国产精品盗摄久久久| 91在线免费看网站| 亚洲无限乱码一二三四麻| 国产女人18毛片水18精品| 色综合影院在线| 亚洲男女自偷自拍图片另类| 欧美成人在线免费| 国产成人在线播放| 久久精品国产电影| 国产精品www| 中文字幕亚洲综合久久| 中文字幕国产精品久久| 欧美成人一区二区三区电影| 国产欧美日韩精品丝袜高跟鞋| 亚洲午夜未删减在线观看| 欧美丰满少妇xxxxx做受| 欧美大学生性色视频| 日韩精品高清视频|