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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Redux概览

發布時間:2025/3/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redux概览 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡介

  • Redux 是一個有用的架構
  • Redux 的適用場景:多交互、多數據源

工作流程圖

action

用戶請求

//發出一個action import { createStore } from 'redux'; const store = createStore(fn);//其中的type屬性是必須的,表示 Action 的名稱。其他屬性可以自由設置 const action = {type: 'ADD_TODO',data: 'Learn Redux' };store.dispatch(action);

Reducer

狀態機
Reducer 是一個函數,它接受 Action 和當前 State 作為參數,返回一個新的 State。
Reducer 是純函數,就可以保證同樣的State,必定得到同樣的 View。但也正因為這一點,Reducer 函數里面不能改變 State,必須返回一個全新的對象

const defaultState = 0; const reducer = (state = defaultState, action) => {switch (action.type) {case 'ADD':return {...state,data: action.data}default: return state;} };
Recucer的拆分
//index import {combineReducers} from 'redux'; import proIndex from './proIndex'; import product from './product' export default combineReducers({proIndex,product, });//product import actions from '../action/index' import {getDocMenu} from "../action/user/product";const {GET_PRODUCT_DOCUMENT_SUCCESS } = actions;export default (state = {},action) =>{switch (action.type) {case GET_PRODUCT_DOCUMENT_SUCCESS:return{...state,getDocMenu: action.data,}default:return state;} }//proIndex import actions from '../action/index';const {GET_SERVICE_CLASSIFICATION_SUCCESS,GET_SERVICE_SUBJECT_SUCCESS, } = actions;export default (state = {},action) => {switch (action.type) {case GET_SERVICE_CLASSIFICATION_SUCCESS:return {...state,getServiceClass: action.data,};case GET_SERVICE_SUBJECT_SUCCESS:return {...state,getServiceSubject: action.data,};default:return state;} };

store

數據倉庫

import { createStore } from 'redux' import todoApp from './reducers' //創建store倉庫 const store = createStore(todoApp) //createStore方法還可以接受第二個參數(),表示 State 的最初狀態。這通常是服務器給出的(window.STATE_FROM_SERVER就是整個應用的狀態初始值) const store = createStore(todoApp, window.STATE_FROM_SERVER)//引入action import {addTodo,toggleTodo,setVisibilityFilter,VisibilityFilters } from './actions'//打印當前狀態 console.log(store.getState())// 訂閱state變化 // subscribe()方法返回一個函數用于取消監聽 const unsubscribe = store.subscribe(() => console.log(store.getState()))// 發出一些action store.dispatch(addTodo('Learn about actions')) store.dispatch(addTodo('Learn about reducers')) store.dispatch(addTodo('Learn about store')) store.dispatch(toggleTodo(0)) store.dispatch(toggleTodo(1)) store.dispatch(setVisibilityFilter(VisibilityFilters.SHOW_COMPLETED))//取消監聽狀態更新 unsubscribe()

配置中間件

import { createStore } from 'redux' import reducer from '../reducer/index' import thunk from 'redux-thunk' import promise from 'redux-promise' import logger from 'redux-logger'const store = createStore(reducer,applyMiddleware(thunk, promise, logger) );

redux-thunk

store.dispatch()只能傳入一個action對象,redux-thunk中間件則將其擴展為一個方法

//配置 import { createStore } from 'redux' import reducer from '../reducer/index' import thunk from 'redux-thunk'const store = createStore(reducer,applyMiddleware(thunk) );//使用 export function getDocMenu(query='') {return async(dispatch) => {try {const data = (await axios(`${baseUrl}doc.do?${Qs.stringify(query)}`)).data;//這里的dispatch相當于store.dispatchdispatch({type: GET_PRODUCT_DOCUMENT_SUCCESS,data: data})}catch(error){dispatch({type: GET_PRODUCT_DOCUMENT_FAILURE,error: new Error('獲取文檔菜單失敗')})}} }

redux-saga

解決異步的另一種方法

//配置 import { createStore, applyMiddleware } from 'redux' import createSagaMiddleware from 'redux-saga'import reducer from './reducers' import mySaga from './sagas'// create the saga middleware const sagaMiddleware = createSagaMiddleware() // mount it on the Store const store = createStore(reducer,applyMiddleware(sagaMiddleware) )// then run the saga sagaMiddleware.run(mySaga)//使用 // action creators export function GET_USERS(users) {return { type: RECEIVE_USERS, data } }export function GET_ERROR(error) {return { type: FETCH_USERS_ERROR, data } }export function Begin_GET_POSTS() {return { type: BEGIN_GET_POSTS } }//saga.js import { takeEvery } from 'redux-saga'; import { call, put } from 'redux-saga/effects'; import axios from 'axios'; import { BEGIN_GET_POSTS, GET_POSTS, GET_POSTS_ERROR } from '../reducers';// worker saga function* showPostsAsync(action) {try {const response = yield call(axios.get, 'https://jsonplaceholder.typicode.com/posts');yield put({type: GET_POSTS,data: response.data});} catch(e) {yield put({type: GET_ERROR,error: new Error('some error')});} }// wacther saga function* watchGetPosts() {yield takeEvery(BEGIN_GET_POSTS, showPostsAsync); }// root saga export default function* rootSaga() {yield watchGetPosts() } //user.jscomponentWillMount() {this.props.dispatch(Begin_GET_POSTS()); }

轉載于:https://www.cnblogs.com/Lazy-Cat/p/11406304.html

總結

以上是生活随笔為你收集整理的Redux概览的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: av中文字幕免费观看 | 日本一级淫片色费放 | 日本一区二区欧美 | 啪啪.com| 人妻无码一区二区三区 | 成人日韩在线 | 波多野结衣中文一区 | 我和我的太阳泰剧在线观看泰剧 | 男人的天堂av网站 | avtt久久| 黄页网站免费在线观看 | 国产乱子伦一区二区 | 羞羞动漫免费观看 | 动漫涩涩免费网站在线看 | 色原网 | 琪琪电影午夜理论片八戒八戒 | 欧美日韩一区二区三区在线 | 中文字幕免 | 香蕉视频在线观看免费 | 少妇粉嫩小泬喷水视频www | 国产精品波多野结衣 | 日韩精品一二三区 | 欧美情趣视频 | 一级性生活大片 | 免费激情片 | 激情四射av| 美女扒开内裤让男人桶 | 日韩视频中文字幕在线观看 | 亚洲精品成a人在线观看 | 精品人妻伦一二三区久 | 欧美一性一乱一交一视频 | 日不卡 | 亚州国产 | 亚洲激情婷婷 | 久久午夜剧场 | 中文字幕蜜臀 | 亚洲国产精品成人无码区 | 国产真实交换夫妇视频 | 久久久久婷婷 | 久久接色 | 成人免费黄色 | 亚洲免费福利视频 | 天堂在线免费观看视频 | 欧美福利一区 | 色狠狠干 | 亚洲欧美一区二区在线观看 | 日韩草逼视频 | 亚洲人体一区 | 国产偷国产偷av亚洲清高 | 中国国语农村大片 | 国产日韩精品中文字无码 | 天天摸天天碰 | 亚洲草逼视频 | 人人草网站 | 特级西西人体444www高清 | 日本黄色三级 | 亚洲第一成网站 | av手机在线看 | 午夜激情在线观看视频 | 亚洲国产精品国自产拍久久 | 国产女女做受ⅹxx高潮 | 欧美丝袜脚交 | 性囗交免费视频观看 | 成人av免费在线播放 | 黄色同人网站 | 午夜亚洲av永久无码精品 | 久久99综合 | 欧美亚洲精品一区二区 | 杨幂毛片| 在线看成人片 | 色婷婷av一区二区三区在线观看 | 一二三四国产精品 | 成年人免费在线视频 | 成人一级生活片 | 婷婷成人av | 欧美日本在线观看 | 老熟女重囗味hdxx69 | 国产xx在线观看 | 国产精品久久毛片av大全日韩 | 亚洲网站在线免费观看 | 精品国模一区二区三区 | 亚洲丝袜在线视频 | 日本一级一片免费视频 | 国产欧美在线播放 | 麻豆精品av | 色激情网 | 久久久久久免费 | 亚洲逼 | 天堂影视av | 久久久久久久久久久久久久久 | 羞羞影院体验区 | 国产九九在线 | 亚洲av无码国产精品永久一区 | 亚洲国产果冻传媒av在线观看 | 亚洲一区二区三区麻豆 | 国产欧美成人 | 朋友人妻少妇精品系列 | 亚洲资源在线播放 | 91一二区 |