Jadual Kandungan
上回说到使用Redux进行状态管理,这次我们使用Redux-saga 管理 Redux 应用异步操作
- 首先我们来看看登陆的 Reducer
创建 Saga middleware 连接至 Redux store
监听 action
发起一个 Ajax 请求
结语
Rumah hujung hadapan web tutorial js 关于React 实践项目的示例详解 (三)

关于React 实践项目的示例详解 (三)

Jul 24, 2017 pm 03:58 PM
react berlatih projek

React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架。而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战!

上回说到使用Redux进行状态管理,这次我们使用Redux-saga 管理 Redux 应用异步操作

React 实践项目 (一)

React 实践项目 (二)

React 实践项目 (三)

- 首先我们来看看登陆的 Reducer

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

export const auth = (state = initialState, action = {}) => {

  switch (action.type) {

    case LOGIN_USER:

      return state.merge({

        'user': action.data,

        'error': null,

        'token': null,

      });

    case LOGIN_USER_SUCCESS:

      return state.merge({

        'token': action.data,

        'error': null

      });

    case LOGIN_USER_FAILURE:

      return state.merge({

        'token': null,

        'error': action.data

      });

    default:

      return state

  }

};

Salin selepas log masuk

Sagas 监听发起的 action,然后决定基于这个 action 来做什么:是发起一个异步调用(比如一个 Ajax 请求),还是发起其他的 action 到 Store,甚至是调用其他的 Sagas。

具体到这个登陆功能就是我们在登陆弹窗点击登陆时会发出一个 LOGIN_USER action,Sagas 监听到 LOGIN_USER action,发起一个 Ajax 请求到后台,根据结果决定发起 LOGIN_USER_SUCCESSaction 还是LOGIN_USER_FAILUREaction

接下来,我们来实现这个流程

  • 创建 Saga middleware 连接至 Redux store

在 package.json 中添加 redux-saga 依赖

"redux-saga": "^0.15.4"

修改 src/redux/store/store.js

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

/**

 * Created by Yuicon on 2017/6/27.

 */

import {createStore, applyMiddleware } from 'redux';

import createSagaMiddleware from 'redux-saga'

import reducer from '../reducer/reducer';

 

import rootSaga from '../sagas/sagas';

 

const sagaMiddleware = createSagaMiddleware();

 

const store = createStore(

  reducer,

  applyMiddleware(sagaMiddleware)

);

 

sagaMiddleware.run(rootSaga);

 

export default store;

Salin selepas log masuk

Redux-saga 使用 Generator 函数实现

  • 监听 action

创建 src/redux/sagas/sagas.js

1

2

3

4

5

6

7

8

9

10

11

12

13

/**

 * Created by Yuicon on 2017/6/28.

 */

import { takeLatest } from 'redux-saga/effects';

import {registerUserAsync, loginUserAsync} from './users';

import {REGISTER_USER, LOGIN_USER} from '../action/users';

 

export default function* rootSaga() {

  yield [

    takeLatest(REGISTER_USER, registerUserAsync),

    takeLatest(LOGIN_USER, loginUserAsync)

  ];

}

Salin selepas log masuk

我们可以看到在 rootSaga 中监听了两个 action 登陆和注册 。

在上面的例子中,takeLatest 只允许执行一个 loginUserAsync 任务。并且这个任务是最后被启动的那个。 如果之前已经有一个任务在执行,那之前的这个任务会自动被取消。

如果我们允许多个 loginUserAsync 实例同时启动。在某个特定时刻,我们可以启动一个新 loginUserAsync 任务, 尽管之前还有一个或多个 loginUserAsync 尚未结束。我们可以使用 takeEvery 辅助函数。

  • 发起一个 Ajax 请求

  • 获取 Store state 上的数据

selectors.js

1

2

3

4

/**

 * Created by Yuicon on 2017/6/28.

 */

export const getAuth = state => state.auth;

Salin selepas log masuk
  • api

api.js

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

/**

 * Created by Yuicon on 2017/7/4.

 *

 */

 

/**

 * 这是我自己的后台服务器,用 Java 实现

 * 项目地址:

 * 文档:http://139.224.135.86:8080/swagger-ui.html#/

 */

const getURL = (url) => `http://139.224.135.86:8080/${url}`;

 

export const login = (user) => {

  return fetch(getURL("auth/login"), {

    method: 'POST',

    headers: {

      'Content-Type': 'application/json'

    },

    body: JSON.stringify(user)

  }).then(response => response.json())

    .then(json => {

      return json;

    })

    .catch(ex => console.log('parsing failed', ex));

};

Salin selepas log masuk
  • 创建 src/redux/sagas/users.js

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

/**

 * Created by Yuicon on 2017/6/30.

 */

import {select, put, call} from 'redux-saga/effects';

import {getAuth, getUsers} from './selectors';

import {loginSuccessAction, loginFailureAction, registerSuccessAction, registerFailureAction} from '../action/users';

import {login, register} from './api';

import 'whatwg-fetch';

 

export function* loginUserAsync() {

  // 获取Store state 上的数据

  const auth = yield select(getAuth);

  const user = auth.get('user');

  // 发起 ajax 请求

  const json = yield call(login.bind(this, user), 'login');

  if (json.success) {

    localStorage.setItem('token', json.data);

    // 发起 loginSuccessAction

    yield put(loginSuccessAction(json.data));

  } else {

    // 发起 loginFailureAction

    yield put(loginFailureAction(json.error));

  }

}

Salin selepas log masuk

select(selector, ...args) 用于获取Store state 上的数据
put(action) 发起一个 action 到 Store
call(fn, ...args) 调用 fn 函数并以 args 为参数,如果结果是一个 Promise,middleware 会暂停直到这个 Promise 被 resolve,resolve 后 Generator 会继续执行。 或者直到 Promise 被 reject 了,如果是这种情况,将在 Generator 中抛出一个错误。

Redux-saga 详细api文档

  • 结语

我在工作时用的是 Redux-Thunk, Redux-Thunk 相对来说更容易实现和维护。但是对于复杂的操作,尤其是面对复杂异步操作时,Redux-saga 更有优势。到此我们完成了一个 Redux-saga 的入门教程,Redux-saga 还有很多奇妙的地方,

Atas ialah kandungan terperinci 关于React 实践项目的示例详解 (三). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bolehkah AI menakluki teorem terakhir Fermat? Ahli matematik melepaskan 5 tahun kerjayanya untuk mengubah 100 halaman bukti menjadi kod Bolehkah AI menakluki teorem terakhir Fermat? Ahli matematik melepaskan 5 tahun kerjayanya untuk mengubah 100 halaman bukti menjadi kod Apr 09, 2024 pm 03:20 PM

Teorem terakhir Fermat, akan ditakluki oleh AI? Dan bahagian yang paling bermakna dari keseluruhannya ialah Teorem Terakhir Fermat, yang akan diselesaikan oleh AI, dengan tepat untuk membuktikan bahawa AI tidak berguna. Suatu ketika dahulu, matematik tergolong dalam alam kecerdasan manusia yang tulen kini, wilayah ini dihuraikan dan diinjak oleh algoritma canggih. Imej Teorem Terakhir Fermat ialah teka-teki "terkenal" yang telah membingungkan ahli matematik selama berabad-abad. Ia telah terbukti pada tahun 1993, dan kini ahli matematik mempunyai rancangan besar: untuk mencipta semula bukti menggunakan komputer. Mereka berharap bahawa sebarang ralat logik dalam versi bukti ini boleh disemak oleh komputer. Alamat projek: https://github.com/riccardobrasca/flt

PHP, Vue dan React: Bagaimana untuk memilih rangka kerja bahagian hadapan yang paling sesuai? PHP, Vue dan React: Bagaimana untuk memilih rangka kerja bahagian hadapan yang paling sesuai? Mar 15, 2024 pm 05:48 PM

PHP, Vue dan React: Bagaimana untuk memilih rangka kerja bahagian hadapan yang paling sesuai? Dengan pembangunan berterusan teknologi Internet, rangka kerja bahagian hadapan memainkan peranan penting dalam pembangunan Web. PHP, Vue dan React ialah tiga rangka kerja bahagian hadapan yang mewakili, masing-masing mempunyai ciri dan kelebihan tersendiri. Apabila memilih rangka kerja bahagian hadapan yang hendak digunakan, pembangun perlu membuat keputusan termaklum berdasarkan keperluan projek, kemahiran pasukan dan pilihan peribadi. Artikel ini akan membandingkan ciri dan penggunaan tiga rangka kerja bahagian hadapan PHP, Vue dan React.

Perkongsian amalan kumpulan stesen CMS Dreamweaver Perkongsian amalan kumpulan stesen CMS Dreamweaver Mar 18, 2024 am 10:18 AM

Perkongsian Amalan Kumpulan Dream Weaver CMS Station Dalam beberapa tahun kebelakangan ini, dengan perkembangan pesat Internet, pembinaan laman web menjadi semakin penting. Apabila membina berbilang tapak web, teknologi kumpulan tapak telah menjadi kaedah yang sangat berkesan. Di antara banyak alat pembinaan laman web, Dreamweaver CMS telah menjadi pilihan pertama ramai peminat laman web kerana fleksibiliti dan kemudahan penggunaannya. Artikel ini akan berkongsi beberapa pengalaman praktikal tentang kumpulan stesen CMS Dreamweaver, serta beberapa contoh kod khusus, dengan harapan dapat memberikan sedikit bantuan kepada pembaca yang meneroka teknologi kumpulan stesen. 1. Apakah kumpulan stesen Dreamweaver CMS? CMS Penenun Impian

Amalan Pengekodan PHP: Menolak Alternatif kepada Penyata Goto Amalan Pengekodan PHP: Menolak Alternatif kepada Penyata Goto Mar 28, 2024 pm 09:24 PM

Amalan Pengekodan PHP: Keengganan Menggunakan Alternatif untuk Mendapatkan Pernyataan Dalam beberapa tahun kebelakangan ini, dengan pengemaskinian dan lelaran berterusan bahasa pengaturcaraan, pengaturcara telah mula memberi lebih perhatian kepada spesifikasi pengekodan dan amalan terbaik. Dalam pengaturcaraan PHP, pernyataan goto telah wujud sebagai pernyataan aliran kawalan untuk masa yang lama, tetapi dalam aplikasi praktikal ia sering membawa kepada penurunan kebolehbacaan dan kebolehselenggaraan kod. Artikel ini akan berkongsi beberapa alternatif untuk membantu pembangun enggan menggunakan pernyataan goto dan meningkatkan kualiti kod. 1. Mengapa enggan menggunakan pernyataan goto? Pertama, mari kita fikirkan mengapa

Penyepaduan rangka kerja Java dan rangka kerja React bahagian hadapan Penyepaduan rangka kerja Java dan rangka kerja React bahagian hadapan Jun 01, 2024 pm 03:16 PM

Penyepaduan rangka kerja Java dan rangka kerja React: Langkah: Sediakan rangka kerja Java bahagian belakang. Buat struktur projek. Konfigurasikan alat binaan. Buat aplikasi React. Tulis titik akhir REST API. Konfigurasikan mekanisme komunikasi. Kes praktikal (SpringBoot+React): Kod Java: Tentukan pengawal RESTfulAPI. Kod tindak balas: Dapatkan dan paparkan data yang dikembalikan oleh API.

Amalan Terbaik untuk Pengurusan Trafik dengan Golang Amalan Terbaik untuk Pengurusan Trafik dengan Golang Mar 07, 2024 am 08:27 AM

Golang ialah bahasa pengaturcaraan yang berkuasa dan cekap yang digunakan secara meluas untuk membina perkhidmatan dan aplikasi web. Dalam perkhidmatan rangkaian, pengurusan trafik adalah bahagian penting Ia boleh membantu kami mengawal dan mengoptimumkan penghantaran data pada rangkaian dan memastikan kestabilan dan prestasi perkhidmatan. Artikel ini akan memperkenalkan amalan terbaik untuk pengurusan trafik menggunakan Golang dan memberikan contoh kod khusus. 1. Gunakan pakej bersih Golang untuk pengurusan trafik asas Pakej bersih Golang menyediakan cara untuk mengendalikan data rangkaian.

Amalan terbaik untuk menggunakan Golang untuk melaksanakan lompatan halaman Amalan terbaik untuk menggunakan Golang untuk melaksanakan lompatan halaman Mar 05, 2024 pm 01:18 PM

Amalan terbaik untuk menggunakan Golang untuk melaksanakan lompatan halaman Apabila membangunkan aplikasi web, lompatan halaman adalah keperluan fungsian biasa. Di Golang, kita boleh menggunakan beberapa perpustakaan untuk melaksanakan lompatan halaman, seperti menggunakan rangka kerja Gin untuk mengendalikan penghalaan dan lompatan halaman. Artikel ini akan memperkenalkan amalan terbaik tentang cara melaksanakan lonjakan halaman di Golang dan memberikan contoh kod khusus. Pengenalan kepada rangka kerja Gin Gin ialah rangka kerja web yang ditulis dalam bahasa Go, yang berkuasa dan mudah digunakan.

Vue.js vs React: Pertimbangan khusus projek Vue.js vs React: Pertimbangan khusus projek Apr 09, 2025 am 12:01 AM

Vue.js sesuai untuk projek kecil dan sederhana dan lelaran yang cepat, sementara React sesuai untuk aplikasi besar dan kompleks. 1) Vue.js mudah digunakan dan sesuai untuk situasi di mana pasukan tidak mencukupi atau skala projek kecil. 2) React mempunyai ekosistem yang lebih kaya dan sesuai untuk projek dengan prestasi tinggi dan keperluan fungsional yang kompleks.

See all articles