Table of Contents
Last time we talked about using Redux for state management. This time we use Redux-saga to manage Redux application asynchronous operations
- First, let’s take a look at the logged-in Reducer
Next, let’s implement this process
Redux-saga uses Generator function to implement
If we allow multiple loginUserAsync instances to start at the same time. At a certain moment, we can start a new loginUserAsync task, even though one or more previous loginUserAsync tasks have not yet completed. We can use the takeEvery helper function.
Redux-saga detailed api documentation
Home Web Front-end JS Tutorial Detailed explanation of examples of React practical projects (3)

Detailed explanation of examples of React practical projects (3)

Jul 24, 2017 pm 03:58 PM
react practice project

React has nearly 70,000 stars on Github and is currently the most popular front-end framework. I have been learning React for a while, and now I am starting to practice it with React+Redux!

Last time we talked about using Redux for state management. This time we use Redux-saga to manage Redux application asynchronous operations

React Practice Project (1)

React Practice Project (2)

React Practice Project (3)

- First, let’s take a look at the logged-in Reducer

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
  }
};
Copy after login

Sagas to monitor the action initiated, and then decide What to do based on this action: whether to initiate an asynchronous call (such as an Ajax request), initiate other actions to the Store, or even call other Sagas.

Specifically, this login function will issue a LOGIN_USER action when we click on the login pop-up window. Sagas monitors the LOGIN_USER action and initiates an Ajax request to the background. , decide to initiate LOGIN_USER_SUCCESSaction or LOGIN_USER_FAILUREaction

based on the result

  • Next, let’s implement this process

Create Saga Middleware connects to Redux store

Add redux-saga dependency in package.json

"redux-saga": "^ 0.15.4"

Modify

src/redux/store/store.js
  • /**
     * 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;
    Copy after login

    Redux-saga uses Generator function to implement

Listening action

Create src/redux/sagas/sagas.js

/**
 * 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)
  ];
}
Copy after login

We can see that two actions are monitored in rootSaga: login and register.

    In the above example, takeLatest only allows one loginUserAsync task to be executed. And this task is the last one to be started. If there is already a task being executed before, the previous task will be automatically canceled.
  • If we allow multiple loginUserAsync instances to start at the same time. At a certain moment, we can start a new loginUserAsync task, even though one or more previous loginUserAsync tasks have not yet completed. We can use the takeEvery helper function.

  • Initiate an Ajax request

Get the data on Store state

  • selectors.js

    /**
     * Created by Yuicon on 2017/6/28.
     */
    export const getAuth = state => state.auth;
    Copy after login

api

  • api.js

    /**
     * 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));
    };
    Copy after login

Create src/redux/sagas/users. js

/**
 * 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));
  }
}
Copy after login
select(selector, ...args)
Used to obtain data on Store stateput(action) Initiate an action to the Store

call(fn, ...args)
    Call the fn function with args as the parameter. If the result is a Promise, the middleware will pause until the Promise is resolved. After resolution, the Generator will continue to be executed. Or until the Promise is rejected, in which case an error will be thrown in the Generator.
  • Redux-saga detailed api documentation

Conclusion

###I use Redux-Thunk at work, Redux- Thunk is relatively easier to implement and maintain. But for complex operations, especially when faced with complex asynchronous operations, Redux-saga has more advantages. At this point we have completed an introductory tutorial for Redux-saga. Redux-saga still has many wonderful things, #########

The above is the detailed content of Detailed explanation of examples of React practical projects (3). For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Can AI conquer Fermat's last theorem? Mathematician gave up 5 years of his career to turn 100 pages of proof into code Can AI conquer Fermat's last theorem? Mathematician gave up 5 years of his career to turn 100 pages of proof into code Apr 09, 2024 pm 03:20 PM

Fermat's last theorem, about to be conquered by AI? And the most meaningful part of the whole thing is that Fermat’s Last Theorem, which AI is about to solve, is precisely to prove that AI is useless. Once upon a time, mathematics belonged to the realm of pure human intelligence; now, this territory is being deciphered and trampled by advanced algorithms. Image Fermat's Last Theorem is a "notorious" puzzle that has puzzled mathematicians for centuries. It was proven in 1993, and now mathematicians have a big plan: to recreate the proof using computers. They hope that any logical errors in this version of the proof can be checked by a computer. Project address: https://github.com/riccardobrasca/flt

A closer look at PyCharm: a quick way to delete projects A closer look at PyCharm: a quick way to delete projects Feb 26, 2024 pm 04:21 PM

Title: Learn more about PyCharm: An efficient way to delete projects. In recent years, Python, as a powerful and flexible programming language, has been favored by more and more developers. In the development of Python projects, it is crucial to choose an efficient integrated development environment. As a powerful integrated development environment, PyCharm provides Python developers with many convenient functions and tools, including deleting project directories quickly and efficiently. The following will focus on how to use delete in PyCharm

How to stop Outlook from automatically adding events to my calendar How to stop Outlook from automatically adding events to my calendar Feb 26, 2024 am 09:49 AM

As an email manager application, Microsoft Outlook allows us to schedule events and appointments. It enables us to stay organized by providing tools to create, manage and track these activities (also called events) in the Outlook application. However, sometimes unwanted events are added to the calendar in Outlook, which creates confusion for users and spams the calendar. In this article, we will explore various scenarios and steps that can help us prevent Outlook from automatically adding events to my calendar. Outlook Events – A brief overview Outlook events serve multiple purposes and have many useful features as follows: Calendar Integration: In Outlook

PHP, Vue and React: How to choose the most suitable front-end framework? PHP, Vue and React: How to choose the most suitable front-end framework? Mar 15, 2024 pm 05:48 PM

PHP, Vue and React: How to choose the most suitable front-end framework? With the continuous development of Internet technology, front-end frameworks play a vital role in Web development. PHP, Vue and React are three representative front-end frameworks, each with its own unique characteristics and advantages. When choosing which front-end framework to use, developers need to make an informed decision based on project needs, team skills, and personal preferences. This article will compare the characteristics and uses of the three front-end frameworks PHP, Vue and React.

Dreamweaver CMS station group practice sharing Dreamweaver CMS station group practice sharing Mar 18, 2024 am 10:18 AM

Dream Weaver CMS Station Group Practice Sharing In recent years, with the rapid development of the Internet, website construction has become more and more important. When building multiple websites, site group technology has become a very effective method. Among the many website construction tools, Dreamweaver CMS has become the first choice of many website enthusiasts due to its flexibility and ease of use. This article will share some practical experience about Dreamweaver CMS station group, as well as some specific code examples, hoping to provide some help to readers who are exploring station group technology. 1. What is Dreamweaver CMS station group? Dream Weaver CMS

Integration of Java framework and front-end React framework Integration of Java framework and front-end React framework Jun 01, 2024 pm 03:16 PM

Integration of Java framework and React framework: Steps: Set up the back-end Java framework. Create project structure. Configure build tools. Create React applications. Write REST API endpoints. Configure the communication mechanism. Practical case (SpringBoot+React): Java code: Define RESTfulAPI controller. React code: Get and display the data returned by the API.

PHP Coding Practices: Refusing Alternatives to Goto Statements PHP Coding Practices: Refusing Alternatives to Goto Statements Mar 28, 2024 pm 09:24 PM

PHP Coding Practices: Refusal to Use Alternatives to Goto Statements In recent years, with the continuous updating and iteration of programming languages, programmers have begun to pay more attention to coding specifications and best practices. In PHP programming, the goto statement has existed as a control flow statement for a long time, but in practical applications it often leads to a decrease in the readability and maintainability of the code. This article will share some alternatives to help developers refuse to use goto statements and improve code quality. 1. Why refuse to use goto statement? First, let's think about why

Best Practices for Traffic Management with Golang Best Practices for Traffic Management with Golang Mar 07, 2024 am 08:27 AM

Golang is a powerful and efficient programming language that is widely used to build web services and applications. In network services, traffic management is a crucial part. It can help us control and optimize data transmission on the network and ensure the stability and performance of services. This article will introduce the best practices for traffic management using Golang and provide specific code examples. 1. Use Golang’s net package for basic traffic management. Golang’s net package provides a way to handle network data.

See all articles