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

資訊專欄INFORMATION COLUMN

優(yōu)雅的在React項目中使用Redux

PumpkinDylan / 2150人閱讀

摘要:或許你當前的項目還沒有到應(yīng)用的程度,但提前了解一下也沒有壞處首先我們會用到哪些框架和工具呢框架狀態(tài)管理工具,與沒有任何關(guān)系,其他框架也可以使用插件,作用方便在項目中使用中間件,作用支持異步目錄組件目錄

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

首先我們會用到哪些框架和工具呢?
React
UI框架
Redux
狀態(tài)管理工具,與React沒有任何關(guān)系,其他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來管理數(shù)據(jù),那么數(shù)據(jù)就一定要有默認值,所以我們將state的默認值統(tǒng)一放置在state.js文件:

// state.js

// 聲明默認值
// 這里我們列舉兩個示例
// 同步數(shù)據(jù):pageTitle
// 異步數(shù)據(jù):infoList(將來用異步接口獲?。?export default {
    pageTitle: "首頁",
    infoList: []
}

第2步:創(chuàng)建reducer,它就是將來真正要用到的數(shù)據(jù),我們將其統(tǒng)一放置在reducers.js文件

// reducers.js

// 工具函數(shù),用于組織多個reducer,并返回reducer集合
import { combineReducers } from "redux"
// 默認值
import defaultState from "./state.js"

// 一個reducer就是一個函數(shù)
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
  }
}

// 導出所有reducer
export default combineReducers({
    pageTitle,
    infoList//
//

第3步:創(chuàng)建action,現(xiàn)在我們已經(jīng)創(chuàng)建了reducer,但是還沒有對應(yīng)的action來操作它們,所以接下來就來編寫action

// actions.js

// action也是函數(shù)
export function setPageTitle (data) {
  return (dispatch, getState) => {
    dispatch({ type: "SET_PAGE_TITLE", data: data })
  }
}

export function setInfoList (data) {
  return (dispatch, getState) => {
    // 使用fetch實現(xiàn)異步請求
    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 })
        }
    })
  }
}

最后一步:創(chuàng)建store實例

// index.js

// applyMiddleware: redux通過該函數(shù)來使用中間件
// createStore: 用于創(chuàng)建store實例
import { applyMiddleware, createStore } from "redux"

// 中間件,作用:如果不使用該中間件,當我們dispatch一個action時,需要給dispatch函數(shù)傳入action對象;但如果我們使用了這個中間件,那么就可以傳入一個函數(shù),這個函數(shù)接收兩個參數(shù):dispatch和getState。這個dispatch可以在將來的異步請求完成后使用,對于異步action很有用
import thunk from "redux-thunk"

// 引入reducer
import reducers from "./reducers.js"

// 創(chuàng)建store實例
let store = createStore(
  reducers,
  applyMiddleware(thunk)
)

export default store

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

開始使用
首先,我們來編寫應(yīng)用的入口文件APP.js

// App.js

import React from "react"
import ReactDOM from "react-dom"

// 引入組件
import TestComponent from "./components/Test.jsx"

// Provider是react-redux兩個核心工具之一,作用:將store傳遞到每個項目中的組件中
// 第二個工具是connect,稍后會作介紹
import { Provider } from "react-redux"
// 引入創(chuàng)建好的store實例
import store from "@/store/index.js"

// 渲染DOM
ReactDOM.render (
  (
    
{/* 將store作為prop傳入,即可使應(yīng)用中的所有組件使用store */}
), document.getElementById("root") )

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

// Test.jsx

import React, { Component } from "react"

// connect方法的作用:將額外的props傳遞給組件,并返回新的組件,組件在該過程中不會受到影響
import { connect } from "react-redux"

// 引入action
import { setPageTitle, setInfoList } from "../store/actions.js"

class Test extends Component {
  constructor(props) {
    super(props)
  }

  componentDidMount () {
    let { setPageTitle, setInfoList } = this.props
    
    // 觸發(fā)setPageTitle action
    setPageTitle("新的標題")
    
    // 觸發(fā)setInfoList action
    setInfoList()
  }

  render () {
    // 從props中解構(gòu)store
    let { pageTitle, infoList } = this.props
    
    // 使用store
    return (
      

{pageTitle}

{ infoList.length > 0 ? (
    { infoList.map((item, index) => {
  • {item.data}
  • }) }
):null }
) } } // 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)) // 執(zhí)行setPageTitle會返回一個函數(shù) // 這正是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三大原則
單一數(shù)據(jù)源
整個應(yīng)用的 state 被儲存在一棵 object tree 中,并且這個 object tree 只存在于唯一一個 store 中
State 是只讀的
唯一改變 state 的方法就是觸發(fā) action,action 是一個用于描述已發(fā)生事件的普通對象
使用純函數(shù)來執(zhí)行修改
為了描述 action 如何改變 state tree ,你需要編寫 reducers

結(jié)語
感謝您的觀看,如有不足之處,歡迎批評指正。

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

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

相關(guān)文章

  • 優(yōu)雅的在React項目使用Redux

    摘要:或許你當前的項目還沒有到應(yīng)用的程度,但提前了解一下也沒有壞處首先我們會用到哪些框架和工具呢框架狀態(tài)管理工具,與沒有任何關(guān)系,其他框架也可以使用插件,作用方便在項目中使用中間件,作用支持異步目錄組件目錄 或許你當前的項目還沒有到應(yīng)用Redux的程度,但提前了解一下也沒有壞處 首先我們會用到哪些框架和工具呢?ReactUI框架Redux狀態(tài)管理工具,與React沒有任何關(guān)系,其他UI框架也...

    h9911 評論0 收藏0
  • 優(yōu)雅的在React組件注冊事件

    摘要:前言在的開發(fā)中,我們經(jīng)常需要在上注冊一些事件,比如按下關(guān)閉彈窗,按上下鍵選中列表內(nèi)容等等。比較常見的操作是在組件的時候去上監(jiān)聽一個事件,在組件的時候停止監(jiān)聽事件。 前言 在React的開發(fā)中,我們經(jīng)常需要在 window 上注冊一些事件, 比如按下 Esc 關(guān)閉彈窗, 按上下鍵選中列表內(nèi)容等等。比較常見的操作是在組件 mount 的時候去 window 上監(jiān)聽一個事件, 在組件 unm...

    archieyang 評論0 收藏0
  • Hooks + Context:狀態(tài)管理的新選擇

    摘要:用戶點擊改變?nèi)譅顟B(tài)崔然渲染整顆組件樹有沒有解決方案呢當然有創(chuàng)建一個只接收的新組件,并將組件中的邏輯都移到組件中。最終的示例使用全局狀態(tài)和生成全局狀態(tài)和崔然完整示例見結(jié)論在和出現(xiàn)之前,缺乏自帶的全局狀態(tài)管理能力。 React 16.3 版本,正式推了出官方推薦的 context API —— 一種跨層級的數(shù)據(jù)傳遞方法。React 16.8 版本,推出了全新的 hooks 功能,將原本只...

    tommego 評論0 收藏0
  • 詳解react、redux、react-redux之間的關(guān)系

    摘要:或者兄弟組件之間想要共享某些數(shù)據(jù),也不是很方便傳遞獲取等。后面要講到的就是通過讓各個子組件拿到中的數(shù)據(jù)的。所以,確實和沒有什么本質(zhì)關(guān)系,可以結(jié)合其他庫正常使用。 本文介紹了react、redux、react-redux之間的關(guān)系,分享給大家,也給自己留個筆記,具體如下: React 一些小型項目,只使用 React 完全夠用了,數(shù)據(jù)管理使用props、state即可,那什么時候需要引入...

    xioqua 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<