學習阮一峰的 Redux 入門教程(一)筆記

2021-09-30 18:23:37 字數 3560 閱讀 2462

如果你不知道是否需要 redux,那就是不需要它

只有遇到 react 實在解決不了的問題,你才需要 redux

redux 適用場景:多互動、多資料來源

store: 儲存資料的地方,整個應用只能有乙個 store。

redux 提供 createstore 函式來生成 store

import  from 'redux'

const store = createstore(fn)

// createstore 函式接受另乙個函式作為引數,返回新生成的 store 物件

store 物件包含所有資料,如果想得到某個時點的資料,就要對 store 生成快照,這種時點的資料集合叫做 state

當前時刻的 state 可以通過 store.getstate() 得到

import  from 'redux'

const store = createstore(fn)

const state = store.getstate()

redux 規定,乙個 state 對應乙個 view。只要 state 相同,view 就相同。你知道 state,就知道 view 是什麼樣,反之亦然

state 的變化,會導致 view 的變化。但是使用者接觸不到 state,可以接觸到 view,所以 state 的變化必須是 view 導致的。action 就是 view 發出的通知,表示 state 應該要發生變化了

action 是乙個物件。其中的 type 屬性是必須的,表示 action 的名稱,其他屬性自由設定

const action =
定義乙個函式來生成 action,這個函式就叫 action creator

const add_todo = '新增 todo'

function addtodo(text)

}const action = addtodo('learn redux')

store.dispatch() 是 view 發出 action 的唯一方法

store.dispatch 接受乙個 action 物件作為引數,將它傳送出去

store 收到 action 以後,必須給出乙個新的 state, 這樣 view 才會發生變化,這種 state 的計算過程就叫做 reducer

reducer 是乙個函式,它接受 action 和當前 state 作為引數,返回乙個新的 state

const reducer = function (state, action )
reducer 函式不用手動呼叫,store.dispatch 方法會自動觸發 reducer 的自動執行。為此,store 需要知道 reducer 函式,做法就是在生成 store 的時候,將 reducer 傳入 createstore 方法

import  from 'redux'

const store = createstore(reducer)

reducer 函式最重要的特徵: reducer 是乙個純函式

// state 是乙個物件

function reducer(state, action) , state, )

// 或者

return

}// state 是乙個陣列

function reducer(state, action)

store 允許使用 store.subscribe 方法設定監聽函式,一旦 state 發生變化,就自動執行這個函式

import  from 'redux'

const store = createstore(reducer)

store.subscribe(listener)

把 view 的更新函式(元件的render、setstate)放入 listener ,就會實現 view 的自動渲染

store.subscribe 方法返回乙個函式,呼叫這個函式就可以解除監聽

let unsubscribe = store.subscribe(() => )

createstore 方法還可以接受第二個引數,表示 state 的最初狀態。這通常是伺服器給出的

window.state_from_server: 就是整個應用的狀態初始值。注意,如果提供了這個引數,它會覆蓋 reducer 函式的預設初始值

createstore 的簡單實現

const createstore = (reducer) => 

const subscribe = (listener) =>

}dispatch({})

return

}

redux 提供了乙個方法:combinereducers, 用於 reducer 的拆分

import  from 'redux'

const chatreducer = combinereducer()

combinereducer 的簡單實現

const combinereducers = reducers => , action) => )}

}

你可以把所有子 reducer 放在乙個檔案裡,然後統一引入

import  from 'redux'

import * as reducers from './reducers'

const reducer = combinereducers(reducers)

store.dispatch(action)

state 一旦有變化,store 就會呼叫監聽函式

// 設定監聽物件

store.subscribe(listener)

listener 可以通過 store.getstate() 得到當前狀態。如果使用的是 react,這時可以觸發重新渲染 view

function listener ()

阮一峰 蒙特卡羅方法入門

日期 2015年7月27日 本文通過五個例子,介紹蒙特卡羅方法 monte carlo method 蒙特卡羅方法是一種計算方法。原理是通過大量隨機樣本,去了解乙個系統,進而得到所要計算的值。它非常強大和靈活,又相當簡單易懂,很容易實現。對於許多問題來說,它往往是最簡單的計算方法,有時甚至是唯一可行...

蒙特卡羅方法入門 阮一峰

本文通過五個例子,介紹蒙特卡羅方法 monte carlo method 一 概述 蒙特卡羅方法是一種計算方法。原理是通過大量隨機樣本,去了解乙個系統,進而得到所要計算的值。它非常強大和靈活,又相當簡單易懂,很容易實現。對於許多問題來說,它往往是最簡單的計算方法,有時甚至是唯一可行的方法。它誕生於上...

flex布局學習總結 阮一峰

基本概念 容器預設存在兩根軸 水平的主軸 main axis 和垂直的交叉軸 cross axis 主軸的開始位置 與邊框的交叉點 叫做main start,結束位置叫做main end 交叉軸的開始位置叫做cross start,結束位置叫做cross end。專案預設沿主軸排列。單個專案佔據的主...