日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

再厉害的魔术也比不上真正的redux

發(fā)布時(shí)間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 再厉害的魔术也比不上真正的redux 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

why redux?

  • 隨著 JavaScript 單頁(yè)應(yīng)用開(kāi)發(fā)日趨復(fù)雜,管理不斷變化的 state 非常困難
  • Redux的出現(xiàn)就是為了解決state里的數(shù)據(jù)問(wèn)題
  • 在React中,數(shù)據(jù)在組件中是單向流動(dòng)的
  • 數(shù)據(jù)從一個(gè)方向父組件流向子組件(通過(guò)props),由于這個(gè)特征,兩個(gè)非父子關(guān)系的組件(或者稱作兄弟組件)之間的通信比較麻煩

what is redux?

工作流

設(shè)計(jì)思想

  • Redux是將整個(gè)應(yīng)用狀態(tài)存儲(chǔ)到到一個(gè)地方,稱為store
  • store里面保存一棵狀態(tài)樹(shù)(state tree)
  • 組件可以派發(fā)(dispatch)行為(action)給store,而不是直接通知其它組件
  • 其它組件可以通過(guò)訂閱store中的狀態(tài)(state)來(lái)刷新自己的視圖.

三大原則

  • 整個(gè)應(yīng)用的 state 被儲(chǔ)存在一棵 object tree 中,并且這個(gè) object tree 只存在于唯一一個(gè) store 中 State 是只讀的,惟一改變 state 的方法就是觸發(fā) action,
  • action是一個(gè)用于描述已發(fā)生事件的普通對(duì)象 使用純函數(shù)來(lái)執(zhí)行修改,為了描述action如何改變state tree ,你需要編寫(xiě) reducers
  • 單一數(shù)據(jù)源的設(shè)計(jì)讓React的組件之間的通信更加方便,同時(shí)也便于狀態(tài)的統(tǒng)一管理

how redux?

1.安裝

npm i redux -S 復(fù)制代碼

2.簡(jiǎn)單例子

1.引入

import {createStore} from 'redux'; //createStore 用來(lái)創(chuàng)建狀態(tài)倉(cāng)庫(kù) 復(fù)制代碼

2.創(chuàng)建state

let initState = {title: 'star' } 復(fù)制代碼

3.創(chuàng)建reducer

const CHANGETITLE = 'CHANGETITLE'; //action-todos function reducer(state= initState, action){switch(action.type){case CHANGETITLE: return state.title = action.title;}} 復(fù)制代碼

4.創(chuàng)建倉(cāng)庫(kù)

let store = createStore(reducer); 復(fù)制代碼

5.觸發(fā)dispatch中傳入action

store.dispatch({type: CHANGETITLE, title: 'xingxing'}) 復(fù)制代碼

完整代碼

import {createStore} from 'redux'; const CHANGETITLE = 'CHANGETITLE'; function reducer(state= initState, action){switch(action.type){case CHANGETITLE: state.title = action.title;}console.log(state); } let store = createStore(reducer); store.subscribe(()=>{ //訂閱事件,在dispatch時(shí)觸發(fā)console.log('render'); }) store.dispatch({type: CHANGETITLE, title: 'xingxing'}) 復(fù)制代碼

復(fù)雜些例子

在真實(shí)開(kāi)發(fā)中需要開(kāi)辟一個(gè)文件空間來(lái)管理倉(cāng)庫(kù)

  • 文件結(jié)構(gòu)化
  • 多reducer,合并reducer

1.actions

action-type.js
//action-type衡量,通過(guò)引入使用,減少拼寫(xiě)錯(cuò)誤引發(fā)的問(wèn)題 export const INCREMENT = 'INCREMENT' export const DECREMNET = 'DECREMNET' 復(fù)制代碼
actions/count.js
import * as types from "../action-types" //用于生成action let counter = {add(n){return {type: types.INCREMENT, count: n}} } export default counter 復(fù)制代碼

2.reducers

reducers/count.js
import {INCREMENT,DECREMENT} from '../actions/action-type' let initState = {count: 0 } function reducer(state = initState,action){switch(action.type){case INCREMENT:state.count = state.count + action.number;break;case DECREMENT:state.count = state.count - action.number;break;}return state } export default reducer 復(fù)制代碼
合并reducer
reducers/index.js
import todos from './todo'; import count from './count'; import {combineReducers} from 'redux' let reducers = combineReducers({todos,count }) export default reducers; 復(fù)制代碼

store/index.js 初始化倉(cāng)庫(kù)

import {INCEMENT,DECREMENT} from './actions/action-type'; import {createStore} from 'redux'; import reducers from './reducers'export default createStore(reducers); 復(fù)制代碼

how is redux work?

  • redux的數(shù)據(jù)源是創(chuàng)建reducer時(shí),傳進(jìn)去的initState。
  • 為了避免state被隨意篡改,redux通過(guò)dispatch reducer來(lái)更改數(shù)據(jù)。
  • redux可以通過(guò)subscribe訂閱狀態(tài)修改事件
//簡(jiǎn)單實(shí)現(xiàn) function createStore(reducer){let state;let listeners = [];function subscribe(listener){listeners.push(listener);return ()=> listeners = listeners.filter(fn=>fn!==listener);}function dispatch(action){listeners.forEach(listener=>listener());reducer(state, action)}dispatch({})function getState(){return state;}return {subscribe, dispatch, getState} } 復(fù)制代碼

合并reducer

function combineReducers(reducers){return (state={},action)=>{let newState = {};for(let key in reducers){let s = reducers[key](state[key],action);newState[key] = s;}return newState;} } 復(fù)制代碼

完整代碼

function createStore(reducer){let state;let listeners = [];function subscribe(listener){listeners.push(listener);return ()=>{listeners = listeners.filter(l=> l!==listener)}}dispatch({})function dispatch(action){state = reducer(state,action);listeners.forEach(l=>l());}function getState(){return state;}return {subscribe,dispatch,getState}; }function combineReducers(reducers){return (state={},action)=>{let newState = {};for(let key in reducers){let s = reducers[key](state[key],action); newState[key] = s;}return newState;} }export {createStore,combineReducers} 復(fù)制代碼

最近在研究redux,歡迎指出問(wèn)題。后續(xù)更新react-redux全家桶系列研究

總結(jié)

以上是生活随笔為你收集整理的再厉害的魔术也比不上真正的redux的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: a级一a一级在线观看 | 久草在| 婷婷激情五月 | 国产精品麻豆一区 | 精品国产免费看 | 中文字幕 自拍偷拍 | 午夜精品久久久久久久99黑人 | 精品视频一区二区三区 | 久久久久久久久久影视 | 久久久中文网 | 亚洲国产电影在线观看 | 美国成人av | 777色婷婷| 黄色网页在线播放 | 欧美激情在线狂野欧美精品 | 丰满少妇影院 | 恶虐女帝安卓汉化版最新版本 | 色婷婷av777 麻豆传媒网站 | 99热成人 | 一级片小视频 | 青青草原国产在线 | 伊人www | 国产做爰免费观看视频 | 潘金莲三级80分钟 | 91性高潮久久久久久久久 | 夜夜爽网站 | 日本黄a| 亚洲麻豆一区二区三区 | 欧洲亚洲一区二区 | 国产精品1000 | 亚洲一区国产一区 | 国产精品人人妻人人爽 | 美痴女~美人上司北岛玲 | 青青草视频 | 成人精品国产免费网站 | 男女叼嘿视频 | 免费a网站| 欧美激情视频在线观看 | 亚洲大尺度视频 | 女婴高潮h啪啪 | 久久这里只有精品99 | 欧美美女一区二区三区 | a级免费视频 | 国产日产久久高清欧美一区 | 国产女同在线观看 | 国产中文 | 国产精品欧美亚洲 | 五月婷婷基地 | 九色porn| 天堂久久一区 | 亚洲一区二区三区91 | 热播网 | 久久久久久亚洲 | 最近中文字幕免费mv视频7 | 国产精品视频久久久久久 | 午夜偷拍福利 | 69av在线视频 | 五月天青青草 | 95视频在线观看 | 性免费视频 | 久草五月天 | 日韩黄| 啪免费视频 | 蜜桃va | 国产三级三级看三级 | 高清日韩欧美 | 天天爽网站 | 三上悠亚中文字幕在线播放 | 久久综合色婷婷 | 久久精品在这里 | 播播激情网 | jizz自拍| 日韩中文在线字幕 | 免费在线观看你懂的 | 国产精品1区2区3区 在线看黄的网站 | 影音先锋久久久 | 成人在线精品视频 | 亚洲一区二区三区在线免费观看 | 久久综合伊人77777麻豆 | 日本国产欧美 | 国产精品丝袜黑色高跟鞋 | 边打电话边做 | 自拍偷拍三级 | 亚洲精品欧洲精品 | 一级片免费观看视频 | 欧美亚洲图片小说 | 九色论坛 | 成年人视频在线免费看 | 国产精品极品 | 国产精品羞羞答答在线 | 亚洲国产在 | 精品久久久久久无码国产 | 法国极品成人h版 | 免费网站观看www在线观看 | 国产主播精品在线 | 色综合中文 | 色亚洲视频 | 国产视频二区三区 | 香蕉免费在线视频 |