国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 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(將來用異步接口獲取)export 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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新民市| 麦盖提县| 衢州市| 白山市| 曲松县| 仁化县| 仪征市| 三台县| 嘉义市| 大名县| 石渠县| 屯门区| 滦南县| 公主岭市| 西宁市| 荆门市| 山阳县| 蓝田县| 东兰县| 通州区| 蕉岭县| 南城县| 延庆县| 阳谷县| 镇安县| 商水县| 彝良县| 台山市| 称多县| 大埔县| 太康县| 宜宾县| 土默特右旗| 林芝县| 晋宁县| 民权县| 凤山市| 南昌县| 巴青县| 祁连县| 克什克腾旗|