国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

優雅的在React項目中使用Redux

PumpkinDylan / 2142人閱讀

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

或許你當前的項目還沒有到應用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
  }
}

// 導出所有reducer
export 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"

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

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

export default store

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

開始使用
首先,我們來編寫應用的入口文件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"
// 引入創建好的store實例
import store from "@/store/index.js"

// 渲染DOM
ReactDOM.render (
  (
    
{/* 將store作為prop傳入,即可使應用中的所有組件使用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
    
    // 觸發setPageTitle action
    setPageTitle("新的標題")
    
    // 觸發setInfoList action
    setInfoList()
  }

  render () {
    // 從props中解構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)) // 執行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

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/40194.html

相關文章

  • 優雅的在React項目使用Redux

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

    h9911 評論0 收藏0
  • 優雅的在React組件注冊事件

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

    archieyang 評論0 收藏0
  • Hooks + Context:狀態管理的新選擇

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

    tommego 評論0 收藏0
  • 詳解reactreduxreact-redux之間的關系

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

    xioqua 評論0 收藏0

發表評論

0條評論

PumpkinDylan

|高級講師

TA的文章

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