账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    redux中fetch的使用
    42
    0

    看到一个项目中引入的是 import fetch from 'isomorphic-fetch';

    然后在定义action—type时,写的:

    export const FETCH_RUNS = 'FETCH_RUNS';
    export const FETCH_RUNS_PENDING = 'FETCH_RUNS_PENDING';
    export const FETCH_RUNS_FULFILLED = 'FETCH_RUNS_FULFILLED';
    export const FETCH_RUNS_REJECTED = 'FETCH_RUNS_REJECTED';

    加了三种状态pending,fulfilled,rejected

    action中只写了type: FETCH_RUNS的:

    import {fetchRuns} from '../../services/RunService';
    const fetchRunsAction = (req) => ({
      type: FETCH_RUNS,
      payload: fetchRuns(req)
    });
    export {
      fetchRunsAction as fetchRuns
    }

    而在reducer中对三种状态的action都做了处理:

    import {
      FETCH_RUNS_FULFILLED,
      FETCH_RUNS_PENDING,
      FETCH_RUNS_REJECTED
    } from '../actions/runActions';
    
    
    // INITIALIZE STATE
    
    const initialState = {
      runs: null,
      fetched: false,
      fetching: false,
      failed: false
    };
    
    
    // REDUCER
    
    export const FetchRunsReducer = (state = initialState, action) => {
      switch (action.type) {
        case FETCH_RUNS_PENDING:
          return {
            ...state,
            fetching: true,
            fetched: false,
            failed: false
          };
        case FETCH_RUNS_FULFILLED:
          return {
            ...state,
            runs: action.payload,
            fetching: false,
            fetched: true,
            failed: false
          };
        case FETCH_RUNS_REJECTED:
          return {
            ...state,
            runs: null,
            fetching: false,
            fetched: false,
            failed: true
          };
        default:
          return state;
      }
    };

    在组件中:

    ...
    const mapStateToProps = state => {
      const {fetched, fetching, runs} = state.runs;
    
      return {
        fetched,
        fetching,
        runs
      };
    };
    
    const mapDispatchToProps = dispatch => {
      return bindActionCreators({fetchRuns}, dispatch);
    };

    再贴一下RunService中代码

    import {fetchJSON} from '../utils/Fetch';
    
    // SERVICES
    
    export const fetchRuns = fetchJSON('/run/list');

    Fetch中代码:

    import fetch from 'isomorphic-fetch';
    
    // INITIALIZATION
    
    export const baseURL = '';
    const defaultConfig = {
      ...
    };
    
    // SERVICES
    
    export const fetchJSON = (route, patchConfig, target) => (params) => {
      const body = JSON.stringify(params || {});
      const config = { ...defaultConfig, ...(patchConfig || {}) };
      const data = config.method === 'POST' ? {...config, body} : config;
      const url = (target || baseURL) + route;
      return new Promise((resolve, reject) => {
        fetch(url, data).then((response) => {
          if (!response.ok) {
            reject(response);
          } else {
            return response.json();
          }
        }).then(json => {
          if (json.success) {
            resolve(json.result);
          } else {
            reject(json);
          }
        }).catch(error => {
          return reject(error);
        });
      });
    };

    现在我的疑惑点在——什么时候触发了FETCH_RUNS_PENDING,FETCH_RUNS_FULFILLED,FETCH_RUNS_REJECTED这三个状态;在promise是有三个状态,自动触发,但是程序如何跳到代码中写的这三个action名字FETCH_RUNS_PENDING,FETCH_RUNS_FULFILLED,FETCH_RUNS_REJECTED;我想是不是某个封装的地方给action名字自动后面添加了PENDING、FULFILLED,REJECTED然后在触发此action的时候后自动触发这几个状态的action。那么请问在哪个里面进行了封装呢?代码中没有找到啊,是不是react,redux某个里面封装的?求助

    1
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • 在Redux中,fetch是一个用于从服务器获取数据的库。它提供了一个异步API,可以用来发送HTTP请求。

      以下是一个使用fetch获取数据的基本示例:

      ```javascript import { createStore, applyMiddleware } from 'redux'; import thunk from 'redux-thunk'; import fetch from 'redux-thunk/fetch';

      // 创建store const store = createStore( rootReducer, applyMiddleware(thunk) );

      // 使用fetch获取数据 const data = fetch('https://api.example.com/data') .then(response => response.json()) .then(data => { // 打印数据 console.log(data); }) .catch(error => { // 处理错误 console.error(error); }); ```

      在这个示例中,我们首先导入了fetch库,然后创建了一个Redux store。然后,我们使用fetch API从服务器获取数据,并将数据转换为JSON格式。最后,我们打印出获取的数据。

      注意,fetch API是异步的,所以我们在回调函数中使用then来处理数据。如果数据无法获取,我们将使用catch来处理错误。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部