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

資訊專欄INFORMATION COLUMN

redux原來如此簡單

wuyumin / 1688人閱讀

摘要:是狀態(tài)容器,提供可預測化的狀態(tài)管理。一般我們會使用一個常量來表示對應的值。作為純函數(shù),內(nèi)部不建議使用任何有副作用的操作,比如操作外部的變量,任何導致相同輸入但輸出卻不一致的操作。結(jié)合,其他類庫,開發(fā)步驟莫不如此。

Redux 是 JavaScript 狀態(tài)容器, 提供可預測化的狀態(tài)管理。

那什么是可以預測化,我的理解就是根據(jù)一個固定的輸入,必然會得到一個固定的結(jié)果。

redux是專門為react開發(fā)的,但并不是只能用于react,可以用于任何界面庫。

動機

隨著單頁面應用的普及,web app內(nèi)部需要管理的狀態(tài)越來越多,這些狀態(tài)可能來自服務器端,用戶輸入的數(shù)據(jù),用戶交互數(shù)據(jù),當前UI狀態(tài),本地的緩存數(shù)據(jù)等等。如何能夠有條理的管理這些數(shù)據(jù),成為前端開發(fā)中一個難題。

核心概念 三大原則 單一數(shù)據(jù)源

使用redux的程序,所有的state都存儲在一個單一的數(shù)據(jù)源store內(nèi)部,類似一個巨大的對象樹。

state是只讀的

state是只讀的,能改變state的唯一方式是通過觸發(fā)action來修改

使用純函數(shù)執(zhí)行修改

為了描述 action 如何改變 state tree , 你需要編寫 reducers。

reducers是一些純函數(shù),接口當前state和action。只需要根據(jù)action,返回對應的state。而且必須要有返回。

一個函數(shù)的返回結(jié)果只依賴于它的參數(shù),并且在執(zhí)行過程里面沒有副作用,我們就把這個函數(shù)叫做純函數(shù)

基礎(chǔ) action

顧名思義,action就是動作,也就是通過動作來修改state的值。也是修改store的唯一途徑。

action本質(zhì)上就是一個普通js對象,我們約定這個對象必須有一個字段type,來表示我們的動作名稱。一般我們會使用一個常量來表示type對應的值。

此外,我們還會把希望state變成什么樣子的對應的值通過action傳進來,那么這里action可能會類似這樣子的

{
    type: "TOGGLE_TODO",
    index: 5
}
Reducer

Action 只是描述了有事情發(fā)生了這件事實,但并沒有說明要做哪些改變,這正是reducer需要做的事情。

Reducer作為純函數(shù),內(nèi)部不建議使用任何有副作用的操作,比如操作外部的變量,任何導致相同輸入但輸出卻不一致的操作。

如果我們的reducer比較多,比較復雜,我們不能把所有的邏輯都放到一個reducer里面去處理,這個時候我們就需要拆分reducer。

幸好,redux提供了一個api就是combineReducers Api。

store

store是redux應用的唯一數(shù)據(jù)源,我們調(diào)用createStore Api創(chuàng)建store。

脫離react的redux案例 store,reducer基礎(chǔ)使用

第一步搭建開發(fā)環(huán)境,這里不介紹了,參考上一篇文章 手把手教會使用react開發(fā)日歷組件,搭建環(huán)境部分

搭建好環(huán)境切換到目錄下面

npm install redux --save

把index.tsx修改為之下代碼。

import { createStore, combineReducers, applyMiddleware } from "redux"

var simpleReducer = function(state = {}, action) {
  return {
    user: {
      name: "redux"
    }
  }
}

var store = createStore(simpleReducer)

console.log(store.getState())

我們看到控制臺打印出來的一個包含user信息的這么一個對象。

我們使用到了幾個api? createStore創(chuàng)建store,store.getState()獲取store,也就是唯一數(shù)據(jù)源的根節(jié)點。

上文我們也講過,action的情況可能會比較多,redux也提供了combineReducers Api。如果我們有多個reducer,我們就可以使用起來了。

那我們創(chuàng)建多個reducer測試一下,代碼如下:

import { createStore, combineReducers, applyMiddleware } from "redux"

function user(state = {name: "redux"}, action) {
  switch (action.type) {
    case "CHANGE_NAME":
      return {
        ...state,
        name: action.name
      }
  }

  return state
}

function project(state = {name: "min-react"}, action) {
  switch (action.type) {
    case "CHANGE_NAME":
      return {
        ...state,
        name: action.name
      }
  }

  return state
}


var rootReducer = combineReducers({
  user,
  project
})

var store = createStore(rootReducer)

console.log(store.getState())

如我們所預料一樣,我們得到擁有兩個字段的根store。

結(jié)合view使用

第一步我們把html改造成這個樣子,新增了一點標簽




    
    Document
    


    

第二步,修改index.tsx,如下

import { createStore, combineReducers, applyMiddleware } from "redux"
import { func } from "prop-types"

function user(state = {name: "redux"}, action) {
  switch (action.type) {
    case "CHANGE_USER_NAME":
      return {
        ...state,
        name: action.name
      }
  }

  return state
}

function project(state = {name: "min-react"}, action) {
  switch (action.type) {
    case "CHANGE_PROJECT_NAME":
      return {
        ...state,
        name: action.name
      }
  }

  return state
}


var rootReducer = combineReducers({
  user,
  project
})

var store = createStore(rootReducer)

function render(state = store.getState()) {
  var $userName = document.getElementById("userName")
  $userName.innerHTML = state.user.name
}

render()

console.log(store.getState())

我們看到頁面正確的顯示了我們user的名稱。下一步我們需要做的就是通過用戶的操作,改變store的值,進而觸發(fā)view的更新。

于是我們新增了這塊代碼:

store.subscribe(function() {
  render()
})

// 綁定用戶事件
var $userNameInput = document.getElementById("userNameInput")
var userNameButton = document.getElementById("userNameButton")
userNameButton.onclick = function() {
  var value = $userNameInput.value
  store.dispatch({
    type: "CHANGE_USER_NAME",
    name: value
  })
}

我們看到保存之后,當我們輸入值之后,點擊更改,頁面的值隨著改變。

但是控制臺報了一個錯誤,TS2339: Property "value" does not exist on type "HTMLElement".,這是由于typescript強類型校驗沒通過導致的。只要加這段代碼就好了

var $userNameInput = document.getElementById("userNameInput") as HTMLInputElement

看到了吧,redux就是這么簡單。

其他所有上層應用,都是在此基礎(chǔ)上開發(fā)的,所以開發(fā)一個redux應用的步驟就是

定義action和與之對應的reducer

監(jiān)聽store的變化,提供回調(diào)函數(shù)

dispatch一個action,等待好運發(fā)生。

結(jié)合react,其他view類庫,開發(fā)步驟莫不如此。

高級應用 異步action

我們也看到了,我們的reducer只能做同步應用,如果我們需要在reducer,做一些延遲操作,可怎么辦

社區(qū)已經(jīng)有成熟的類庫做這件事件

npm install redux-thunk --save

redux本身已經(jīng)提高了很好的擴展機制,就是中間件。這點很類似express的中間件。

//引入新的類庫
import { createStore, combineReducers, applyMiddleware, compose } from "redux"
import thunk from "redux-thunk"

...
//store部分做如下修改
const finalCreateStore = compose(applyMiddleware(thunk))(createStore)
const store = finalCreateStore(rootReducer, {})

redux-thunk的作用就是讓dispatch方法不僅僅只接收action對象,還可以包含一個方法。我們可以在這個方法內(nèi)部去調(diào)用異步代碼

我們把dom事件部分做了如下改造

userNameButton.onclick = function() {
  var value = $userNameInput.value
  store.dispatch(function(dispatch, getState) {
    setTimeout(() => {
      dispatch({
        type: "CHANGE_USER_NAME",
        name: value
      })
    }, 2000)

  })
}

可以看到頁面元素確實在2s之后發(fā)生了變化,實際業(yè)務中啊,我們這里可以做一些異步操作。

至于redux原理,以及源碼和中間件的源碼講解可以參照我的另外一篇文章 閱讀redux源碼

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

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/97555.html

相關(guān)文章

  • do一下來了一個redux

    摘要:作為一個狀態(tài)樹,來對狀態(tài)進行管理。而對于組件來說,你只要一個就好了。好了,邏輯都明白了,接下來分析下內(nèi)部機制就有基礎(chǔ)了。一探分清一般我們的都是配合使用,但是和只是合作關(guān)系,并沒有血緣關(guān)系。這樣的就相當于通過把和連接起來了。 導語 一開看redux的時候還是比較蒙的,感覺比較繞,但是又好像是那么回事,接觸一個新概念的時候可能都是如此,多去接觸就熟悉了,今天就來分享下redux的三大核心為...

    Null 評論0 收藏0
  • 重新設計 Redux

    摘要:相關(guān)狀態(tài)父組件傳遞給子組件的狀態(tài)。外部狀態(tài)狀態(tài)是可以從視圖庫中移出來的,然后可以使用提供者消費者模式把狀態(tài)重新連接回視圖庫。重新設計在我看來,重寫是有其必要性的,至少有以下個方面可以改進得更友好。 Redux 學習起來很困難?寫起代碼來很啰嗦?一起來看看 Rematch 的作者對 Redux 的思考和簡化吧~ 原文:《Redesigning Redux》, Shawn McKay 都過...

    kidsamong 評論0 收藏0
  • 探索 Redux4.0 版本迭代 論基礎(chǔ)談展望(對比 React context)

    摘要:在幾天前發(fā)布了新版本,被合入。但是在版本迭代的背后很多有趣的設計值得了解。參數(shù)處理這項改動由提出。對透明化處理中的,達到將包裹起來的目的。對的凍結(jié)認為,在中使用和方法是一種反模式。尤其是這樣的新,某些開發(fā)者認為將逐漸取代。 showImg(https://segmentfault.com/img/remote/1460000014571148); Redux 在幾天前(2018.04....

    xialong 評論0 收藏0

發(fā)表評論

0條評論

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